Cloudflare Pages 和 Telegram 发布

云端版运行于 https://horizon-cloud.luoxi.workers.dev/。Cloudflare Worker 每天北京时间 09:00 采集 Hacker News 和 RSS,通过 AI Gateway default 调用 Workers AI @cf/zai-org/glm-4.7-flash,把日报存入 KV,并在配置后推送到 Telegram。旧 Cloudflare Pages 首页会跳转到云端版;电脑关机不影响定时运行。

云端版是一个适配 Workers 运行环境的轻量流程,代码见 cloud/worker.mjs。它与本地 Python Horizon 使用同类来源,但不运行完整的本地评分、网页搜索和 Ollama 流程。来源列表在文件开头;公开 Telegram 频道可添加到 TELEGRAM_CHANNELS。改动后运行 wrangler deploy -c cloud/wrangler.jsonc。

Bot Token 和目标聊天 ID 要作为 Worker Secret 设置:

wrangler secret put TELEGRAM_BOT_TOKEN -c cloud/wrangler.jsonc
wrangler secret put TELEGRAM_CHAT_ID -c cloud/wrangler.jsonc

Token 由 BotFather 创建。目标频道中,Bot 必须有发帖权限;私聊中需先向 Bot 发送消息。两个 Secret 配好后,下一次定时任务会发布消息。不要把 Token 写入 wrangler.jsonc 或代码。生成的日报可通过 /api/latest 获取 JSON。

若需要 Bot 采集它已加入的聊天或频道消息,再设置两个 Secret:

wrangler secret put TELEGRAM_WEBHOOK_SECRET -c cloud/wrangler.jsonc
wrangler secret put TELEGRAM_SOURCE_CHAT_IDS -c cloud/wrangler.jsonc

TELEGRAM_SOURCE_CHAT_IDS 为允许采集的数字 chat ID,多个值用逗号分隔;未配置时不会接受任何聊天的内容。使用 Bot API setWebhook 指向 https://horizon-cloud.luoxi.workers.dev/telegram/webhook,并将 secret_token 设为与 TELEGRAM_WEBHOOK_SECRET 相同的值。Bot Token 只用于调用 Bot API,不能放到 Webhook URL 中。Webhook 请求会验证 Telegram 的 Secret Token 头;仅处理白名单内带来源链接的消息。公开频道也可直接在 cloud/worker.mjs 的 TELEGRAM_CHANNELS 中添加用户名,无需 Bot 加入。

本地版与旧静态页面

更新网页

本地版仍可运行 run-local.cmd,也可运行 run-cloudflare.cmd 发布旧静态日报。run-publish.cmd 是依赖开机和本地 Ollama 的旧一体化流程,与云端定时任务独立。

本地版 Telegram

  1. 在 Telegram 用 BotFather 创建 Bot,将 Bot 加入目标频道并授予发帖权限,或在与 Bot 的私聊中先发送一条消息。
  2. 在项目根目录的 .env 写入:

dotenv HORIZON_TELEGRAM_BOT_URL=https://api.telegram.org/bot<token>/sendMessage TELEGRAM_CHAT_ID=@your_channel

私聊可用数字 chat ID。不要把 token 写入仓库、URL 查询串或公开页面。 3. data/config.json 已启用通用 Webhook 的 Telegram 模式,运行 uv run horizon-webhook --dry-run 可预览,uv run horizon-webhook 可测试发送。日常运行 run-local.cmd 时会在日报完成后推送。

推送为一条概览加逐条详情,单条自动限制在 Telegram 的 4096 字符以内。data/config.json 不在 Git 跟踪范围;迁移到新电脑时需保留配置。公开频道采集用 sources.telegram.channels;Bot 采集仅限它已加入的聊天与频道。