不用 n8n:一个 cron + codex exec,每天 8 点自动出 GitHub Trending 中文日报

79 行 bash:curl 抓 GitHub Trending 和 README,codex exec 写中文点评,cron 每天 8 点跑。实测约 43 秒,附完整脚本和踩坑。

13 分钟阅读
不用 n8n:一个 cron + codex exec,每天 8 点自动出 GitHub Trending 中文日报

先看成品。下面是脚本今天(2026-10-12)自动生成的日报节选:只保留了“今日看点”和第 2、7 两条,其余条目删掉了,第 2、7 条也只截取了部分字段(用 …… 标出)。保留下来的句子没有改动,完整原文见文末。

今日看点
今天的主线很明确:Agent 正从“帮你写代码”扩张到逆向分析、制图和视觉创作,工具形态也开始从聊天框转向 MCP、Skill 和专用 IDE。另一边,AnyPS5、AirLLM 都在绕开传统方案的资源开销,但“能跑”不等于“跑得轻松”,兼容性、磁盘和内存账单仍得仔细看。
2. boykopovar/AnyPS5(C++,今日 +3,952 star,GPL-2.0,创建于 2026-08-03)
- 到底干嘛的:把 PS5 可执行文件转换成 Linux 或 Windows 能运行的本地格式,并补上一套可动态链接的系统 PRX 库实现。
- ……
- 有意思的点:它走的是 relinker 路线,不做模拟器,也不启动独立运行时;着色器重编译器可生成 SPIR-V,并能用 SPIRV-Tools 验证。
- 要注意:项目创建才两个多月,兼容范围有限;README 只明确举出《Dreaming Sarah》可在 GTX 1050 Ti 和 i5-7500 上稳定运行 60 fps。……
7. lyogavin/airllm(Jupyter Notebook,今日 +548 star,Apache-2.0,创建于 2023-06-12)
- ……
- 要注意:省显存不等于省其他资源。README 给出的 Qwen3.8-Flash-Next 示例仍需要约 64GB 主机内存和约 360GB checkpoint 磁盘……

注意“要注意”这一栏:它会替你把 README 里的硬件门槛、协议和成熟度挖出来,这比单看 star 数有用得多。完整日报见文末。

每天早上醒来,这份点评就躺在你的文件夹里。这次 43 秒 就生成好了。不用 n8n,也不用服务器面板,一个 bash 脚本加一行 cron 就够了。

适合谁

  • 想每天扫一眼 GitHub 热门,但懒得一个个点进去看英文描述的人;
  • 想给团队群、公众号攒素材的人;
  • 想学 codex exec 怎么放进脚本里跑的人,这是最小、最实用的例子。

准备

  1. Node.js 16+,然后 npm i -g @openai/codex(我用的是 0.162.1)
  2. 一个 AI Code With 的 API Key:注册/登录控制台 后创建
  3. Linux 或 macOS(要有 cron),再加上 curl 和 python3(系统自带的就行)

第一步:把 Codex 配置指向 AI Code With 中转站

打开 Codex 的全局配置 ~/.codex/config.toml(没有就新建),改成下面这样:

toml
model_provider = "aicodewith"
model = "gpt-5.6-sol"

[model_providers.aicodewith]
name = "aicodewith"
base_url = "https://api.aicodewith.ai/chatgpt/v1"
wire_api = "responses"
experimental_bearer_token = "sk-你的Key"
别保留 env_key 那一行,否则 Codex 会报 Missing environment variable: AICW_API_KEY,文件里写的 Key 不会生效。
Key 写在这个配置文件里。日常交互用的配置方法见 Codex CLI 接入文档。

第二步:脚本(复制即用)

第二步标了「复制即用」,但脚本里的 CODEX_BIN 那一行上 cron 前必须改成 which codex 查到的完整路径,否则定时任务会找不到 codex。

建一个文件夹 ~/trending-daily,把脚本保存为里面的 trending-daily.sh,然后 chmod +x trending-daily.sh:

bash
#!/usr/bin/env bash
# 每天抓 GitHub Trending,用 codex exec 生成中文日报
set -euo pipefail
cd "$(dirname "$0")"
# 上 cron 前必须改这一行:换成 which codex 的完整路径
CODEX_BIN="${CODEX_BIN:-$(command -v codex || echo $HOME/.local/bin/codex)}"
DAY=$(date +%F); mkdir -p data reports logs

# 1) 联网抓取放在 codex 外面(codex 沙箱默认不能联网)
curl -sfL --retry 3 "https://github.com/trending?since=daily" -o "data/$DAY.html"
python3 - "$DAY" <<'PY'
import re, html, json, sys
day = sys.argv[1]
t = open(f"data/{day}.html", encoding="utf-8").read()
out = []
for a in t.split('<article class="Box-row')[1:11]:
    m = re.search(r'<h2[^>]*>\s*<a[^>]*href="/([^"]+)"', a)
    if not m: continue                      # GitHub 改版时跳过,别让整份日报挂掉
    name = m.group(1)
    desc = re.search(r'<p class="col-9[^"]*">(.*?)</p>', a, re.S)
    lang = re.search(r'itemprop="programmingLanguage">([^<]+)<', a)
    nums = re.findall(r'</svg>\s*([\d,]+)\s*</a>', a)
    today = re.search(r'([\d,]+) stars? today', a)
    out.append({
        "repo": name, "url": f"https://github.com/{name}",
        "desc": html.unescape(re.sub(r"\s+", " ", desc.group(1))).strip() if desc else "",
        "lang": lang.group(1) if lang else "",
        "stars": nums[0] if nums else "", "forks": nums[1] if len(nums) > 1 else "",
        "stars_today": today.group(1) if today else "",
    })
# 补充每个仓库的 README(截前 2500 字)和基本信息(创建时间、协议)
import urllib.request, re as _re
def get(url, accept):
    req = urllib.request.Request(url, headers={"Accept": accept, "User-Agent": "trending-daily"})
    try:
        with urllib.request.urlopen(req, timeout=20) as r: return r.read().decode("utf-8", "ignore")
    except Exception as e: return ""
for r in out:
    meta = get(f"https://api.github.com/repos/{r['repo']}", "application/vnd.github+json")
    try:
        m = json.loads(meta); r["created_at"] = m.get("created_at", "")[:10]
        r["license"] = (m.get("license") or {}).get("spdx_id") or "无"
    except Exception: r["created_at"] = r["license"] = "未知"
    md = get(f"https://api.github.com/repos/{r['repo']}/readme", "application/vnd.github.raw")
    md = _re.sub(r"<[^>]+>|!\[[^\]]*\]\([^)]*\)", "", md)   # 去掉 HTML 标签和图片
    md = _re.sub(r"\n{3,}", "\n\n", md).strip()
    r["readme"] = md[:2500] if md else "(README 获取失败)"
if not out: sys.exit("一个仓库都没解析到,可能 GitHub 改版了")
json.dump(out, open(f"data/{day}.json", "w"), ensure_ascii=False, indent=1)
print(f"抓到 {len(out)} 个仓库,README 成功 {sum(1 for r in out if not r['readme'].startswith('('))} 个")
PY

# 2) 把数据交给 codex,只让它写字,不让它联网、不让它改文件
PROMPT="你是一个懂技术、说话直的中文科技编辑,给中国开发者写每日 GitHub Trending 点评。
下面是今天($DAY)的榜单 JSON,每个仓库带了 README 前 2500 字、创建日期 created_at 和开源协议 license。
输出中文 Markdown,结构如下:
# GitHub Trending 中文日报 · $DAY
## 今日看点
2-3 句,点出今天榜单的共同趋势或反差,要有观点。
## 榜单
每个仓库:### 序号. owner/repo(语言,今日 +N star,协议,创建于 YYYY-MM-DD)
- **到底干嘛的**:根据 README 用大白话说清楚(1-2 句)
- **有意思的点**:README 里提到的具体技术做法或设计(写具体名词,别写“功能强大”)
- **能用来干嘛**:一个具体使用场景
- **要注意**:成熟度/限制/协议/硬件要求等,比如仓库很新、无协议、README 自称实验性
- 链接
## 编辑推荐
挑 1 个今天最值得动手试的,给出理由和第一步该怎么试(命令或操作要来自 README)。
硬性要求:只用给定数据里的事实,README 没写的不要编,片段里没提到的就写“所给 README 片段未提及”;README 获取失败的就只根据描述写并注明;语气可以活泼、可以吐槽,但不要夸张营销词(颠覆、炸裂、王炸);直接输出 Markdown,不要代码块包裹全文。
数据:
$(cat "data/$DAY.json")"

"$CODEX_BIN" exec --sandbox read-only --skip-git-repo-check --json \
  -o "reports/$DAY.md" "$PROMPT" < /dev/null > "logs/$DAY.jsonl"

grep -o '"usage":{[^}]*}' "logs/$DAY.jsonl" | tail -1
echo "日报已生成:reports/$DAY.md"

思路就四句话:

  • curl 抓页面,python 抽成 JSON。 抓取放在 Codex 外面做,因为 Codex 沙箱默认不能联网。
  • 再给每个仓库补上 README(截前 2500 字)、创建日期和协议,用的是 GitHub 公开 API,不需要 token。这一步是日报从“复述一句描述”变成“真点评”的关键:模型手里有了 README,才写得出具体技术做法和坑。
  • 把 JSON 塞进提示词,让 Codex 只负责写。 用 --sandbox read-only,它既改不了文件也联不了网。但要记住,README 是外部内容,可能夹带“提示注入”,左右日报的措辞或塞进奇怪链接。自己看没关系,要自动推到群里的话,先人工过一眼。
  • -o 把最终回答直接写成 Markdown 文件。 --json 的日志里留着 token 用量。

第三步:手动跑一次

text
./trending-daily.sh

我这里输出的是:

text
抓到 8 个仓库,README 成功 8 个
"usage":{"input_tokens":20626,"cached_input_tokens":12544,"cache_write_input_tokens":0,"output_tokens":2370,"reasoning_output_tokens":91}
日报已生成:reports/2026-10-12.md
(那天 Trending 页面上只有 8 个仓库,脚本最多取 10 个。)

第四步:codex exec 定时任务,交给 cron 每天 8 点跑

用 crontab -e,加一行:

text
0 8 * * * $HOME/trending-daily/trending-daily.sh >> $HOME/trending-daily/logs/cron.log 2>&1
注意:cron 用的是机器本地时区。服务器如果是 UTC,北京时间 8 点要写成 0 0 * * *。macOS 上 cron 需要在系统设置里给 cron 开“完全磁盘访问”权限;苹果更推荐用 launchd,思路一样。

踩过的坑(1~4 是这次真遇到的,其中 1 是用 env -i 模拟 cron 环境时遇到的)

1. 在 cron 里报 codex: command not found。

我用 env -i 模拟 cron 那种几乎为空的环境,结果抓取成功了,到调用 Codex 时挂了。原因是 cron 的 PATH 只有 /usr/bin:/bin,npm 全局装的 codex 不在这里面。最开始我写的是 $(npm prefix -g)/bin,也不行:我的 shell 里设了 NPM_CONFIG_PREFIX,cron 里没有这个变量,算出来的路径就变了。最稳的办法是 which codex 查到绝对路径,写死在 CODEX_BIN 里。

2. 卡在 Reading additional input from stdin...。

在脚本里跑 codex exec,一定要加 < /dev/null,不然它会一直等标准输入。加了以后这行字照样会打印出来,但不会卡住。

3. 日志里有一行 ERROR codex_core::util: OutputTextDelta without active item。

第一版的两次运行都出现了(升级版那次没有),但退出码是 0,日报也完整,可以不管。

4. GitHub API 返回的协议是 NOASSERTION。

pytorch 明明有协议文件,API 却给了 NOASSERTION,因为 GitHub 没能自动识别出是哪种协议。模型老老实实写了“协议未明确”,没有乱猜,但读者可能会误会。想更准确,可以自己去看仓库的 LICENSE 文件。

5.(这次没撞上,提前防一手)不带 token 调 GitHub API 每小时只有 60 次。

每份日报大约调 16 次(每个仓库 2 次),一天跑一次完全够用。调试时连跑好几遍就可能撞上限额,那时 README 会显示“获取失败”,提示词里已经交代模型遇到这种情况只按描述写。

加 README 前后对比

第一版只给模型 Trending 页上那一行描述,写出来是这样(同一天、同一个仓库):

- 一句话:自动把 PS5 可执行文件移植到电脑系统。
- 为什么火:从描述看,它瞄准 PS5 程序移植到 Linux 和 Windows 的自动化需求,题材也足够吸睛。

没错,但基本是在翻译描述,八条全是“从描述看……”。加上 README 之后,模型能写出 relinker、SPIR-V、能稳定运行的具体游戏和硬件、64GB 内存这些具体信息。我挑了 7 处具体说法回 README 原文里搜,都能找到出处。

代价是输入 token 翻倍,输出也翻倍。

实测耗时

两次实测耗时如下:

版本耗时
第一版(只有描述)87 秒
第一版(第二次跑)153 秒
升级版(带 README)43 秒

耗时波动很大(43~153 秒),主要看接口当时的响应速度。

还能怎么玩

  • 推到群里:脚本最后加一行 curl 发到飞书、钉钉或 Telegram 的 webhook,早上群里就有了(这一步我没实际跑);
  • 换数据源:把 since=daily 换成 since=weekly 出周报,或者加上 /trending/python 只看 Python;
  • 只看你关心的:在提示词里加一句"只挑和 AI Agent 相关的"。

相关教程

附:2026-10-12 完整日报(升级版原样输出)

仓库信息来自各项目的 README 和 GitHub 公开数据,版权归原作者;点评由 AI 生成,经人工抽查。这份日报是在脚本加“片段未提及”约束之前生成的,当前脚本的提示词多了这一条。

今日看点

今天的主线很明确:Agent 正从“帮你写代码”扩张到逆向分析、制图和视觉创作,工具形态也开始从聊天框转向 MCP、Skill 和专用 IDE。另一边,AnyPS5、AirLLM 都在绕开传统方案的资源开销,但“能跑”不等于“跑得轻松”,兼容性、磁盘和内存账单仍得仔细看。

榜单

1. morluto/rea(TypeScript,今日 +25,599 star,MIT,创建于 2026-04-14)

  • 到底干嘛的:给 Agent 接上一套逆向工程工具,让它检查原生二进制、JavaScript/Electron 应用、.NET 程序和网站,并拿出证据解释某个功能是怎么实现的。
  • 有意思的点:通过一个 MCP 统一接入分析能力;原生分析可复用 Hopper、Ghidra 或 IDA,静态 JavaScript 分析则不需要原生分析引擎。分析在本地执行,结论会附带证据和局限。
  • 能用来干嘛:看到某款 Electron 应用里不错的交互功能,让 Agent 分析其实现方式,再为自己的项目做一个版本。
  • 要注意:仓库创建仅约半年;原生二进制分析仍依赖 Hopper、Ghidra 或 IDA 这类外部工具。
  • 链接:https://github.com/morluto/rea

2. boykopovar/AnyPS5(C++,今日 +3,952 star,GPL-2.0,创建于 2026-08-03)

  • 到底干嘛的:把 PS5 可执行文件转换成 Linux 或 Windows 能运行的本地格式,并补上一套可动态链接的系统 PRX 库实现。
  • 有意思的点:它走的是 relinker 路线,不做模拟器,也不启动独立运行时;着色器重编译器可生成 SPIR-V,并能用 SPIRV-Tools 验证。
  • 能用来干嘛:在 PC 上研究和验证自己合法取得的 PS5 游戏二进制兼容性。
  • 要注意:项目创建才两个多月,兼容范围有限;README 只明确举出《Dreaming Sarah》可在 GTX 1050 Ti 和 i5-7500 上稳定运行 60 fps。遇到不支持或意外状态会直接抛出 std::runtime_error 并终止进程。GPL-2.0 only 对分发衍生版本有明确约束。
  • 链接:https://github.com/boykopovar/AnyPS5

3. storytold/artcraft(Rust,今日 +2,957 star,Apache-2.0,创建于 2022-03-31)

  • 到底干嘛的:一套面向艺术家、设计师和影视创作者的 AI 图像与视频 IDE,可以先搭场景、定构图和机位,再选择模型生成内容。
  • 有意思的点:同时提供 2D 图层合成、背景移除和绘图工具,以及 3D 合成、图片转网格、角色摆姿和 kitbashing 场景搭建,重点是让构图和镜头可以重复控制。
  • 能用来干嘛:先在同一个虚拟房间里摆好角色和相机,再规划一组环境、人物位置保持一致的连续镜头。
  • 要注意:给出的 README 片段主要介绍创作能力,没有说明支持哪些生成模型、运行硬件要求或当前功能完成度,选型前需要继续核对项目文档。
  • 链接:https://github.com/storytold/artcraft

4. cathrynlavery/diagram-design(HTML,今日 +1,083 star,MIT,创建于 2026-04-16)

  • 到底干嘛的:一个让编码 Agent 生成编辑型图表的 Skill。你用自然语言描述需求,它会挑选图表类型并产出可直接打开的单文件 HTML。
  • 有意思的点:支持 44 种图表,输出为自包含的 HTML + SVG;还能从网站提取配色和字体,让后续图表贴合现有品牌,并支持从 draw.io、Mermaid 或 Excalidraw 导入。
  • 能用来干嘛:让 Agent 为前端、后端、数据库和 Redis 缓存生成一张项目架构图,直接交付给文档或评审会议。
  • 要注意:它依赖支持 Agent Skills 的宿主;README 特别提醒,官方构建只从这个仓库发布,其他名义的目录条目属于非官方副本。涉及联网数据时应先查看 PRIVACY.md。
  • 链接:https://github.com/cathrynlavery/diagram-design

5. bilawalsidhu/gods-eye-view(JavaScript,今日 +886 star,协议未明确,创建于 2026-06-22)

  • 到底干嘛的:把飞机、船舶、卫星、地震、交通和公共摄像头等公开信号叠到一个照片级 3D 地球上,还能通过实时 AI Agent 进行语音控制。
  • 有意思的点:将飞行应答机、船舶信标、轨道要素和地震仪等不同来源统一成可探索图层;程序在本地浏览器运行,初次启动不要求 API Key。
  • 能用来干嘛:在一个界面里从全球态势下钻到某架飞机、某艘船或某条街道,并继续接入自己的空间数据图层。
  • 要注意:并非所有画面都是真实实时观测:交通是在真实道路上根据聚合位置数据模拟的,CCTV 相机姿态和火箭轨迹也只是粗略估算。给定数据未确认其开源协议。
  • 链接:https://github.com/bilawalsidhu/gods-eye-view

6. pytorch/pytorch(Python,今日 +315 star,协议未明确,创建于 2016-08-13)

  • 到底干嘛的:提供类似 NumPy 的张量计算和 GPU 加速,并用动态计算图的自动微分系统构建、训练神经网络。
  • 有意思的点:核心组件包括张量库 torch、基于 tape 的 torch.autograd 和与张量深度集成的 torch.nn;还能配合 NumPy、SciPy 与 Cython 扩展。
  • 能用来干嘛:用 Python 编写需要动态控制流的神经网络训练代码,并把张量计算放到 GPU 上执行。
  • 要注意:不同硬件涉及 NVIDIA CUDA、AMD ROCm、Intel GPU 或 Jetson 等不同安装路径,不能只看一句 pip install 就收工。给定协议字段为 NOASSERTION,README 片段虽列出 License 章节,但未提供具体协议内容。
  • 链接:https://github.com/pytorch/pytorch

7. lyogavin/airllm(Jupyter Notebook,今日 +548 star,Apache-2.0,创建于 2023-06-12)

  • 到底干嘛的:通过逐层流式装载模型权重,把超大模型推理乃至部分训练塞进小显存显卡,而不依赖量化、蒸馏或剪枝。
  • 有意思的点:训练时逐层流入冻结权重、只把 adapter 留在 GPU;对 Kimi K3 采用按专家流式加载,只载入当前 token 实际路由到的专家。Qwen3.8-Flash-Next 的大型 n-gram 表则映射到主机文件。
  • 能用来干嘛:在显存有限的单卡机器上实验 70B 模型推理,避免先做量化或裁剪。
  • 要注意:省显存不等于省其他资源。README 给出的 Qwen3.8-Flash-Next 示例仍需要约 64GB 主机内存和约 360GB checkpoint 磁盘;部分模型还要求特定 Transformers 版本、compressed-tensors、flash-attn 等依赖。
  • 链接:https://github.com/lyogavin/airllm

8. chrislgarry/Apollo-11(Assembly,今日 +466 star,协议未明确,创建于 2014-04-03)

  • 到底干嘛的:保存阿波罗 11 号制导计算机的原始汇编源码,包括指令舱的 Comanche055 和登月舱的 Luminary099。
  • 有意思的点:代码由 Virtual AGC 与 MIT Museum 数字化;项目接受对照原始扫描件修正转录差异的 PR,本质上既是源码仓库,也是数字档案校勘项目。
  • 能用来干嘛:研究阿波罗制导计算机的软件组织方式,或对照 Luminary 099、Comanche 055 原始扫描件参与源码校勘。
  • 要注意:这不是面向现代硬件的通用开发库;项目目标是忠实保存历史源码。给定数据未确认其开源协议。
  • 链接:https://github.com/chrislgarry/Apollo-11

编辑推荐

今天最值得直接动手的是 cathrynlavery/diagram-design。理由很朴素:输入和产物都轻,安装后用自然语言描述需求,就能得到一个双击即可打开的自包含 HTML + SVG 文件,不需要先配置模型权重、逆向工具或特殊硬件。

第一步按 README 安装:

text
npx skills add cathrynlavery/diagram-design

然后直接对 Agent 说:Make me an architecture diagram of my app: frontend, backend, database, Redis cache.

相关文章

Claude Code 怎么控制 Unreal Engine?Epic 官方插件安装、MCP 连接与安全设置(UE5 实操)

Claude Code 怎么控制 Unreal Engine?Epic 官方插件安装、MCP 连接与安全设置(UE5 实操)

Epic Games 在 Anthropic 官方插件市场提供了 Claude Code Unreal Engine 插件 unreal-engine-skills-for-claude-code,配合编辑器里的 Unreal MCP,就能让 Claude Code 直接操作 UE5 编辑器。本文讲清编辑器端要开哪两个插件、怎么启动 MCP 服务、Claude Code 端怎么装插件和验证连接,以及 execute_tool_script 等安全设置。我们用 AICodeWith 的 Key 实测:插件 2.5 秒装好,全程不需要登录 Anthropic 账号。