331 lines
8.2 KiB
Markdown
331 lines
8.2 KiB
Markdown
# SearXNG API Skills
|
|
|
|
## 基本信息
|
|
|
|
- **URL**: `https://searxng.erhe.top`
|
|
- **API Token**: `fGWEFWGrgasegtjt1jUJG`
|
|
- **端口**: 通过 Caddy 反向代理
|
|
|
|
## API 调用方法
|
|
|
|
### 1. 搜索 API
|
|
|
|
```bash
|
|
# 基础搜索
|
|
curl "https://searxng.erhe.top/search?q=关键词&token=fGWEFWGrgasegtjt1jUJG"
|
|
|
|
# JSON 格式返回(推荐)
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG"
|
|
```
|
|
|
|
### 2. Python 调用示例
|
|
|
|
```python
|
|
import requests
|
|
import json
|
|
|
|
def search_searxng(query, format_type="json"):
|
|
"""
|
|
使用 SearXNG 搜索
|
|
|
|
参数:
|
|
query: 搜索关键词
|
|
format_type: 返回格式 (json/html/csv/rss)
|
|
|
|
返回:
|
|
dict: 搜索结果
|
|
"""
|
|
url = "https://searxng.erhe.top/search"
|
|
params = {
|
|
"q": query,
|
|
"format": format_type,
|
|
"token": "fGWEFWGrgasegtjt1jUJG"
|
|
}
|
|
|
|
response = requests.get(url, params=params)
|
|
|
|
if format_type == "json":
|
|
return response.json()
|
|
else:
|
|
return response.text
|
|
|
|
# 使用示例
|
|
results = search_searxng("python 教程")
|
|
print(f"找到 {len(results['results'])} 个结果")
|
|
for result in results['results'][:5]:
|
|
print(f"- {result['title']}: {result['url']}")
|
|
```
|
|
|
|
### 3. Claude Code / Agent 调用示例
|
|
|
|
```python
|
|
import urllib.request
|
|
import urllib.parse
|
|
import json
|
|
|
|
def search(query):
|
|
"""搜索函数"""
|
|
base_url = "https://searxng.erhe.top/search"
|
|
params = urllib.parse.urlencode({
|
|
"q": query,
|
|
"format": "json",
|
|
"token": "fGWEFWGrgasegtjt1jUJG"
|
|
})
|
|
|
|
url = f"{base_url}?{params}"
|
|
|
|
with urllib.request.urlopen(url) as response:
|
|
data = json.loads(response.read().decode())
|
|
|
|
return data
|
|
|
|
# Agent 中使用
|
|
results = search("如何在 Linux 中查找文件")
|
|
for r in results['results'][:3]:
|
|
print(f"标题: {r['title']}")
|
|
print(f"链接: {r['url']}\n")
|
|
```
|
|
|
|
## 高级搜索
|
|
|
|
### 1. 指定语言
|
|
|
|
```bash
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG&language=zh"
|
|
```
|
|
|
|
语言代码:
|
|
- `zh` - 中文
|
|
- `en` - 英文
|
|
- `ja` - 日文
|
|
- `de` - 德文
|
|
- `fr` - 法文
|
|
|
|
### 2. 指定分类
|
|
|
|
```bash
|
|
# 图片搜索
|
|
curl "https://searxng.erhe.top/search?q=猫&format=json&token=fGWEFWGrgasegtjt1jUJG&categories=images"
|
|
|
|
# 视频搜索
|
|
curl "https://searxng.erhe.top/search?q=教程&format=json&token=fGWEFWGrgasegtjt1jUJG&categories=videos"
|
|
|
|
# 新闻搜索
|
|
curl "https://searxng.erhe.top/search?q=科技&format=json&token=fGWEFWGrgasegtjt1jUJG&categories=news"
|
|
```
|
|
|
|
分类列表:
|
|
- `general` - 通用
|
|
- `images` - 图片
|
|
- `videos` - 视频
|
|
- `news` - 新闻
|
|
- `music` - 音乐
|
|
- `files` - 文件
|
|
- `it` - IT
|
|
- `science` - 科学
|
|
|
|
### 3. 安全搜索
|
|
|
|
```bash
|
|
# 关闭安全搜索 (0)
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG&safesearch=0"
|
|
|
|
# 适中 (1)
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG&safesearch=1"
|
|
|
|
# 严格 (2)
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG&safesearch=2"
|
|
```
|
|
|
|
### 4. 时间范围
|
|
|
|
```bash
|
|
# 最近一天
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG&time_range=day"
|
|
|
|
# 最近一周
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG&time_range=week"
|
|
|
|
# 最近一月
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG&time_range=month"
|
|
|
|
# 最近一年
|
|
curl "https://searxng.erhe.top/search?q=关键词&format=json&token=fGWEFWGrgasegtjt1jUJG&time_range=year"
|
|
```
|
|
|
|
## JSON 返回格式说明
|
|
|
|
```json
|
|
{
|
|
"query": "搜索关键词",
|
|
"results": [
|
|
{
|
|
"title": "结果标题",
|
|
"url": "https://example.com",
|
|
"content": "结果摘要",
|
|
"engine": "搜索引擎名称",
|
|
"template": "模板类型",
|
|
"publishedDate": "发布日期 (如果有)",
|
|
"img_src": "图片URL (如果有)",
|
|
"thumbnail": "缩略图URL (如果有)",
|
|
"category": "分类"
|
|
}
|
|
],
|
|
"answers": [],
|
|
"corrections": [],
|
|
"infoboxes": [],
|
|
"suggestions": ["建议搜索词"],
|
|
"unresponsive_engines": []
|
|
}
|
|
```
|
|
|
|
## 获取配置信息
|
|
|
|
```bash
|
|
# 获取 SearXNG 配置
|
|
curl "https://searxng.erhe.top/config&token=fGWEFWGrgasegtjt1jUJG"
|
|
```
|
|
|
|
## 完整 Python 示例
|
|
|
|
```python
|
|
#!/usr/bin/env python3
|
|
"""
|
|
SearXNG API 客户端示例
|
|
"""
|
|
|
|
import requests
|
|
import json
|
|
import sys
|
|
|
|
SEARXNG_URL = "https://searxng.erhe.top"
|
|
API_TOKEN = "fGWEFWGrgasegtjt1jUJG"
|
|
|
|
def search(query,
|
|
format_type="json",
|
|
categories=None,
|
|
language="auto",
|
|
safesearch=0,
|
|
time_range=None):
|
|
"""
|
|
搜索函数
|
|
|
|
参数:
|
|
query: 搜索关键词
|
|
format_type: 返回格式 (json/html/csv/rss)
|
|
categories: 分类列表 (images/videos/news/music)
|
|
language: 语言代码 (auto/zh/en/ja/de/fr)
|
|
safesearch: 安全搜索级别 (0/1/2)
|
|
time_range: 时间范围 (day/week/month/year)
|
|
|
|
返回:
|
|
dict: 搜索结果
|
|
"""
|
|
params = {
|
|
"q": query,
|
|
"format": format_type,
|
|
"token": API_TOKEN,
|
|
"language": language,
|
|
"safesearch": safesearch
|
|
}
|
|
|
|
if categories:
|
|
params["categories"] = categories
|
|
|
|
if time_range:
|
|
params["time_range"] = time_range
|
|
|
|
response = requests.get(f"{SEARXNG_URL}/search", params=params)
|
|
|
|
if format_type == "json":
|
|
return response.json()
|
|
else:
|
|
return response.text
|
|
|
|
def format_results(results, max_results=10):
|
|
"""格式化输出结果"""
|
|
print(f"\n{'='*60}")
|
|
print(f"查询: {results.get('query')}")
|
|
print(f"找到 {len(results.get('results', []))} 个结果")
|
|
print(f"{'='*60}\n")
|
|
|
|
for i, result in enumerate(results.get('results', [])[:max_results], 1):
|
|
print(f"{i}. {result.get('title', '无标题')}")
|
|
print(f" 链接: {result.get('url', '无链接')}")
|
|
if result.get('content'):
|
|
content = result.get('content', '')[:150]
|
|
print(f" 摘要: {content}...")
|
|
print(f" 来源: {result.get('engine', '未知')}")
|
|
print()
|
|
|
|
if __name__ == "__main__":
|
|
# 示例搜索
|
|
if len(sys.argv) > 1:
|
|
query = " ".join(sys.argv[1:])
|
|
else:
|
|
query = "Python 编程"
|
|
|
|
try:
|
|
results = search(query, categories="general")
|
|
format_results(results)
|
|
except Exception as e:
|
|
print(f"搜索失败: {e}")
|
|
```
|
|
|
|
## 错误处理
|
|
|
|
```python
|
|
import requests
|
|
|
|
def safe_search(query):
|
|
"""安全的搜索函数,包含错误处理"""
|
|
try:
|
|
response = requests.get(
|
|
"https://searxng.erhe.top/search",
|
|
params={
|
|
"q": query,
|
|
"format": "json",
|
|
"token": "fGWEFWGrgasegtjt1jUJG"
|
|
},
|
|
timeout=10
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
return response.json()
|
|
elif response.status_code == 403:
|
|
return {"error": "API token 无效或缺失"}
|
|
else:
|
|
return {"error": f"请求失败: {response.status_code}"}
|
|
|
|
except requests.exceptions.Timeout:
|
|
return {"error": "请求超时"}
|
|
except requests.exceptions.ConnectionError:
|
|
return {"error": "连接失败,请检查网络"}
|
|
except Exception as e:
|
|
return {"error": str(e)}
|
|
```
|
|
|
|
## 快速参考
|
|
|
|
| 功能 | 命令 |
|
|
|------|------|
|
|
| 基础搜索 | `curl "https://searxng.erhe.top/search?q=关键词&token=fGWEFWGrgasegtjt1jUJG"` |
|
|
| JSON 返回 | 添加 `&format=json` |
|
|
| 图片搜索 | 添加 `&categories=images` |
|
|
| 中文结果 | 添加 `&language=zh` |
|
|
| 最近一周 | 添加 `&time_range=week` |
|
|
| 获取配置 | `curl "https://searxng.erhe.top/config&token=fGWEFWGrgasegtjt1jUJG"` |
|
|
|
|
## 注意事项
|
|
|
|
1. **Token 必须**: 所有 API 请求必须包含 `token` 参数
|
|
2. **返回格式**: 推荐使用 `format=json` 获取结构化数据
|
|
3. **超时处理**: 搜索可能需要几秒钟,建议设置超时
|
|
4. **请求频率**: 避免过于频繁的请求,可能触发限制
|
|
5. **结果数量**: 默认返回多个搜索引擎的结果
|
|
|
|
## 获取帮助
|
|
|
|
- SearXNG 主页: `https://searxng.erhe.top`
|
|
- SearXNG 文档: `https://docs.searxng.org`
|