cloudflare serverless 和 telegram bot 的联动

  • 一个怎样的项目
  • [[Cloudflare]] [[Serverless]] 这边怎么做
  • [[Telegram bot]] 这边怎么做
  • 中间有遇到什么问题

一个抓取汇率的项目,使用无服务边缘函数,需要的时候直接请求即可,初版不提供参数,代码写死,主要是为了验证方案本身的可行性。

大致逻辑

  1. Cloudflare 创建项目,编写代码,包括如何处理 bot 的访问的相关代码
  2. Telegram 申请 bot,获取 API Token,并配置在 Cloudflare 项目的环境参数内
  3. 通过请求 https://api.telegram.org/bot<你的TOKEN>/setWebhook?url=<你的WORKER网址>的方式,让 bot 明白该去怎样相应,大功告成

Cloudflare serverless 怎么做

  1. 在控制台的 Computer & AI 下的 WOkers& Pages 内创建一个Helloworld的项目,起名为 exchangerate
  2. 通过询问Gemini,选择了一个无需key即可请求的api,并书写最简单的代码
export default {
  async fetch(request) {
    // 目标:获取 1 欧元 (EUR) 兑换成 人民币 (CNY) 和 美元 (USD) 的汇率
    const url = "https://api.frankfurter.app/latest?from=EUR&to=CNY,USD";

    try {
      const response = await fetch(url);
      const data = await response.json();

      const cnyRate = data.rates.CNY;
      const usdRate = data.rates.USD;
      const date = data.date;

      const message = `📅 日期: ${date}\n💶 1 EUR = ¥${cnyRate} CNY\n💶 1 EUR = $${usdRate} USD`;

      return new Response(message, {
        headers: { "content-type": "text/plain;charset=UTF-8" },
      });
    } catch (error) {
      return new Response("汇率获取失败: " + error.message, { status: 500 });
    }
  }
};
  1. 上述代码可以直接Deploy,访问后的结果为
📅 日期: 2026-01-11
💶 1 EUR = ¥8.1288 CNY
💶 1 EUR = $1.1642 USD
  1. 修改代码,以人民币为基准,并增加反向汇率计算,更直观的理解
export default {

  async fetch(request) {
    // 目标:获取 1 人民币 (CNY) 兑换成 日元 (JPY) 和 美元 (USD) 的汇率

    const url = "https://api.frankfurter.app/latest?from=CNY&to=JPY,USD";

    try {
      const response = await fetch(url);
      const data = await response.json();
      
      const jpyRate = data.rates.JPY;
      const usdRate = data.rates.USD;
      const date = data.date;

      // 计算,100目标货币对应多少人民币,方便出国后的汇率速算
      const jpy100toCNY = 1 / jpyRate * 100
      const usd100toCNY = 1 / usdRate * 100
      
      // 格式化数字为小数点后两位
      let formatter = new Intl.NumberFormat('zh-CN', {
        minimumFractionDigits: 2,
        maximumFractionDigits: 2,
    });

      const message = `📅 日期: ${date}\n💶 1 CNY = ¥${jpyRate} JPY\n💶 1 CNY = $${usdRate} USD`;
      const message2 = `💶 100 JPY = ¥${formatter.format(jpy100toCNY)} CNY\n💶 100 USD = ¥${formatter.format(usd100toCNY)} CNY`
      const realMessage = message+"\n"+message2

      return new Response(message+"\n"+message2, {
        headers: { "content-type": "text/plain;charset=UTF-8" },
      });
    } catch (error) {
      return new Response("汇率获取失败: " + error.message, { status: 500 });
    }
  }
};
  1. Deploy 后可直接访问,该访问结果在未来会显示在tg bot上
📅 日期: 2026-01-09
💶 1 CNY = ¥22.577 JPY
💶 1 CNY = $0.14322 USD
💶 100 JPY = ¥4.43 CNY
💶 100 USD = ¥698.23 CNY

Telegram bot 怎么做

  1. 在telegram中搜索 @botFather 后创建新的 bot,起个唯一的ID,获取其API Token,类似于 712345678:AAH_xxxx….
  2. 在 cloudflare 的项目内修改代码,增加处理 bot 访问的数据返回,记得Deploy
export default {
  async fetch(request) {
    // 这里建议在 Workers 的 Settings -> Variables 里添加名为 BOT_TOKEN 的变量
    // 如果为了快速测试,也可以直接把 Token 字符串写在这里(不推荐长期使用) 
    const BOT_TOKEN = "你的_TELEGRAM_BOT_TOKEN";

    // 目标:获取 1 人民币 (CNY) 兑换成 日元 (JPY) 和 美元 (USD) 的汇率
    const url = "https://api.frankfurter.app/latest?from=CNY&to=JPY,USD";

    try {
      ...
  
    // 1. 如果是 Telegram 传来的消息 (POST 请求)
    if (request.method === "POST") {
      try {
        const payload = await request.json();
        if (payload.message) {
          const chatId = payload.message.chat.id;
          // 调用 Telegram API 发送回信
          await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
              chat_id: chatId,
              text: messageText,
            }),
          });
        }
      } catch (e) {
        return new Response("Error parsing JSON", { status: 400 });
      }
      return new Response("OK"); // 告诉 Telegram 我们收到了
    }

      return new Response(message+"\n"+message2, {
        headers: { "content-type": "text/plain;charset=UTF-8" },
      });
    } catch (error) {
      return new Response("汇率获取失败: " + error.message, { status: 500 });
    }
  }
};
  1. 绑定Webhook,让telegram bot知道该去请求什么,直接在浏览器中构造网址,访问https://api.telegram.org/bot<你的TOKEN>/setWebhook?url=<你的WORKER网址>,worker地址一般形似.workers.dev,是Cloudflare分配的
  2. 如果网页显示 {"ok":true,"result":true,"description":"Webhook was set"},说明联动成功
  3. 在telegram中搜索该bot的ID,然后开始使用,只要给它输入,它就会返回相关内容

排错

常见的错误为,telegram bot不给相应,此时可以以下方式排查:

  • 访问:https://api.telegram.org/{bot_token}/getWebhookInfo 确认与 Cloudflare 的连接是否有问题
  • 启动 Cloudflare 的流式日志功能,重新发起请求,进行排查