Initial commit with translated description
This commit is contained in:
457
SKILL.md
Normal file
457
SKILL.md
Normal file
@@ -0,0 +1,457 @@
|
|||||||
|
---
|
||||||
|
name: duckduckgo-search
|
||||||
|
description: 使用DuckDuckGo进行网络搜索以从互联网获取实时信息。当用户需要搜索当前事件、文档、教程或任何需要网络搜索功能的信息时使用。
|
||||||
|
allowed-tools: Bash(duckduckgo-search:*), Bash(python:*), Bash(pip:*), Bash(uv:*)
|
||||||
|
---
|
||||||
|
|
||||||
|
# DuckDuckGo Web Search Skill
|
||||||
|
|
||||||
|
这个技能通过 DuckDuckGo 搜索引擎实现网络搜索功能,帮助获取实时信息。
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
- 🔍 基于 DuckDuckGo 的隐私友好型搜索
|
||||||
|
- 📰 支持新闻搜索
|
||||||
|
- 🖼️ 支持图片搜索
|
||||||
|
- 📹 支持视频搜索
|
||||||
|
- 🌐 无需 API Key,免费使用
|
||||||
|
- 🔒 保护隐私,不追踪用户
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用 uv 安装(推荐)
|
||||||
|
uv pip install duckduckgo-search
|
||||||
|
|
||||||
|
# 或使用 pip 安装
|
||||||
|
pip install duckduckgo-search
|
||||||
|
```
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
### 命令行方式
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 基础文本搜索
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.text('Python tutorial', max_results=5))
|
||||||
|
for r in results:
|
||||||
|
print(f\"标题: {r['title']}\")
|
||||||
|
print(f\"链接: {r['href']}\")
|
||||||
|
print(f\"摘要: {r['body']}\")
|
||||||
|
print('---')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 搜索类型
|
||||||
|
|
||||||
|
### 1. 文本搜索 (Text Search)
|
||||||
|
|
||||||
|
最常用的搜索方式,返回网页结果:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
query = 'your search query'
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.text(
|
||||||
|
query,
|
||||||
|
region='cn-zh', # 地区设置:cn-zh(中国), us-en(美国), wt-wt(全球)
|
||||||
|
safesearch='moderate', # 安全搜索:on, moderate, off
|
||||||
|
timelimit='m', # 时间范围:d(天), w(周), m(月), y(年), None(不限)
|
||||||
|
max_results=10 # 最大结果数
|
||||||
|
))
|
||||||
|
|
||||||
|
for i, r in enumerate(results, 1):
|
||||||
|
print(f\"{i}. {r['title']}\")
|
||||||
|
print(f\" URL: {r['href']}\")
|
||||||
|
print(f\" 摘要: {r['body'][:100]}...\")
|
||||||
|
print()
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 新闻搜索 (News Search)
|
||||||
|
|
||||||
|
搜索最新新闻:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.news(
|
||||||
|
'AI technology',
|
||||||
|
region='wt-wt',
|
||||||
|
safesearch='moderate',
|
||||||
|
timelimit='d', # d=过去24小时, w=过去一周, m=过去一月
|
||||||
|
max_results=10
|
||||||
|
))
|
||||||
|
|
||||||
|
for r in results:
|
||||||
|
print(f\"📰 {r['title']}\")
|
||||||
|
print(f\" 来源: {r['source']}\")
|
||||||
|
print(f\" 时间: {r['date']}\")
|
||||||
|
print(f\" 链接: {r['url']}\")
|
||||||
|
print()
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 图片搜索 (Image Search)
|
||||||
|
|
||||||
|
搜索图片资源:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.images(
|
||||||
|
'cute cats',
|
||||||
|
region='wt-wt',
|
||||||
|
safesearch='moderate',
|
||||||
|
size='Medium', # Small, Medium, Large, Wallpaper
|
||||||
|
type_image='photo', # photo, clipart, gif, transparent, line
|
||||||
|
layout='Square', # Square, Tall, Wide
|
||||||
|
max_results=10
|
||||||
|
))
|
||||||
|
|
||||||
|
for r in results:
|
||||||
|
print(f\"🖼️ {r['title']}\")
|
||||||
|
print(f\" 图片: {r['image']}\")
|
||||||
|
print(f\" 缩略图: {r['thumbnail']}\")
|
||||||
|
print(f\" 来源: {r['source']}\")
|
||||||
|
print()
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 视频搜索 (Video Search)
|
||||||
|
|
||||||
|
搜索视频内容:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.videos(
|
||||||
|
'Python programming',
|
||||||
|
region='wt-wt',
|
||||||
|
safesearch='moderate',
|
||||||
|
timelimit='w', # d, w, m
|
||||||
|
resolution='high', # high, standard
|
||||||
|
duration='medium', # short, medium, long
|
||||||
|
max_results=10
|
||||||
|
))
|
||||||
|
|
||||||
|
for r in results:
|
||||||
|
print(f\"📹 {r['title']}\")
|
||||||
|
print(f\" 时长: {r.get('duration', 'N/A')}\")
|
||||||
|
print(f\" 来源: {r['publisher']}\")
|
||||||
|
print(f\" 链接: {r['content']}\")
|
||||||
|
print()
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 即时回答 (Instant Answers)
|
||||||
|
|
||||||
|
获取 DuckDuckGo 的即时回答:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = ddgs.answers('what is python programming language')
|
||||||
|
|
||||||
|
for r in results:
|
||||||
|
print(f\"📚 {r['text']}\")
|
||||||
|
print(f\" 来源: {r.get('url', 'DuckDuckGo')}\")
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. 建议搜索 (Suggestions)
|
||||||
|
|
||||||
|
获取搜索建议:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
suggestions = list(ddgs.suggestions('python'))
|
||||||
|
|
||||||
|
print('🔍 搜索建议:')
|
||||||
|
for s in suggestions:
|
||||||
|
print(f\" - {s['phrase']}\")
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. 地图搜索 (Maps Search)
|
||||||
|
|
||||||
|
搜索地点信息:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.maps(
|
||||||
|
'coffee shop',
|
||||||
|
place='Beijing, China',
|
||||||
|
max_results=10
|
||||||
|
))
|
||||||
|
|
||||||
|
for r in results:
|
||||||
|
print(f\"📍 {r['title']}\")
|
||||||
|
print(f\" 地址: {r['address']}\")
|
||||||
|
print(f\" 电话: {r.get('phone', 'N/A')}\")
|
||||||
|
print(f\" 坐标: {r['latitude']}, {r['longitude']}\")
|
||||||
|
print()
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 实用脚本
|
||||||
|
|
||||||
|
### 通用搜索函数
|
||||||
|
|
||||||
|
创建一个可复用的搜索脚本:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
import json
|
||||||
|
|
||||||
|
def web_search(query, search_type='text', max_results=5, region='wt-wt', timelimit=None):
|
||||||
|
'''
|
||||||
|
执行 DuckDuckGo 搜索
|
||||||
|
|
||||||
|
参数:
|
||||||
|
query: 搜索关键词
|
||||||
|
search_type: 搜索类型 (text, news, images, videos)
|
||||||
|
max_results: 最大结果数
|
||||||
|
region: 地区 (cn-zh, us-en, wt-wt)
|
||||||
|
timelimit: 时间限制 (d, w, m, y)
|
||||||
|
'''
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
if search_type == 'text':
|
||||||
|
results = list(ddgs.text(query, region=region, timelimit=timelimit, max_results=max_results))
|
||||||
|
elif search_type == 'news':
|
||||||
|
results = list(ddgs.news(query, region=region, timelimit=timelimit, max_results=max_results))
|
||||||
|
elif search_type == 'images':
|
||||||
|
results = list(ddgs.images(query, region=region, max_results=max_results))
|
||||||
|
elif search_type == 'videos':
|
||||||
|
results = list(ddgs.videos(query, region=region, timelimit=timelimit, max_results=max_results))
|
||||||
|
else:
|
||||||
|
results = []
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
# 使用示例
|
||||||
|
query = 'Python 3.12 new features'
|
||||||
|
results = web_search(query, search_type='text', max_results=5)
|
||||||
|
|
||||||
|
print(f'🔍 搜索: {query}')
|
||||||
|
print(f'📊 找到 {len(results)} 个结果')
|
||||||
|
print()
|
||||||
|
|
||||||
|
for i, r in enumerate(results, 1):
|
||||||
|
print(f\"{i}. {r['title']}\")
|
||||||
|
print(f\" {r['href']}\")
|
||||||
|
print(f\" {r['body'][:150]}...\")
|
||||||
|
print()
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 搜索并保存结果
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
import json
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
query = 'latest tech news'
|
||||||
|
output_file = f'search_results_{datetime.now().strftime(\"%Y%m%d_%H%M%S\")}.json'
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.text(query, max_results=10))
|
||||||
|
|
||||||
|
# 保存到 JSON 文件
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump({
|
||||||
|
'query': query,
|
||||||
|
'timestamp': datetime.now().isoformat(),
|
||||||
|
'results': results
|
||||||
|
}, f, ensure_ascii=False, indent=2)
|
||||||
|
|
||||||
|
print(f'✅ 搜索结果已保存到: {output_file}')
|
||||||
|
print(f'📊 共 {len(results)} 条结果')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 多关键词批量搜索
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
import time
|
||||||
|
|
||||||
|
queries = [
|
||||||
|
'Python best practices 2024',
|
||||||
|
'React vs Vue 2024',
|
||||||
|
'AI development tools'
|
||||||
|
]
|
||||||
|
|
||||||
|
all_results = {}
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
for query in queries:
|
||||||
|
print(f'🔍 搜索: {query}')
|
||||||
|
results = list(ddgs.text(query, max_results=3))
|
||||||
|
all_results[query] = results
|
||||||
|
print(f' 找到 {len(results)} 个结果')
|
||||||
|
time.sleep(1) # 避免请求过快
|
||||||
|
|
||||||
|
print()
|
||||||
|
print('=' * 50)
|
||||||
|
print('📊 搜索汇总')
|
||||||
|
print('=' * 50)
|
||||||
|
|
||||||
|
for query, results in all_results.items():
|
||||||
|
print(f'\n🔎 {query}:')
|
||||||
|
for i, r in enumerate(results, 1):
|
||||||
|
print(f\" {i}. {r['title'][:60]}...\")
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 参数说明
|
||||||
|
|
||||||
|
### 地区代码 (region)
|
||||||
|
|
||||||
|
| 代码 | 地区 |
|
||||||
|
|------|------|
|
||||||
|
| `cn-zh` | 中国 |
|
||||||
|
| `us-en` | 美国 |
|
||||||
|
| `uk-en` | 英国 |
|
||||||
|
| `jp-jp` | 日本 |
|
||||||
|
| `kr-kr` | 韩国 |
|
||||||
|
| `wt-wt` | 全球 (无地区限制) |
|
||||||
|
|
||||||
|
### 时间限制 (timelimit)
|
||||||
|
|
||||||
|
| 值 | 含义 |
|
||||||
|
|----|------|
|
||||||
|
| `d` | 过去 24 小时 |
|
||||||
|
| `w` | 过去一周 |
|
||||||
|
| `m` | 过去一月 |
|
||||||
|
| `y` | 过去一年 |
|
||||||
|
| `None` | 不限制 |
|
||||||
|
|
||||||
|
### 安全搜索 (safesearch)
|
||||||
|
|
||||||
|
| 值 | 含义 |
|
||||||
|
|----|------|
|
||||||
|
| `on` | 严格过滤 |
|
||||||
|
| `moderate` | 适度过滤 (默认) |
|
||||||
|
| `off` | 关闭过滤 |
|
||||||
|
|
||||||
|
## 错误处理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
from duckduckgo_search.exceptions import DuckDuckGoSearchException
|
||||||
|
|
||||||
|
try:
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.text('test query', max_results=5))
|
||||||
|
print(f'✅ 搜索成功,找到 {len(results)} 个结果')
|
||||||
|
except DuckDuckGoSearchException as e:
|
||||||
|
print(f'❌ 搜索出错: {e}')
|
||||||
|
except Exception as e:
|
||||||
|
print(f'❌ 未知错误: {e}')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用代理
|
||||||
|
|
||||||
|
如果需要使用代理:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
# 设置代理
|
||||||
|
proxy = 'http://127.0.0.1:7890' # 替换为你的代理地址
|
||||||
|
|
||||||
|
with DDGS(proxy=proxy) as ddgs:
|
||||||
|
results = list(ddgs.text('test query', max_results=5))
|
||||||
|
print(f'通过代理搜索成功,找到 {len(results)} 个结果')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 常见问题
|
||||||
|
|
||||||
|
**安装失败?**
|
||||||
|
```bash
|
||||||
|
# 确保 pip 是最新版本
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install duckduckgo-search
|
||||||
|
|
||||||
|
# 或使用 uv
|
||||||
|
uv pip install duckduckgo-search
|
||||||
|
```
|
||||||
|
|
||||||
|
**搜索无结果?**
|
||||||
|
```bash
|
||||||
|
# 检查网络连接
|
||||||
|
# 尝试使用代理
|
||||||
|
# 减少搜索关键词复杂度
|
||||||
|
# 检查地区设置是否正确
|
||||||
|
```
|
||||||
|
|
||||||
|
**请求被限制?**
|
||||||
|
```bash
|
||||||
|
# 在多次搜索之间添加延迟
|
||||||
|
import time
|
||||||
|
time.sleep(1) # 等待 1 秒
|
||||||
|
|
||||||
|
# 减少单次请求的结果数量
|
||||||
|
max_results=5 # 而不是 50
|
||||||
|
```
|
||||||
|
|
||||||
|
## 与其他工具集成
|
||||||
|
|
||||||
|
### 结合 browser-use 获取详细内容
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 先用 DuckDuckGo 搜索
|
||||||
|
python -c "
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
|
|
||||||
|
with DDGS() as ddgs:
|
||||||
|
results = list(ddgs.text('Python async tutorial', max_results=1))
|
||||||
|
if results:
|
||||||
|
url = results[0]['href']
|
||||||
|
print(f'URL: {url}')
|
||||||
|
"
|
||||||
|
|
||||||
|
# 2. 用 browser-use 打开并获取详细内容
|
||||||
|
browser-use open <url_from_search>
|
||||||
|
browser-use state
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
⚠️ **使用建议**:
|
||||||
|
|
||||||
|
1. **遵守使用频率限制**:避免短时间内大量请求
|
||||||
|
2. **合理设置结果数量**:不要一次请求过多结果
|
||||||
|
3. **添加适当延迟**:批量搜索时在请求之间添加 `time.sleep()`
|
||||||
|
4. **处理异常情况**:始终添加错误处理代码
|
||||||
|
5. **尊重版权**:搜索结果仅供参考,注意内容版权
|
||||||
6
_meta.json
Normal file
6
_meta.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"ownerId": "kn7e6rmb07qmpshw2vp52sw2gs80fcd0",
|
||||||
|
"slug": "duckduckgo-search",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"publishedAt": 1770133991079
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user