From ace37fbec2c72c21aad25e281e2ffd8148932382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Sat, 21 Mar 2026 18:40:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=99=BE=E5=BA=A6=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skills/baidu-search/SKILL.md | 52 +++++++++++++ skills/baidu-search/_meta.json | 6 ++ skills/baidu-search/scripts/search.py | 102 ++++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 skills/baidu-search/SKILL.md create mode 100644 skills/baidu-search/_meta.json create mode 100644 skills/baidu-search/scripts/search.py diff --git a/skills/baidu-search/SKILL.md b/skills/baidu-search/SKILL.md new file mode 100644 index 0000000..98627de --- /dev/null +++ b/skills/baidu-search/SKILL.md @@ -0,0 +1,52 @@ +--- +name: baidu-search +description: Search the web using Baidu AI Search Engine (BDSE). Use for live information, documentation, or research topics. +metadata: { "openclaw": { "emoji": "🔍︎", "requires": { "bins": ["python3"], "env":["BAIDU_API_KEY"]},"primaryEnv":"BAIDU_API_KEY" } } +--- + +# Baidu Search + +Search the web via Baidu AI Search API. + +## Usage + +```bash +python3 skills/baidu-search/scripts/search.py '' +``` + +## Request Parameters + +| Param | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| query | str | yes | - | Search query | +| count | int | no | 10 | Number of results to return, range 1-50 | +| freshness | str | no | Null | Time range, two formats: format one is ”YYYY-MM-DDtoYYYY-MM-DD“, and format two includes pd, pw, pm, and py, representing the past 24 hours, past 7 days, past 31 days, and past 365 days respectively | + +## Examples + +```bash +# Basic search +python3 scripts/search.py '{"query":"人工智能"}' + +# Freshness first format "YYYY-MM-DDtoYYYY-MM-DD" example +python3 scripts/search.py '{ + "query":"最新新闻", + "freshness":"2025-09-01to2025-09-08" +}' + +# Freshness second format pd、pw、pm、py example +python3 scripts/search.py '{ + "query":"最新新闻", + "freshness":"pd" +}' + +# set count, the number of results to return +python3 scripts/search.py '{ + "query":"旅游景点", + "count": 20, +}' +``` + +## Current Status + +Fully functional. diff --git a/skills/baidu-search/_meta.json b/skills/baidu-search/_meta.json new file mode 100644 index 0000000..cd5ea5f --- /dev/null +++ b/skills/baidu-search/_meta.json @@ -0,0 +1,6 @@ +{ + "ownerId": "kn7akgt520t01vgs2tzx7yk6m180kt26", + "slug": "baidu-search", + "version": "1.1.2", + "publishedAt": 1773394754557 +} \ No newline at end of file diff --git a/skills/baidu-search/scripts/search.py b/skills/baidu-search/scripts/search.py new file mode 100644 index 0000000..2d243f3 --- /dev/null +++ b/skills/baidu-search/scripts/search.py @@ -0,0 +1,102 @@ +import sys +import json +import requests +import os +import re +from datetime import datetime, timedelta + + +def baidu_search(api_key, requestBody: dict): + url = "https://qianfan.baidubce.com/v2/ai_search/web_search" + + headers = { + "Authorization": "Bearer %s" % api_key, + "X-Appbuilder-From": "openclaw", + "Content-Type": "application/json" + } + + # 使用POST方法发送JSON数据 + response = requests.post(url, json=requestBody, headers=headers) + response.raise_for_status() + results = response.json() + if "code" in results: + raise Exception(results["message"]) + datas = results["references"] + keys_to_remove = {"snippet"} + for item in datas: + for key in keys_to_remove: + if key in item: + del item[key] + return datas + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Usage: python baidu_search.py ") + sys.exit(1) + + query = sys.argv[1] + parse_data = {} + try: + parse_data = json.loads(query) + print(f"success parse request body: {parse_data}") + except json.JSONDecodeError as e: + print(f"JSON parse error: {e}") + + if "query" not in parse_data: + print("Error: query must be present in request body.") + sys.exit(1) + count = 10 + search_filter = {} + if "count" in parse_data: + count = int(parse_data["count"]) + if count <= 0: + count = 10 + elif count > 50: + count = 50 + current_time = datetime.now() + end_date = (current_time + timedelta(days=1)).strftime("%Y-%m-%d") + pattern = r'\d{4}-\d{2}-\d{2}to\d{4}-\d{2}-\d{2}' + if "freshness" in parse_data: + if parse_data["freshness"] in ["pd", "pw", "pm", "py"]: + if parse_data["freshness"] == "pd": + start_date = (current_time - timedelta(days=1)).strftime("%Y-%m-%d") + if parse_data["freshness"] == "pw": + start_date = (current_time - timedelta(days=6)).strftime("%Y-%m-%d") + if parse_data["freshness"] == "pm": + start_date = (current_time - timedelta(days=30)).strftime("%Y-%m-%d") + if parse_data["freshness"] == "py": + start_date = (current_time - timedelta(days=364)).strftime("%Y-%m-%d") + search_filter = {"range": {"page_time": {"gte": start_date, "lt": end_date}}} + elif re.match(pattern, parse_data["freshness"]): + start_date = parse_data["freshness"].split("to")[0] + end_date = parse_data["freshness"].split("to")[1] + search_filter = {"range": {"page_time": {"gte": start_date, "lt": end_date}}} + else: + print(f"Error: freshness ({parse_data['freshness']}) must be pd, pw, pm, py, or match {pattern}.") + sys.exit(1) + + # We will pass these via env vars for security + api_key = os.getenv("BAIDU_API_KEY") + + if not api_key: + print("Error: BAIDU_API_KEY must be set in environment.") + sys.exit(1) + + request_body = { + "messages": [ + { + "content": parse_data["query"], + "role": "user" + } + ], + "search_source": "baidu_search_v2", + "resource_type_filter": [{"type": "web", "top_k": count}], + "search_filter": search_filter + } + try: + results = baidu_search(api_key, request_body) + print(json.dumps(results, indent=2, ensure_ascii=False)) + except Exception as e: + print(f"Error: {str(e)}") + sys.exit(1)