Hermes 实战 :多渠道接入——日报推送到飞书/Telegram

发布时间:2026/9/3 2:34:09
Hermes 实战 :多渠道接入——日报推送到飞书/Telegram 技能跑起来了结果需要推送到你手上早上 6 点整日报不用你打开任何网页已经躺在飞书群里——标题、要点、链接一条 text 消息。网页要你打开推送才送到手上。本文做两件事给日报推送做一次选型把凭据安全这条底线讲清楚。前几篇日报都结束在 report.html一个网页。网页的宿命是你得记得打开它推送的宿命是它自己跑到你面前。先把这轮要加的东西放进全景图collect → curate → render → report.html是系列第 3 篇《第一个真实任务》就立起来的骨架。这轮新加有digest.md 和 items.json 分叉出一条 push.py → 飞书群。看着轻巧选型、凭据、安全全在这里。版本口径照旧截至 2026-08-28本机实测 Hermes v0.19.0 deepseek-v4-flash。写稿时我核实过上游已迭代到 v0.20 线v0.20.0 代号 Herald2026-08-03 发布。本篇要讲的推送与凭据机制——webhook、gateway、hermes send——不是某个版本临时加的功能是 Hermes 从设计上就有的骨架不悬在版本上。两条路飞书 webhook 还是 Hermes gateway推送渠道从零搭到「能用」差别大得离谱。差距不在代码量在你要不要替对方平台「收消息」。我把选型压成一句话只发不收一条 webhook URL 就够要收要发、要多渠道才轮到 gateway。维度轻量路线飞书 webhook完整路线Hermes gateway凭据一条 webhook URLbot token / 账号.env config.yaml常驻进程不需要需要gateway 常驻收消息只发不收可收可发双向对话适用团队群日报个人全渠道助手轻量路线的主角是飞书自定义机器人在群里加一个「自定义机器人」飞书给你一条 webhook 地址。往这条 URL POST 一段 JSON消息就出现在群里。一条 URL不需要常驻进程不需要账号体系。完整路线的主角是 Hermes gateway一个常驻的消息网关进程把 Telegram、Discord、WhatsApp、微信这些平台和 Hermes 本体接起来。你要给每个平台准备 bot token 或账号配进 Hermes 的配置。两条路我先各写各的——第 3 节走轻量路第 4 节拆完整路。选型的判断标准我留到第 8 节统一给。轻量路线push.py一个纯标准库脚本先写代码。日报推送器 push.py放在 daily-report/ 里只依赖标准库。它干三件事读 digest.md 的前 500 字符当正文、读 items.json 的前几条标题当要点、把这两样拼成飞书 text 消息的 payloadPOST 到 webhook。三个函数就是全部。读数据defload_digest()-str:读 digest.md截前 500 字符作推送正文。try:withopen(digest.md,encodingutf-8)asf:textf.read().strip()exceptFileNotFoundError:return本期未生成汇总digest.md 不存在returntext[:500]defload_headlines(head:int)-list:从 items.json 取前 head 条标题供推送消息使用。try:withopen(items.json,encodingutf-8)asf:datajson.load(f)exceptFileNotFoundError:return[]return[it[title]foritindata.get(items,[])[:head]]拼 payload、发请求defbuild_payload(head:int)-dict:构造飞书 text 消息 payload。lines[【各家 AI 动态日报】,]lines.append(load_digest())titlesload_headlines(head)iftitles:lines.append()lines.append(今日要点)lines.extend(f{i}.{t}fori,tinenumerate(titles,1))return{msg_type:text,content:{text:\n.join(lines)},}defsend(payload:dict,webhook:str)-str:POST 到飞书 webhook返回响应体。datajson.dumps(payload).encode(utf-8)requrllib.request.Request(webhook,datadata,headers{Content-Type:application/json},)withurllib.request.urlopen(req,timeout15)asresp:returnresp.read().decode(utf-8)payload 的格式就一句话这是飞书自定义机器人的标准文本消息体——msg_type是textcontent.text是拼好的一整段正文。我在飞书开放平台文档里核过格式对得上写作日核实。webhook URL 从哪来不写死、不打印从环境变量读ENV_KEYFEISHU_WEBHOOKMAX_ITEMS8# 推送消息里最多带几条标题控制长度这延续了系列第 2 篇《安装部署实战》立下的 key 管理原则——DeepSeek 的 key 走key_env: DS-KEY从环境变量读不写进 config.yaml。凭据进环境变量不进代码。真正发消息前脚本先检查有没有凭据。没凭据就拒绝发送这就是凭据守卫webhookos.environ.get(ENV_KEY,)ifnotwebhook:print(f错误未设置环境变量{ENV_KEY}无法真实推送。,filesys.stderr)print(先 export FEISHU_WEBHOOKhttps://open.feishu.cn/open-apis/bot/v2/hook/你的key或先跑 --dry-run 预览。,filesys.stderr)return1完整路线Hermes gateway让 agent 住进聊天软件轻量路只解决「推出去」。你要在群里跟 agent 对话——问它「今天有什么重点」、让它把某条展开——就得走 gateway。Hermes gateway 是一个常驻消息网关进程。gateway --help第一行就说清它是干什么的Manage the messaging gateway (Telegram, Discord, WhatsApp, Weixin, and more)支持的平台远不止这几个。官方文档列了 20 多个Telegram、Discord、Slack、WhatsApp、Signal、Matrix、钉钉、飞书、企业微信、微信、QQ 机器人……写作日 WebSearch 核实。命令面run/start/stop/restart/status/install/uninstall/list/setup/enroll本机没跑。gateway status逐字✗ Gateway is not running To start: hermes gateway run # Run in foreground hermes gateway install # Install as Windows Scheduled Task (auto-start on login)gateway list逐字✗ default (current) — not running常驻的代价在这两句里就看出来了——要么前台跑着别关要么装成开机自启的服务。gateway 是「常驻」这条路线的核心词。要接 Telegram/Discord/WhatsApp/微信你得先有 bot token 或账号Telegram 找 BotFather 建 bot 拿 tokenDiscord 去开发者后台建应用WhatsApp 走官方云 API 或桥接。这些我本机一个都没配标「待核实」。到这儿你多半已经默认推送 要常驻一个机器人。我第 5 节再拆一层——不一定。中间件hermes send不常驻的推送通道gateway 把消息「收」进来也负责把消息「发」出去。但如果你只需要「发」有一个更薄的入口hermes send。它的帮助文件把定位写得很清楚Pipe text from any shell script to any messaging platform Hermes is already configured for. Reuses the gateways platform credentials (~/.hermes/.env ~/.hermes/config.yaml) — no LLM, no agent loop, no running gateway required for bot-token platforms like Telegram/Discord/Slack/Signal.翻译成大白话把任意 shell 脚本的输出管到任何 Hermes 已配置好的消息平台。复用 gateway 配好的凭据没有 LLM、没有 agent loop对 Telegram/Discord/Slack/Signal 这类 bot-token 平台不需要常驻 gateway。参数就几个-t指定平台或频道、-f从文件读正文、-s加一行标题、-q安静模式。典型用法就是把日报文本喂给它cat digest.md | hermes send --to telegram一个细节先记住帮助里的~/.hermes是 Unix 路径。Windows 上 Hermes home 是%LOCALAPPDATA%\hermes系列第 4 篇《记忆系统拆解》讲过凭据就放在那里的.env和config.yaml。bot-token 平台hermes send 直连对方平台的 REST 接口不需要 gateway 常驻。gateway 常驻的价值在「收」——守着群聊等消息进来只在「发」的场景脚本和定时任务配好凭据后直接 hermes send 就推走了。这就是后面 H7 调度要用的推送通道。凭据安全webhook URL 和 bot token都不进代码这一节最容易被跳过但它是底线。我直接给判断凡是能替你把消息发出去的字符串——webhook URL、bot token——都按密码对待。三个「不」不进代码——不写死在 push.py 里不进提交——.env 进 .gitignore不进文章——本篇不会出现任何真实凭据。凭据从哪来、进到哪去画成一张流向图流向是单向的凭据只存在于「运行环境」进程从环境变量或本地配置文件读它用完即弃不打印、不落日志。push.py 靠os.environ.get(ENV_KEY, )读没读到就拒绝发送——上一节那个守卫的完整报错逐字是错误未设置环境变量 FEISHU_WEBHOOK无法真实推送。 先 export FEISHU_WEBHOOKhttps://open.feishu.cn/open-apis/bot/v2/hook/你的key或先跑 --dry-run 预览。你看没凭据脚本根本不给你发。这是「凭据不进代码」最直接的好处脚本本身是安全的泄不泄密取决于运行环境不取决于代码仓库。再交代一个诚实的细节飞书官方建议给自定义机器人开启签名校验——加一个 secret发消息时按 HMAC-SHA256 生成 sign、带 timestamp写作日核实。我演示用的是最朴素的裸 webhook团队群内部够用生产环境建议按官方文档把签名补上。这层实现我没做算半个「待核实」。载体项目落地推送链路成型镜头拉回载体项目。整条链路现在是collect.py 抓源 → curate.py 调 Hermes 汇总 → render.py 出网页末尾多一档 push.py 推送。就是引言那张全景图。真跑一遍 dry-run验证推送内容长什么样——PYTHONIOENCODINGutf-8 python push.py --dry-run --head 3--head 3指标题只带前 3 条。输出逐字取自本机 DRY RUN将推送给飞书的消息 payload不发 【各家 AI 动态日报】 今日无新动态24 条与昨日已报道重复已剔除。日报沿用昨日内容。 今日要点 1. Supporting Thailand’s next generation of AI startups 2. Better answers, broader thinking: What students gain from ChatGPT and critical-thinking training 3. Expanding OpenAI’s presence in Brazil payload 共 251 字符这条输出里藏着两个信号。一个是 digest——「今日无新动态24 条与昨日已报道重复」这是系列第 4 篇《记忆系统拆解》那个跨天去重 count0 守卫的产物昨天报过的今天重复curate.py 不白调 Hermes沿用昨日内容。另一个是标题——三条全是 OpenAIitems.json 按抓取顺序排OpenAI 的 RSS 在前。推送和网页看到的是同一份数据只是换了送达方式。真实推送我没发缺 FEISHU_WEBHOOK 凭据标「待核实」。这正是脚本设计的本意——凭据不进代码脚本没有凭据就发不出去只能 dry-run 预览。Telegram 同理缺 bot token标「待核实」。什么时候用 webhook什么时候上 gateway结论先放团队群日报webhook 够用个人全渠道助手才轮到 gateway。差别不在「渠道数量」这一个维度上。我压成三个判断标准推送频率、渠道数量、要不要收消息。推送频率——一天一次webhook 一条 URL 就够每分钟都要发才需要正经管道。渠道数量——只推一个群webhook要同时到 Telegram、Discord、微信gateway 或 hermes send 一次配好。要不要收消息——这条最锋利。日报只发不收webhook 和 hermes send 都够你要在群里跟 agent 对话、让它回你「今天有什么重点」那就必须 gateway——双向通信需要一个常驻的接收端。反过来读更扎心很多人以为「推送 要个常驻机器人」其实只发不收的话一条 URL 就够了。gateway 的价值在「收」不在「发」。结论推送把日报送到手上还差「到点自动跑」回到开头那个画面。日报现在能推了——push.py dry-run 跑通凭据配好就能发。但还差最后一块拼图6 点整那一下谁来触发现在全靠人肉。每天 6 点手动跑一遍 push.py那不叫自动化叫「每天记得按一下」。这也正好接上系列第 6 篇《技能系统实战》的缺口——技能会跑但没到点自动跑。下一篇揭秘让日报每天 6:00 无人值守地跑完 collect → curate → render → push 整条链。cron 就是那个「到点自动跑」的答案。关注别走丢下一篇拆调度。