cloudflare serverless 和 telegram bot 的联动
- 一个怎样的项目
- [[Cloudflare]] [[Serverless]] 这边怎么做
- [[Telegram bot]] 这边怎么做
- 中间有遇到什么问题
一个抓取汇率的项目,使用无服务边缘函数,需要的时候直接请求即可,初版不提供参数,代码写死,主要是为了验证方案本身的可行性。
大致逻辑
- Cloudflare 创建项目,编写代码,包括如何处理 bot 的访问的相关代码
- Telegram 申请 bot,获取 API Token,并配置在 Cloudflare 项目的环境参数内
- 通过请求
https://api.telegram.org/bot<你的TOKEN>/setWebhook?url=<你的WORKER网址>的方式,让 bot 明白该去怎样相应,大功告成
Cloudflare serverless 怎么做
- 在控制台的 Computer & AI 下的 WOkers& Pages 内创建一个Helloworld的项目,起名为 exchangerate
- 通过询问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 });
}
}
};
- 上述代码可以直接Deploy,访问后的结果为
📅 日期: 2026-01-11
💶 1 EUR = ¥8.1288 CNY
💶 1 EUR = $1.1642 USD
- 修改代码,以人民币为基准,并增加反向汇率计算,更直观的理解
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 });
}
}
};
- 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 怎么做
- 在telegram中搜索 @botFather 后创建新的 bot,起个唯一的ID,获取其API Token,类似于 712345678:AAH_xxxx….
- 在 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 });
}
}
};
- 绑定Webhook,让telegram bot知道该去请求什么,直接在浏览器中构造网址,访问
https://api.telegram.org/bot<你的TOKEN>/setWebhook?url=<你的WORKER网址>,worker地址一般形似.workers.dev,是Cloudflare分配的 - 如果网页显示
{"ok":true,"result":true,"description":"Webhook was set"},说明联动成功 - 在telegram中搜索该bot的ID,然后开始使用,只要给它输入,它就会返回相关内容
排错
常见的错误为,telegram bot不给相应,此时可以以下方式排查:
- 访问:
https://api.telegram.org/{bot_token}/getWebhookInfo确认与 Cloudflare 的连接是否有问题 - 启动 Cloudflare 的流式日志功能,重新发起请求,进行排查