每 2 小时自动收集你关注的**的最新消息,编成报纸式的简报网页(GitHub Pages)。每个作品一个固定版面、用它自己的配色,新消息直接更新进各自的版面:一周内的按重要度和时间显示,更早的收进可展开的「更多消息」,旧消息永远保留。 有要紧消息(定档、开放预约、下次测试公布……)**通过 Discord 通知;其余的**发一次周报。
Overview
每 2 小时自动收集你关注的**的最新消息,编成报纸式的简报网页(GitHub Pages)。每个作品一个固定版面、用它自己的配色,新消息直接更新进各自的版面:一周内的按重要度和时间显示,更早的收进可展开的「更多消息」,旧消息永远保留。 有要紧消息(定档、开放预约、下次测试公布……)**通过 Discord 通知;其余的**发一次周报。 思路参考 agents-radar:,不让 AI 自己联网搜索,token 消耗很低。 看到喜欢的东西,跟 Claude 说「加进 wishlist」并附上截图或链接就行(做法写在 .claude/skills/wishlist/SKILL.md)。 数据在 wishlist.yaml,图片在 docs/wishlist/;网页上是单独的子页面(wishlist.html,主页报头右上角有入口,可按 想要 / 已入手 / 没买到 筛选),推送后 Discord 会收到一条带大图的通知。 填了 watch(关联的关注项)的,版面上会顺带显示那个关注项的最新消息。 愿望清单页顶部有「」:上传一张照片、选「想要」或「纠结」,照片先存进数据库;GitHub Actions 每 2 小时导出到 inbox/photos/,Claude 定时任务(「愿望清单 · 照片加愿望」)按 PHOTOS.md 认出物品、整理好加进 wishlist.yaml。网页上能看到每张照片的进度(排队中 → Claude 处理中 → 已加入)。 主页的「」角落每条都写明真实的推荐理由,不让 AI 联网。已经在各个版面里的消息(和别家报道的同一件事)不放进来,投过票的也不再推荐: - :消息**命中愿望清单里某件东西的 likes(喜好标签,至少一个具体喜好;来自关注版面的要命中两个以上); - :关注的版面里收集到、但没上版面的其他消息(最近 3 天,每项最多 2 条,Reddit 网友帖不算); - :和你赞过的消息有共同的喜好或是同一个作品时,理由后面补这一句; - :按 items.yaml 里每个关注项的 similar(同类搜索词)搜 Google 新闻,去掉已经在关注的作品。
README
Wishlist · 关注清单通信
每 2 小时自动收集你关注的游戏、动画、影视剧、商品、艺人演出的最新消息,编成报纸式的简报网页(GitHub Pages)。每个作品一个固定版面、用它自己的配色,新消息直接更新进各自的版面:一周内的按重要度和时间显示,更早的收进可展开的「更多消息」,旧消息永远保留。 有要紧消息(定档、开放预约、下次测试公布……)当天立刻通过 Discord 通知;其余的每周一发一次周报。
思路参考 agents-radar:信息由脚本从免费 RSS / API 抓取,AI 只负责把抓到的标题编排成几条报道,不让 AI 自己联网搜索,token 消耗很低。
架构图
哪个任务在哪个环境跑、数据怎么流、哪些要钱(网页版,其他图解见下面「流程」):
愿望清单
看到喜欢的东西,跟 Claude 说「加进 wishlist」并附上截图或链接就行(做法写在 .claude/skills/wishlist/SKILL.md)。
数据在 wishlist.yaml,图片在 docs/wishlist/;网页上是单独的子页面(wishlist.html,主页报头右上角有入口,可按 想要 / 已入手 / 没买到 筛选),推送后 Discord 会收到一条带大图的通知。
填了 watch(关联的关注项)的,版面上会顺带显示那个关注项的最新消息。
愿望清单页顶部有「📷 拍照加愿望」:上传一张照片、选「想要」或「纠结」,照片先存进数据库;GitHub Actions 每 2 小时导出到 inbox/photos/,Claude 定时任务(「愿望清单 · 照片加愿望」)按 PHOTOS.md 认出物品、整理好加进 wishlist.yaml。网页上能看到每张照片的进度(排队中 → Claude 处理中 → 已加入)。
主页的「我会喜欢?」角落每条都写明真实的推荐理由,不让 AI 联网。已经在各个版面里的消息(和别家报道的同一件事)不放进来,投过票的也不再推荐:
- 因为你想要:消息标题命中愿望清单里某件东西的
likes(喜好标签,至少一个具体喜好;来自关注版面的要命中两个以上); - 你关注的「X」还有这条:关注的版面里收集到、但没上版面的其他消息(最近 3 天,每项最多 2 条,Reddit 网友帖不算);
- 你赞过「那条」:和你赞过的消息有共同的喜好或是同一个作品时,理由后面补这一句;
- 同类新发现:按
items.yaml里每个关注项的similar(同类搜索词)搜 Google 新闻,去掉已经在关注的作品。
搜新消息每 12 小时一次,每次用新的随机种子:每个关注项随机挑 2 条 similar,再随机搜 6 个喜好关键词(赞过的更容易抽到),搜到的跨次累积;种子和搜索词记在 state/discover.json。
网页像 B 站首页:每次打开、每次「换一批」都先放没出现过的,点开看过的排到最后,全看过了按最早出现的轮回来;「上一批」可以回去。看过的记在这个浏览器里。
每条推荐下面有 👍 喜欢 / 👎 不感兴趣;版面上的每条消息右上角也有小的 👍 / 👎。投票存进 Supabase(Postgres 数据库,设置见下面「数据库」),每次出刊时从投票学习口味:
- 赞过的消息命中的喜好标签、具体关键词(如「猫」「Snoopy」)、所属作品各 +1,踩过的各 −1,累加起来给之后的候选加减分(最多 +4 / −6)。
普通消息按标题对照愿望清单的
likes找标签; - 同一条消息在页面上几处出现时(头条、版面),按钮状态一起变;
- 踩过的那条消息、和别家报道的同一件事不再推荐;
- 「同类新发现」常赞的同类排前面,净踩两次以上的同类先不推荐;
- 卡片上写明起作用的投票,如「按你的投票:猫 +2」。再点一次已选中的按钮是撤销。
流程
流程图:什么时候跑、隔多久、最快多久看到结果、哪些要钱(网页版)
其他图解想细看时再点开:
| 图 | 讲什么 |
|---|---|
| 编排逻辑(图片) | 一条新闻怎么变成网页上的卡片、去重的四道关 |
| 情报来源(图片) | 从哪搜、每一步留下谁、配图回退梯 |
| 改动怎么进 main(图片) | 会话 → 分支 → PR → 合并 → 自动上线 |
| 工作流程图解(图片) | 流程图的长页版,适合手机上看 |
| 合并图(图片) | 10-12 那一次合并的记录 |
设计稿源文件在 design/(Claude 设计画布格式,修改时用)。
分两步,中间用 inbox/ 里的数据文件衔接。
GitHub Actions 的安排:
| 时间 | 做什么 |
|---|---|
| PR 合并进 main 时 | 约 1 分钟:只重新生成网页并发布(render.yml),不用等收集跑完 |
| 每 2 小时 | 收集 → 更新当天的简报网页 → 命中 urgent_patterns 的要紧消息立刻发 Discord(发过的不重发) |
| 每周一 08:47(北京时间) | 发 Discord 周报:过去 7 天每个关注项的要点 + 网页链接 |
| 每天 12:43 · 23:43(北京时间) | Claude 定时任务(AI 编辑)挑出值得报的条目、合并同一件事(标题保留原文语言,不翻译) |
| 新加关注项推送后 | 收集到消息就立刻叫 AI 编辑编一次,不等定时(需要仓库 Secret ROUTINE_FIRE_TOKEN:claude.ai/code/routines → 「关注清单通信 · AI 编辑」→ 编辑 → 添加触发器 → API → 生成令牌) |
items.yaml
│
├─ ingest(收集,免费)
│ 抓取 Google 新闻 / Bing 新闻 / Reddit / Steam / AniList / TMDB / 任意 RSS
│ 过滤 时间窗口 + 关键词 + 与往期去重
│ 输出 inbox/YYYY-MM-DD.json(原始条目、状态变化、封面)
│
└─ publish(出刊)
编排 按优先级:inbox/YYYY-MM-DD.edit.json(人工或 Claude 写的)
> Claude API(summarize: true 时)
版面只放 AI 整理过的报道;还没整理的条目不上版面,列在版面底部折叠的「整理待ち N 件」,
例外是要紧消息(urgent_patterns)马上做「重大」(关键词规则 fallback_stories)。后台ゲート看到整理待ち就叫 AI 编辑
配图 Reddit 图 / 文章预览图 / 作品封面;配色取自作品主视觉
输出 reports/YYYY-MM-DD.json + docs/index.html(GitHub Pages)→ Discord 通知
版面规则:
- 直接回答你最关心问题的新消息(例如公布了测试时间、上线日期)标为重大,单独占满一整行
- 其余第一条做头条大图,后面两条放侧栏,剩下的三栏一排
- 没有新消息的关注项本期不出现;播出状态、价格等只在有变化时才显示
第一次设置
-
开启 GitHub Pages:仓库 Settings → Pages → Build and deployment → Source 选 Deploy from a branch,分支选默认分支,文件夹选
/docs。 简报地址:https://cxelegy.github.io/Wishlist/ -
连接 Claude API(可选,默认不用):只有
summarize: true时才需要,二选一A. Workload Identity Federation(推荐,不需要存任何 Key)
-
在 Claude Console → Settings → Workload identity → Connect workload → 选 GitHub Actions
-
按向导填写,匹配条件这样填(只允许这个仓库的默认分支):
- Subject prefix:
repo:CxElegy/Wishlist:ref:refs/heads/main - Audience:
https://api.anthropic.com - Claims:
repository_owner=CxElegy
- Subject prefix:
-
向导完成后会给出 federation rule ID(
fdrl_开头)和 service account ID(svac_开头);organization ID 在 Settings → Organization -
回到 GitHub:仓库 Settings → Secrets and variables → Actions → Variables 标签页 → New repository variable,添加:
Name Value ANTHROPIC_FEDERATION_RULE_IDfdrl_...ANTHROPIC_ORGANIZATION_ID组织 ID(UUID) ANTHROPIC_SERVICE_ACCOUNT_IDsvac_...这些只是 ID,不是密码,所以放 Variables 而不是 Secrets。
B. API Key:在 Secrets 标签页添加
ANTHROPIC_API_KEY。不配置时,没被 AI 编辑整理的条目先放在「整理待ち」里,等 Claude 定时任务(AI 编辑)整理后再上版面。
-
-
Discord 通知:在 Discord 频道 → 编辑频道 → 整合 → Webhook → 新建 Webhook → 复制 Webhook 网址, 然后在 GitHub 仓库 Settings → Secrets and variables → Actions → Secrets 添加
DISCORD_WEBHOOK_URL。其它可选的 Secrets:
名称 用途 REDDIT_CLIENT_ID/REDDIT_CLIENT_SECRETReddit 常拦截云服务器的匿名请求,用官方 API 才稳定。在 reddit.com/prefs/apps 创建一个 script 类型的应用即可(免费) TMDB_API_KEY关注影视剧时需要,在 themoviedb.org 的账号设置里免费申请 -
数据库(可选,Supabase / Postgres):存「我会喜欢?」的 👍 / 👎 投票、收集到的每条消息、编排后的报道、价格 / 状态历史。没设置时网页上不显示投票按钮,消息也只存在
inbox/。- 在 supabase.com 注册(免费),New project 新建一个项目(名字随意,数据库密码自己记下)。
- 左侧 SQL Editor → 把
db/feedback.sql整段粘贴进去 → Run。建好feedback表:网页只能往里新增投票,读不到也改不了。 再新建一个查询,把db/news.sql粘贴进去 → Run。建好news表:每次收集后写入新消息(同一关注项的同一条链接只存一行),第一次运行会把inbox/里已有的全部补进去;只有 secret key 能读写。 再运行db/history.sql:stories表存编排后的报道(某期重新编排就整期替换),price_history表存价格 / 状态的变化(Steam 价格、播出状态、愿望清单里写的价格,值变了才新增一行)。 再把db/sizes.sql粘贴进去 → Run。建好sizes表:每个关注项的篇幅 S(少,每期最多 3 条、网页上约一行)/ M(中等,5 条)/ L(多,8 条、满满一整屏),表里没有的按 M。 只要建一次表:之后新关注项自动补进表里(items.yaml写了size就用它,没写按 M),items.yaml的size改了也会自动同步。 想自己改:打开网页右上角的 ⚙ 设置(settings.html),点 S / M / L 就行,下次出刊生效;简报正文里不显示篇幅。 设置页不用口令(网页是公开的,知道网址的人也能改;真被乱改,在 Table Editor 里改回来):把db/settings.sql运行一次。 - 项目的 Connect 按钮(或 Project Settings → Data API)里复制 Project URL;Project Settings → API Keys 里复制 publishable key(
sb_publishable_开头)和 secret key(sb_secret_开头)。 - 把 Project URL 和 publishable key 填进
items.yaml的settings→supabase_url/supabase_key(publishable key 本来就是公开给网页用的)。 - secret key 放进 GitHub 仓库 Settings → Secrets and variables → Actions → Secrets,名字
SUPABASE_SERVICE_KEY。不要写进任何文件。
投票在每次出刊(每 2 小时)时读出来学习,同时存一份到
state/feedback.json。 消息、报道、价格每次运行后写进数据库,已同步到哪记在state/db_news.json、db_stories.json、db_prices.json;数据库连不上不影响出刊,下次运行再补。想手动补一次:SUPABASE_SERVICE_KEY=… python scripts/digest.py sync-db。 注意:网页是公开的,知道网址的人理论上也能投票(只能新增);真有乱投,在 Supabase 的 Table Editor 里删掉那几行即可。 -
运行:Actions → 关注清单通信 → Run workflow(勾选“顺便发一次周报”可以测试 Discord)。之后会自动运行;想改频率,改
.github/workflows/digest.yml里的cron。
添加关注项
在网页上加:打开 ⚙ 设置页 最下面的「新增关注项」,只写个名字,然后一问一答:
是哪一个(自动去维基数据查,补上中日韩英的正式名称、Steam / AniList / TMDB 编号和官网)→ 这是什么 → 关注它的哪方面(比如游戏本体还是电竞比赛)
→ 哪些消息要当天推 Discord → 不想看什么 → 新闻语言 → 板块(可以起新板块)→ 篇幅,最后汇总成一张表,都能直接改,提交就行。
已有的关注项点列表里的「改」:直接改汇总表,或者「重新问一遍」。不用口令。
请求存进数据库 item_requests 表(db/item_requests.sql),一提交数据库就立刻叫 GitHub 的「网页请求」工作流处理(db/instant.sql,令牌存在 Supabase Vault),写进 items.yaml、网页更新(事件触发,没有定时轮询;设置页上会显示进度):
新增的追加到末尾、开始收集(往前补抓 first_lookback_days 天),Discord 收到「新增关注项」通知;修改的只改提交了的字段,别的字段和注释不动。
没处理的(名字重复、规则写错)在设置页上写明原因。想更精细(status、配色、背景说明)跟 Claude 说「完善关注项」。
版面主题:每个新关注项都由「AI 编辑」按 TEMPLATES.md 设计版面主题(背景花纹、题字形状、照片边框、点 👍 的演出),先从库里的 30 套挑,挑不到就新做,相似的合并;主题库在 templates/(index.yaml 一览 + 每套一份 CSS,只用作品自己的配色),👍 演出 20 种在 scripts/likefx.py。一览和试玩:テーマ見本。设计好之前先按类型借用相近的主题。
手动加:编辑 items.yaml,文件开头有每个字段的说明。最重要的几个:
keywords:各语言的正式名称都写上priority:你最关心它的什么,比如「什么时候能玩」「第二季什么时候播」「什么时候降价」type:game/anime/show/product/categoryurgent_patterns:什么样的标题算要紧消息(正则),命中就当天通知 Discordtheme:可选,手写配色;不写就从封面自动取色news_langs:新闻语言区。中文用zh-TW(港台媒体);默认不收中国大陆网站(常拦海外服务器、图片防盗链,链接和配图容易失效),某一项确实要大陆新闻时再写上zh-CN
本地运行
pip install -r requirements.txt
python scripts/digest.py --dry-run # 只看抓到了什么,不写文件
python scripts/digest.py # 收集 + 出刊
python scripts/digest.py ingest # 只收集到 inbox/
python scripts/digest.py publish # 只出刊(用最新一份 inbox,有 .edit.json 就按它编排)
python scripts/digest.py render # 改了版式后,用已有数据重新生成网页
python scripts/digest.py notify-urgent # 把还没通知过的要紧消息发到 Discord
python scripts/digest.py notify-weekly # 发过去 7 天的周报
python scripts/digest.py sync-db # 把消息、报道、价格历史写进数据库(需要 SUPABASE_SERVICE_KEY)
python -m unittest discover tests # 运行测试(本地假网站,不联网)
成本
默认完全免费:收集、关键词编排、配图、取色都不调用任何付费接口。
想让 AI 按关注重点挑选和合并(标题保留原文,不翻译),有两种方式:
- 在 Claude 里让 Claude 读
inbox/写.edit.json(用你的 Claude 订阅,不另外付费) - 打开
summarize: true并配置 Claude API(按量付费,默认claude-haiku-5-5,十几个关注项每周大约几美分)
目录
| 路径 | 说明 |
|---|---|
items.yaml |
关注清单和设置 |
scripts/sources.py |
各数据源的抓取,新增数据源加在这里 |
scripts/images.py |
配图:找候选图(含 MSN 文章接口、Bing / Google 新闻上的转载和新闻稿原出处)、实际下载检查、按顺序回退,记录没图的原因(Actions 日志里的 [配图] 行和「配图汇总」);logo / 默认分享图、同一期已经用过的图、验证不了的图都不用;原文已删(404 / 410)的报道不出刊;找不到图的报道在网页上进「其他消息」文字列表 |
scripts/digest.py |
主流程:抓取 → 过滤 → 编辑 → 输出 |
scripts/theme.py |
从封面图提取板块配色 |
scripts/render.py |
简报网页的版式 |
scripts/notify.py |
Discord 通知(要紧消息 / 周报) |
tests/ |
测试 |
inbox/ |
每期收集到的原始条目;.edit.json 是对应的编排 |
reports/ |
每期出刊的数据(JSON) |
docs/ |
简报网页,由 GitHub Pages 发布;docs/design/ 是流程图和架构图 |
design/ |
流程图、架构图、简报样式的设计稿源文件 |
EDITING.md |
AI 编辑的工作规则 |
db/feedback.sql、db/news.sql、db/history.sql、db/photo_inbox.sql、db/sizes.sql |
数据库(Supabase)的建表语句:投票、收集到的消息、编排后的报道和价格历史、拍照加愿望的照片收件箱、每个关注项的篇幅 |
state/ |
已报道的链接、上期状态、配色缓存,请勿手动修改 |
素材のクレジット
- 版面の物のアイコン(テニスボール・ネコ・スキーヤー・剣と盾):Twemoji(CC-BY 4.0)
- 作品の小元素の画像は各ファン Wiki・Wikipedia の画像。切り抜いたものは
docs/emblems/、元の網址はitems.yamlのsource。
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add cxelegy/wishlist