用 Cloudflare Workers 实现 Telegram 群组消息实时转发

免费云平台,比如 Render、Heroku 或 Railway 等免费实例(Free instances)在一段时间没有使用后会自动关闭(spin down)导致无法接收来自telegram 的webhook。

将项目部署到 Cloudflare Workers,就不会有“休眠”问题了

在自动化 Telegram 群组管理中,我们常见的需求是:

  1. 当群成员 A 发送含有 .xlsx 或 .txt 文件的消息;
  2. 将该消息转发给非群成员用户 B 和 C;
  3. 同时让 Bot 自动回复 “收到”。

很多人选择用 VPS 或 Render 服务器部署 Bot,但免费实例会“休眠”,造成消息延迟甚至丢失。今天,我们将用 Cloudflare Workers 实现这个功能 —— 免费、快速、永不休眠!

Cloudflare Workers 是 边缘无服务器架构(serverless at the edge),它的运行机制不同于传统的 VPS 或容器服务:

  • 随请求而激活(cold start 极短)
  • 没有固定的“实例”要维持运行
  • 没有“spin down”或“sleep”的概念
  • 永远在线(只要请求来了就响应)

这也意味着它非常适合:

  • 转发 API 请求
  • 监听 webhook
  • 作为中间代理
  • 运行轻量逻辑(如 chat 转发、文件过滤)

示例应用场景(结合你之前提到的需求):

之前1篇文章通过 Render 实现 “监听群组消息,转发含 txt/xlsx 的内容并自动回复” 的逻辑,这其实也可以 放到 Cloudflare Workers 来做(甚至更优):

  1. 用 Telegram Bot API + webhook 模式部署到 Workers
  2. 检查收到的消息是否有附件
  3. 判断是否是 .txt 或 .xlsx 文件
  4. 使用 fetch 调用 Telegram 的 sendMessage / forwardMessage API 转发给 B 和 C
  5. 自动回复 “收到”

💸 费用也很友好:
Cloudflare Workers 免费版每天有:

  • 10 万次请求
  • 1 GB 传输
  • 不休眠,不关机,不延迟

足够应对大部分中小型自动化场景。

附加建议:
如果你要处理文件下载,可能需要结合:

fetch 获取 Telegram 文件 API或者借助 Cloudflare R2 作为临时存储(如有需要持久化)

把现有功能迁移到 Cloudflare Workers

写好监听 Telegram 群消息 + 过滤 + 转发逻辑

🛠️ 前置准备

Telegram Bot Token
在 @BotFather 创建你的 Bot,并获取 Token。

目标用户或群组 ID(A、B、C)
可通过 @userinfobot 获取 ID,或用 Telegram API 工具查询。

Cloudflare 账号
注册:https://dash.cloudflare.com

编写 Cloudflare Worker 脚本

登录 Cloudflare,进入“Workers & Pages” → 创建 Worker,粘贴以下代码:

const BOT_TOKEN = '7059485476:BBGdXFUQ2HymKW2ectEuTYojqu06aoSZ6Eg';
const A_ID = 5312575488;  // A 的 Telegram 用户 ID(数字)
const RECIPIENT_IDS = [1634258587, 1935050795];  // B 和 C 的用户 ID
const ALLOWED_EXTENSIONS = ['.xls', '.xlsx', '.txt'];

async function sendDocument(chat_id, document_file_id, caption = '') {
  const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendDocument`;
  const body = {
    chat_id,
    document: document_file_id,
    caption,
  };

  const resp = await fetch(url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(body),
  });

  const data = await resp.json();
  if (!data.ok) {
    console.error('sendDocument failed:', data);
  }
  return data;
}

async function sendMessage(chat_id, text) {
  const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`;
  const body = { chat_id, text };

  const resp = await fetch(url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(body),
  });

  const data = await resp.json();
  if (!data.ok) {
    console.error('sendMessage failed:', data);
  }
  return data;
}

function isValidFile(filename) {
  filename = filename.toLowerCase();
  return ALLOWED_EXTENSIONS.some(ext => filename.endsWith(ext));
}

export default {
  async fetch(request) {
    if (request.method !== 'POST') {
      return new Response('Only POST allowed', { status: 405 });
    }

    const update = await request.json();

    try {
      const message = update.message;
      if (!message) return new Response('No message', { status: 200 });

      // 判断是否来自 A
      if (message.from?.id !== A_ID) return new Response('Not from A', { status: 200 });

      // 判断是否有文档
      const doc = message.document;
      if (!doc) return new Response('No document', { status: 200 });

      if (!isValidFile(doc.file_name)) return new Response('File not allowed', { status: 200 });

      // 转发给 B 和 C
      for (const userId of RECIPIENT_IDS) {
        await sendDocument(userId, doc.file_id, message.caption || '');
      }

      // 在群里回复 “A 收到”
      if (message.chat && message.chat.id) {
        await sendMessage(message.chat.id, '收到');
      }

      return new Response('OK', { status: 200 });

    } catch (e) {
      console.error(e);
      return new Response('Error', { status: 500 });
    }
  }
};

替换内容:

‘你的Bot Token’ → 替换成你的真实 Token

‘12345678’, ‘87654321’ → 替换为 B 和 C 的 Telegram 用户 ID

只需要你提供:

  1. Bot 的 token
  2. 群组 ID / 用户 ID(A、B、C)
  3. 使用 Bot webhook(推荐)

配置 Telegram Webhook

我们将使用 https://你的子域.workers.dev/ 作为 Bot 的 Webhook 接收地址。

设置方法在浏览器中打开下面链接:
https://api.telegram.org/bot/setWebhook?url=https://your-worker-url.workers.dev/”

部署并测试

点击 Deploy 按钮,Worker 会生成一个域名(如 yourbot-worker.xxxx.workers.dev)。

回到第一步用的 curl 命令设置 Webhook。

回到你的 Telegram 群组里测试上传 .txt 或 .xlsx 文件,看是否触发转发和自动回复。

效果预期

上传 .txt 或 .xlsx 文件后,Bot 会:

  • 将消息完整转发给 B 和 C(含原文件)
  • 在群组内自动回复:“收到”
  • 没有任何服务器开销、不会休眠、延迟极低!

总结

Cloudflare Workers 是构建轻量型 Telegram 自动化工具的理想选择:

替代传统 VPS,省心省钱

无需考虑服务器部署、端口、休眠等问题

与 Telegram Bot API 天然契合

希望本教程能帮你快速上线你的自动转发机器人。如果你需要更多进阶功能(如识别图片、OCR、自动下载等),我也可以继续帮你拓展。

原文链接:https://jiemahao.com/telegram-bot-automation-with-cloudflare-workers/,转载请注明出处。
0

评论0

请先
显示验证码