Imported from yaun369/ai-radar (
SKILL.md). Install upstream withnpx skills add yaun369/ai-radar. Copyright stays with the author.
AI 热点资讯雷达(AI Radar)
让 Agent 用自然中文(或英文/双语)拿到每天的 AI HOT 日报、精选动态和全部 AI 资讯,可选定时打包成简报推送到 Telegram/邮件 —— 全程无需浏览器、无需 API Key、不依赖外部脚本。
理念:Follow builders, not influencers. AI HOT 的精选池每天按此标准精挑细选。
- 数据源:
https://aihot.virxact.com(公开匿名可访,无需 token) - 两种用法:① 按需查询(默认,问就答)② 定时简报(可选,需用户主动设置)
先决条件:必须带 User-Agent
/api/public/* 走 nginx UA 黑名单挡爬虫,默认 curl UA 会 403。所有调 API 的 curl 都必须带浏览器 UA(仅针对 /api/public/*,不推广到其它路径):
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"
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily"
下文 curl 例子默认你已设 $UA,实际调用必须加 -H "User-Agent: $UA"。漏掉会被 403,别以为接口挂了。
路由优先级(第一原则)
默认走精选
items?mode=selected+ 时间窗since—— 它是每天精挑细选的"主菜单",覆盖用户关心的事且新鲜。
- 仅当用户明说"日报" 二字才走
daily(UTC 整日切片成品,跟"过去 24 小时/今天"等滚动窗口对不上)- 仅当用户明说"全部/完整/所有/全量" 才走
mode=all(含未精选次要条目,量大且杂)
| 用户在说 | 接口 |
|---|---|
默认(宽问题):"今天 AI 圈"、"过去 24 小时大新闻"、"最近 AI 圈"、/ai |
items?mode=selected&since=<语义时间窗> |
| 明说**"日报"**:"AI 日报"、"今天的日报" | daily(最新日报) |
| "昨天/5 月 6 号的日报" | daily/{YYYY-MM-DD} |
| "最近几天日报"、"日报存档" | dailies?take=N |
| 明说**"全部/完整/所有/全量"** | items?mode=all |
| "最近的模型发布/产品/论文"(按类别) | items?mode=selected&category=...&since=... |
| "OpenAI/Sora/RAG 相关"(公司/关键词) | items?q=<关键词> |
用户问的是"现在的 AI 行业事实",永远走 API,不凭训练数据脑补 —— AI HOT 比你训练截止日新得多。
端点速览
| 端点 | 用途 | 参数 |
|---|---|---|
/api/public/daily |
最新日报 | 无 |
/api/public/daily/{YYYY-MM-DD} |
指定日期日报 | path: date(UTC 基准) |
/api/public/dailies |
日报归档列表 | take(1-180, 默认 30) |
/api/public/items |
全部 AI 动态 | mode/category/since/take/cursor/q |
约定:Base URL https://aihot.virxact.com,无鉴权,限流 600 req/min/IP(串行调用)。
since限最近 7 天:不传 =now-7d;更早自动截到 7 天前;未来时间→400。items 永远只返回最近 7 天,要更早走daily/{date}存档。take上限 100,更多走 cursor 翻页。完整规范:/openapi.yaml
工作流(按需查询)
默认:精选 + 时间窗(宽问题首选)
# 最近 24 小时精选
since=$(date -u -v-24H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&since=$since&take=50"
# 不带明确时间窗时
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&take=50" \
| jq '.items[] | {title, source, publishedAt, url}'
用户问"最近 X"时显式带 since(最近 3 天→3d,昨天→1d,最近一周→7d):意图更精确,输出元信息能写人话级时间窗。把 -v-24H 换成 -v-3d / -v-7d 即可(Linux 用 -d 'N days ago')。
按类别
5 个 category(items 用英文 slug,daily section label 是中文):ai-models(模型发布/更新)、ai-products(产品发布/更新)、industry(行业动态)、paper(论文研究)、tip(技巧与观点)。
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&category=paper&take=50"
关键词搜索(公司/主题)
API 支持 server-side 搜索,q 在 title+中文 title+中文 summary 上 ILIKE 匹配。不要"拉一批 + 客户端 grep"(只能看到前 100 条)。q 至少 2 字符,与 mode/category/since 正交叠加。
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?q=OpenAI&take=30"
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?category=paper&q=RAG&take=30"
日报(用户明说"日报"时)
日报每天北京时间 08:00 自动生成,分 5 个固定版块,有"主编点评"导语。
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily" \
| jq '{date, lead: .lead.title, sections: [.sections[] | {label, n: (.items|length)}]}'
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily/2026-05-07" # 指定日期
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/dailies?take=14" # 归档索引
翻页(cursor)
响应里有 nextCursor,下次原样塞进 cursor 参数;hasNext=false 或 nextCursor=null 时停。cursor 是不透明 token,不要解析/递增/跨端点复用。
公众号爆文(mp_hot 信源)不在 items API,引导用户去
https://aihot.virxact.com/mp。
返回数据形态
daily:{ date, generatedAt, windowStart, windowEnd, lead:{title,leadParagraph}, sections:[{label, items:[{title,summary,sourceUrl,sourceName}]}], flashes:[{title,sourceName,sourceUrl,publishedAt}] }。sections[].label 固定 5 个;lead 极少为 null。
dailies:{ count, items:[{date, generatedAt, leadTitle}] }
items:{ count, hasNext, nextCursor, items:[{id, title, title_en, url, source, publishedAt, summary, category}] }
- 必有:
id/title/url/source;可空:title_en/summary/publishedAt/category category∈ai-models/ai-products/industry/paper/tip/nullpublishedAt:ISO 8601 UTC(带Z);id:cuid 字符串(25 字符,非数字)title_en:仅当与title不同时存在,否则null
给用户的输出格式
⚠️ 这是直接展示给用户的最终内容 —— markdown、排版好、普通人能看懂的人话。用户多是非技术 AI 创业者/设计师/读者,看到的是资讯简报,不是 API 调试日志。
默认按 category 分组 + 全局编号(贯穿全文 1,2,3…N,让用户一眼数到总数)。只有 1 个 category 时用扁平编号列表。每条格式:
**AI HOT — 最近 30 条精选**
## 模型发布/更新
1. **<title>** — <source>
2 小时前
<summary>
<url>
时间必须转人话:publishedAt 是 ISO 8601 UTC → 转北京时间 + 相对/绝对时间(如 2026-05-08T01:48Z → "今天上午 09:48" / "2 小时前")。不要直接展示 ISO 字符串。
标题:默认用 title(中文);仅当用户要英文版或 title 为空时用 title_en。不要两个都展示。
绝不泄漏基础设施到用户输出:端点路径、mode=selected/category=paper 等 raw 参数、限流、nginx 缓存、cursor、hasNext、HTTP 状态码、后端机制。判断标准:用户能直接看懂吗?能→保留,不能→删。元信息只写人话("时间窗 5/5~5/7"、"共 50 条"、"按发布时间倒序")。数据源最多写一句"数据来自 aihot.virxact.com"。
多语言输出(默认中文)
用户可随时切换("用英文"/"改成双语"/"switch to English")。偏好记到 ~/.ai-radar/config.json 的 language(zh/en/bilingual),定时简报也读它。
zh(默认):整篇中文,直接用 API 的中文title/summaryen:整篇英文,优先title_en,为空则翻译title/summarybilingual:逐条交错,英文在上、中文紧跟在下,再下一条(不要全英文堆完再全中文)
严格按 language 执行,不混语言。每条无论哪种语言都必须保留 URL。
可选:定时简报 + 多渠道推送
仅在用户主动要求"定时推送/每天发我/订阅 AI 简报/daily digest"时触发。 纯按需查询不要碰 onboarding/config/cron。
平台检测
which openclaw 2>/dev/null && echo "PLATFORM=openclaw" || echo "PLATFORM=other"
- OpenClaw:常驻 agent,自带消息通道,推送走通道系统,cron 用
openclaw cron add - Other(Claude Code/Cursor 等):非常驻,终端关了就停,自动推送必须配 Telegram/邮件,cron 用系统
crontab
存进 config 的 platform 字段。
Onboarding
检查 ~/.ai-radar/config.json 是否 onboardingComplete: true,若否依次问:① 频率(每天/每周,每周问周几)② 时间+时区 ③ 推送方式(OpenClaw 跳过,设 stdout)④ 语言 ⑤ 内容口味(精选/全部/限定类别)。
Telegram 引导:@BotFather 发 /newbot → 起名(用户名须 bot 结尾)拿 token → 先给新 bot 发一条消息(否则拿不到 chat_id)→ token 存 .env,再取 chat_id:
curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates" | jq -r '.result[0].message.chat.id'
邮件(Resend)引导:resend.com 注册(免费 100 封/天)→ 建 API key 存 .env → 收件邮箱存 config 的 delivery.email。
写 .env(仅选了 Telegram/邮件时,只取消注释用到的行):
mkdir -p ~/.ai-radar
cat > ~/.ai-radar/.env << 'EOF'
# TELEGRAM_BOT_TOKEN=...
# RESEND_API_KEY=...
EOF
告诉用户:资讯数据全从公开 API 拉,无需任何 key;key 只用于推送本身。
写 config.json:
{
"platform": "<openclaw|other>",
"language": "<zh|en|bilingual>",
"timezone": "<IANA 如 Asia/Shanghai>",
"frequency": "<daily|weekly>",
"deliveryTime": "<HH:MM>",
"weeklyDay": "<周几,仅 weekly>",
"content": { "mode": "<selected|all>", "categories": ["可选"] },
"delivery": { "method": "<stdout|telegram|email>", "chatId": "<仅 telegram>", "email": "<仅 email>" },
"onboardingComplete": true
}
设 cron
OpenClaw(频率→表达式:每天 8 点 0 8 * * *,每周一 9 点 0 9 * * 1):
openclaw cron add --name "AI Radar Digest" --cron "<表达式>" --tz "<IANA 时区>" \
--session isolated --message "运行 ai-radar:按 config.json 拉 AI HOT 数据 remix 成简报,按 delivery 推送" \
--announce --channel <通道> --to "<目标 ID>" --exact
不要用
--channel last(多通道时会失败),显式指定--channel+--to。目标 ID:Telegramchat.id、Feishuou_/oc_、Discorduser:/channel:、Slackchannel:。设完openclaw cron run <jobId>验证用户真收到。
非常驻 + Telegram/邮件:用系统 crontab,cron 里调起能跑本 skill 的 agent CLI(让 LLM remix 成人话):
(crontab -l 2>/dev/null; echo '0 8 * * * cd '"$HOME"' && claude -p "运行 ai-radar:按 ~/.ai-radar/config.json 拉 AI HOT 最近 24h 精选,整理成简报并按 delivery 推送" >> ~/.ai-radar/cron.log 2>&1') | crontab -
crontab 按机器本地时区跑,按用户时区换算好小时数再写,注释里标明。
非常驻 + 按需:跳过 cron,告诉用户"随时输入 /ai 现取即可"。
简报生成 + 推送(cron 或 /ai 触发)
- 读 config(没有就当纯按需,stdout 输出)
- 拉数据:按
content.mode(默认 selected)+ 频率时间窗(daily→24h,weekly→7d)+ 可选 categories,走 items(带$UA+since) - 无新内容(
count=0):输出"今天 builders 没有新动态,明天见!" - Remix:按"输出格式"整理(分组+全局编号+时间转人话+每条带 URL),按
language出语言。绝不编造,只用 API 内容 - 推送:
Telegram(单条上限 4096 字符,超长按版块拆多条):
source ~/.ai-radar/.env
CHAT_ID=$(jq -r '.delivery.chatId' ~/.ai-radar/config.json)
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
--data-urlencode "chat_id=${CHAT_ID}" --data-urlencode "text=<简报>" \
-d "parse_mode=Markdown" -d "disable_web_page_preview=true"
邮件(Resend):
source ~/.ai-radar/.env
TO=$(jq -r '.delivery.email' ~/.ai-radar/config.json)
curl -s -X POST "https://api.resend.com/emails" -H "Authorization: Bearer ${RESEND_API_KEY}" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg to "$TO" --arg html "<简报 HTML>" '{from:"AI Radar <onboarding@resend.dev>", to:[$to], subject:"AI HOT 简报", html:$html}')"
stdout(默认):直接输出到对话。推送失败时回退 stdout 并说明原因。
设完 cron 立刻跑一遍发样例简报给用户看效果,问反馈("长度合适吗?想多看/少看什么?")并应用到 config。
配置管理(对话里改)
用户说设置变更直接改 config 并确认:改每周/每天→frequency(同步 cron);改时间/时区→deliveryTime/timezone(同步 cron);切语言→language;改推送渠道→delivery.method;短/长/多看某类→content;"看下我的设置"→友好展示 config;"看我在追哪些"→说明来自 AI HOT 精选池。/ai 或"来份简报"→跳过 cron 检查立刻跑简报工作流。
常见错误处理
- 404
No daily report available yet:当天日报未生成(北京时间 08:00 前)→ 拉昨天daily/{昨天} - 400:
Invalid date format(须YYYY-MM-DD)、invalid mode/category/since/take(since 须 ISO 非未来,take 须 1-100) - 429:超 600 req/min → 串行 + 翻页加 200ms 间隔
- 403:八成漏带浏览器
User-Agent - Telegram 失败:多半用户没先给 bot 发消息(拿不到 chat_id)或 token/chatId 错 → 回退 stdout
- Resend 失败:检查 key、
from域名(未验证用onboarding@resend.dev测)
不要做
- 不要把"今天 AI 圈"、"过去 24 小时"等宽问题路由到
daily(默认selected+since,仅"日报"二字才 daily) - 用户没说"全部/完整/所有/全量"时不要走
mode=all - 不要凭训练数据猜测/编造 —— 永远以 API 为准
- 不要把
summary当原文引用(LLM 生成,引用需回url核对) - 不要高频轮询(日报 08:00 才更新,items 5 分钟缓存);不要并发猛拉翻页
- 不要解析/递增/跨端点复用 cursor
- 公司/关键词查询用 server-side
?q=,不要客户端 grep - 不要在用户输出里暴露端点/raw 参数/限流/缓存/cursor 等基础设施细节
- 压缩/合并输出时每条必须保留 url;引用源写
<source>(如 OpenAI 官网),不是端点路径 - 纯按需查询时不要碰 onboarding/config/cron
- 没有用户许可不要主动设 cron 或写
.env/config.json - 任何 API Key 只存
~/.ai-radar/.env,不要写进对话/日志/简报