文件预览

search.py

查看 Firecrawl Search 技能包中的文件内容。

文件内容

scripts/search.py

#!/usr/bin/env python3
"""Firecrawl web search script."""
import argparse
import json
import os
import sys
import urllib.request
from urllib.error import HTTPError


def search(query: str, limit: int = 10):
    """Search the web using Firecrawl."""
    api_key = os.environ.get("FIRECRAWL_API_KEY")
    if not api_key:
        print("Error: FIRECRAWL_API_KEY not set", file=sys.stderr)
        sys.exit(1)
    
    url = "https://api.firecrawl.dev/v1/search"
    
    data = json.dumps({
        "query": query,
        "limit": limit,
        "lang": "en",
        "country": "us"
    }).encode()
    
    req = urllib.request.Request(
        url,
        data=data,
        headers={
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        },
        method="POST"
    )
    
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            result = json.loads(resp.read().decode())
            return result
    except HTTPError as e:
        print(f"Error: {e.code} - {e.reason}", file=sys.stderr)
        print(e.read().decode(), file=sys.stderr)
        sys.exit(1)


def main():
    parser = argparse.ArgumentParser(description="Search the web via Firecrawl")
    parser.add_argument("query", help="Search query")
    parser.add_argument("--limit", type=int, default=10, help="Max results")
    parser.add_argument("--json", action="store_true", help="Output raw JSON")
    
    args = parser.parse_args()
    
    result = search(args.query, args.limit)
    
    if args.json:
        print(json.dumps(result, indent=2))
        return
    
    # Pretty print results
    if result.get("success") and "data" in result:
        for item in result["data"]:
            print(f"\n{'='*60}")
            print(f"Title: {item.get('title', 'N/A')}")
            print(f"URL: {item.get('url', 'N/A')}")
            print(f"Description: {item.get('description', 'N/A')}")
            if "markdown" in item:
                content = item["markdown"][:500] + "..." if len(item["markdown"]) > 500 else item["markdown"]
                print(f"Content preview:\n{content}")
    else:
        print("No results found")
        print(json.dumps(result, indent=2))


if __name__ == "__main__":
    main()