commit 99eefa7ea8bd1465e0d12f0ca9d6dc7c3bc06969 Author: zlei9 Date: Sun Mar 29 09:48:48 2026 +0800 Initial commit with translated description diff --git a/SKILL.md b/SKILL.md new file mode 100644 index 0000000..3ad892d --- /dev/null +++ b/SKILL.md @@ -0,0 +1,63 @@ +--- +name: baidu-search +description: "使用百度AI搜索引擎(BDSE)进行网络搜索。" +metadata: { "openclaw": { "emoji": "🔍︎", "requires": { "bins": ["python3"], "env":["BAIDU_API_KEY"]},"primaryEnv":"BAIDU_API_KEY" } } +--- + +# Baidu Search + +Search the web via Baidu AI Search API. + +## Prerequisites + +### API Key Configuration +This skill requires a **BAIDU_API_KEY** to be configured in OpenClaw. + +If you don't have an API key yet, please visit: +**https://console.bce.baidu.com/ai-search/qianfan/ais/console/apiKey** + +For detailed setup instructions, see: +[references/apikey-fetch.md](references/apikey-fetch.md) + +## 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/_meta.json b/_meta.json new file mode 100644 index 0000000..d3e3a78 --- /dev/null +++ b/_meta.json @@ -0,0 +1,6 @@ +{ + "ownerId": "kn7akgt520t01vgs2tzx7yk6m180kt26", + "slug": "baidu-search", + "version": "1.1.3", + "publishedAt": 1773828934466 +} \ No newline at end of file diff --git a/references/apikey-fetch.md b/references/apikey-fetch.md new file mode 100644 index 0000000..10f41e4 --- /dev/null +++ b/references/apikey-fetch.md @@ -0,0 +1,58 @@ +# Baidu API Key Setup Guide (OpenClaw) + +## BAIDU_API_KEY Not Configured + +When the `BAIDU_API_KEY` environment variable is not set, follow these steps: + +### 1. Get API Key +Visit: **https://console.bce.baidu.com/ai-search/qianfan/ais/console/apiKey** + +- Log in to your Baidu Cloud account +- Create an application or view existing API keys +- Copy your **API Key** (only API Key is needed) + +### 2. Configure OpenClaw +Edit the OpenClaw configuration file: `~/.openclaw/openclaw.json` + +Add or merge the following structure: + +```json +{ + "skills": { + "entries": { + "baidu-search": { + "env": { + "BAIDU_API_KEY": "your_actual_api_key_here" + } + } + } + } +} +``` + +Replace `"your_actual_api_key_here"` with your actual API key. + +### 3. Verify Configuration +```bash +# Check JSON format +cat ~/.openclaw/openclaw.json | python -m json.tool +``` + +### 4. Restart OpenClaw +```bash +openclaw gateway restart +``` + +### 5. Test +```bash +cd ~/.openclaw/workspace/skills/baidu-search +python3 scripts/search.py '{"query": "test search"}' +``` + +## Troubleshooting +- Ensure `~/.openclaw/openclaw.json` exists with correct JSON format +- Confirm API key is valid and Baidu AI Search service is activated +- Check account balance on Baidu Cloud +- Restart OpenClaw after configuration changes + +**Recommended**: Use OpenClaw configuration file for centralized management diff --git a/scripts/search.py b/scripts/search.py new file mode 100644 index 0000000..2d243f3 --- /dev/null +++ b/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)