소스 정보
- 저장소
- jacardl/viceroy-skills
- 최근 소스 활동
- 2026년 6월 4일 01:08
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 3
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/jacardl/viceroy-skills --skill radar-data-collection명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
从 radar DB 读取今日数据,发送金价+AI+政治+GitHub 四条飞书消息
雷达数据采集 — 金价、TIPS、政治、AIHOT、GitHub 写入 PostgreSQL(docker exec)。采集失败按 PATCH-2026-08-10-001 分类告警。
通用中文创作与改稿 Skill。用于知乎回答、论坛长帖、公众号文章、博客、评论、人物故事、历史叙事、新闻与行业解读、科普、教程、评测、个人叙事、小说、故事、对白、口播和演讲稿。默认写成一个见过事、查过材料、愿意把来龙去脉讲清楚的人在说话,重点保留中文互联网长回答与长帖的活人感和自然中文韵律,避免空泛的机构腔、喊口号式演说腔、营销腔和模型腔。非虚构长文先检查材料够不够,材料不足时研究、追问或缩短,绝不用重复解释灌字数。现实内容额外核验事实、引语、数据与用户亲历,虚构内容可以创造人物、场景、对白、心理与情节。成稿正文严禁冒号、破折号、“不是……而是……”及同类翻案句,并清除商业黑话和模型惯用黑话。不创建作者画像、个人规则库或个人写作 Skill。
SOC 직업 분류 기준
SKILL.md 표시 중
| name | radar-data-collection |
| description | 雷达数据采集 Skill — 采集金价、国际政治、AI热讯,写入 PostgreSQL 向量数据库,验证新闻真实性,按日期归档。 |
| metadata | {"openclaw":{"emoji":"🛰️"}} |
每日 06:00 北京时间执行。采集金价、国际政治、AI热讯,写入 radar 数据库的 news_articles 和 gold_prices 表。
| 类型 | 来源 | 数量 |
|---|---|---|
| 国际金价 | Kitco(伦敦现货,USD/盎司) | 1 条 |
| 国内金价 | 权威国内平台(沪金现货,CNY/克) | 1 条 |
| 国际政治 | RSS 聚合(BBC/Guardian/FT/NYT/Al Jazeera)+ 9Router 补充搜索 | 10 条 |
| AI热讯 | aihot.virxact.com 精选 | 10 条 |
| 来源 | 状态 | RSS URL | 策略 |
|---|---|---|---|
| BBC News | ✅ 直连可用 | https://feeds.bbci.co.uk/news/world/rss.xml | 直接 curl 获取 |
| The Guardian | ✅ 直连可用 | https://www.theguardian.com/world/rss | 直接 curl 获取 |
| FT | ⚠️ 301跳转但内容完整 | https://www.ft.com/rss/home | curl -sL 跟进 301 即可获取完整 RSS |
| NYT | ✅ 直连可用 | https://rss.nytimes.com/services/xml/rss/nyt/World.xml | 直接 curl 获取 |
| Al Jazeera | ✅ 直连可用 | https://www.aljazeera.com/xml/rss/all.xml | 直接 curl 获取 |
| France24 | ✅ 直连可用 | https://www.france24.com/en/rss | 直接 curl 获取 |
| Reuters | ❌ RSS 通道被关 | https://news.google.com/rss/search?q=site:reuters.com&hl=en-US&gl=US&ceid=US:en | Google News RSS 过滤 site:reuters.com |
| AP News | ❌ RSS 通道被关 | https://news.google.com/rss/search?q=site:apnews.com+world&hl=en-US&gl=US&ceid=US:en | Google News RSS 过滤 site:apnews.com |
| CNN | ⚠️ CNN 官方 RSS 已关闭 | https://news.google.com/rss/search?q=site:cnn.com+world&hl=en-US&gl=US&ceid=US:en | Google News RSS 过滤 site:cnn.com |
date -d '+8 hour' '+%Y-%m-%d'
article_date = 北京时间今天日期
字段:intl_price_usd, intl_price_change, domestic_price_cny, domestic_price_change
采集顺序(强制):RSS 批量拉取 → 按发布日期筛选 → 不足 10 条时用 9Router 搜索补采
同时拉取以下所有 RSS feed(使用 curl -sL 并行获取):
# 示例:一次性批量获取 RSS
RSS_URLS=(
"https://feeds.bbci.co.uk/news/world/rss.xml"
"https://www.theguardian.com/world/rss"
"https://www.ft.com/rss/home"
"https://rss.nytimes.com/services/xml/rss/nyt/World.xml"
"https://www.aljazeera.com/xml/rss/all.xml"
"https://www.france24.com/en/rss"
"https://news.google.com/rss/search?q=site:reuters.com&hl=en-US&gl=US&ceid=US:en"
"https://news.google.com/rss/search?q=site:apnews.com+world&hl=en-US&gl=US&ceid=US:en"
"https://news.google.com/rss/search?q=site:cnn.com+world&hl=en-US&gl=US&ceid=US:en"
)
for url in "${RSS_URLS[@]}"; do
response=$(curl -sL --max-time 8 "$url")
# 解析 XML,提取 title, description, pubDate, link
# pubDate 用于时效性筛选,description 可作为事件摘要
# FT 要用 curl -sL(自动跟随 301)
done
Python 解析 RSS XML(每条 RSS 返回标准格式):
import xml.etree.ElementTree as ET
root = ET.fromstring(xml_data)
for item in root.findall('.//item'):
title = item.findtext('title', '')
desc = item.findtext('description', '') # 事件摘要
pub_date = item.findtext('pubDate', '') # RFC 2822 格式
link = item.findtext('link', '')
source = item.findtext('source', '') or extract_domain(link)
时效性筛选:取 pubDate 在当天/前 1 天范围内的 RSS 条目
搜索 query:international political news today
筛选来源:Reuters / AP / AFP / Al Jazeera / BBC / FT
验证:每条必须附来源 URL,缺失则丢弃
每条候选新闻入库前必须验证发布时间。时效性是硬约束,禁止将过时新闻写入当日数据。
验证方法(按优先级):
/2026/5/13)article_date - 2天,则丢弃该条/年/月/日 或 /年-月-日/ 格式的日期路径,直接提取并判断:
验证规则:
article_date 或 article_date - 1天(允许前一天的夜间新闻)/2026/5/13/ 直接暴露发布日期为 2026-05-13,远早于当天,必须丢弃/articles/xxxxx 无显式日期但页面 title 会标注时间(如 "3 hours ago"),用 web_fetch 提取落地实现:
# 伪代码流程
candidates = 9Router search
validated = []
for each candidate:
# 方法1:URL路径分析
date_from_url = extract_date_from_url(candidate.url)
if date_from_url and date_from_url < article_date - 1:
continue # 丢弃旧新闻
# 方法2:web_fetch 抓取验证
result = web_fetch(candidate.url, extractMode='markdown', maxChars=300)
if "hours ago" in result or "minutes ago" in result:
validated.append(candidate) # 大概率当天新闻
elif specific_date_in_page < article_date - 1:
continue # 明确过时
else:
# 无法判断的,用 baoyu 或 9Router 兜底验证
result2 = baoyu/9router_fetch(candidate.url)
# 仍无法判断 → 丢弃(宁缺毋滥)
validated.append(candidate) # 通过验证
达标要求:至少采集 ≥10 条通过时效性验证的新闻。不足时重新搜索补采。
采集策略(落地版,强制按顺序执行)
说明:RSS 主链路的优势——无反爬墙、完整标题+摘要+发布时间+URL、纯文本低开销。 Google News RSS 的局限:标题可能被截断,source 字段保留原始来源。 候选链接如果是频道页/聚合页,必须继续下钻到具体事件稿;不能直接入库。
内容增强要求(强制,服务下游推送)
字段写入规范:
title:写中文标题(便于推送直读)content:按固定模板存储:
中文标题:...
English Headline: ...
事件介绍:...
背景/影响:...
source, url, category='politics', lang='zh'UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 aihot-skill/0.2.0"
curl -s -H "User-Agent: $UA" \
"https://aihot.virxact.com/api/public/items?mode=selected&take=10"
解析返回的 JSON,取 title、publishedAt、summary、source、url
字段:category='ai', lang='zh'
# Ollama 地址(nomic-embed-text,768维)
OLLAMA_URL="http://localhost:11434/api/embeddings"
MODEL="nomic-embed-text"
# 对每条 title+content(前500字)调用 embedding
curl -s -X POST "$OLLAMA_URL" \
-H "Content-Type: application/json" \
-d "{\"model\":\"$MODEL\",\"prompt\":\"$TEXT\"}" \
| python3 -c "import sys,json; print(','.join(map(str,json.load(sys.stdin)['embedding'])))"
维度 768,写入 embedding 字段(格式:'[v1,v2,...]')。
# 金价写入
docker exec radar-db psql -U radar -d radar -c \
"INSERT INTO gold_prices (price_date, intl_price_usd, intl_price_change, domestic_price_cny, domestic_price_change)
VALUES ('${ARTICLE_DATE}', ${INTL_PRICE}, ${INTL_CHANGE}, ${DOMESTIC_PRICE}, ${DOMESTIC_CHANGE})
ON CONFLICT (price_date) DO UPDATE SET
intl_price_usd = EXCLUDED.intl_price_usd,
intl_price_change = EXCLUDED.intl_price_change,
domestic_price_cny = EXCLUDED.domestic_price_cny,
domestic_price_change = EXCLUDED.domestic_price_change;"
# 新闻写入(每条一条INSERT)
docker exec radar-db psql -U radar -d radar -c \
"INSERT INTO news_articles (article_date, category, title, content, source, url, lang, embedding)
VALUES ('${ARTICLE_DATE}', '${CATEGORY}', '${TITLE}', '${CONTENT}', '${SOURCE}', '${URL}', '${LANG}',
'[${EMBEDDING}]');"
采集完成后执行:
SELECT article_date, category, COUNT(*) FROM news_articles GROUP BY article_date, category;
SELECT * FROM gold_prices WHERE price_date = '${ARTICLE_DATE}';
确认条数符合预期(国际政治≥10条,aihot≥8条),缺条则补采。
并抽查国际政治结构完整性(必须含中英对照+事件介绍):
SELECT COUNT(*) FROM news_articles
WHERE article_date='${ARTICLE_DATE}' AND category='politics'
AND content LIKE '%English Headline:%'
AND content LIKE '%事件介绍:%';
若不达标,继续补采并覆盖更新。
Host: localhost:5444
Database: radar
User: radar
Password: radar
连接方式:docker exec radar-db psql -U radar -d radar -c "SQL"
memory/YYYY-MM-DD.md完成后输出简洁报告:
🛰️ 数据采集完成 [日期]
✅ 金价:国际 ${INTL_PRICE} (${CHANGE}) / 国内 ${DOMESTIC_PRICE}
✅ 国际政治:${N} 条
✅ AI热讯:${N} 条
⏱️ 耗时:${SEC}s