Posted in

使用Cloudflare worker推送telegram消息,实现从墙内推送到墙外

在中国大陆(墙内)使用Cloudflare Workers推送Telegram消息到墙外,需要解决Telegram API被防火长城(GFW)屏蔽的问题。Cloudflare Workers可以通过其边缘计算能力,部署在墙外的节点上,充当反向代理,绕过限制。以下是一个实现方案,包含代码和步骤,假设你已熟悉.NET、ReactJS和VueJS,具备一定的JavaScript基础。

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  // Telegram Bot Token and Chat ID (set these in Cloudflare Worker environment variables)
  const TELEGRAM_BOT_TOKEN = 'YOUR_BOT_TOKEN' // Replace with your bot token
  const TELEGRAM_CHAT_ID = 'YOUR_CHAT_ID' // Replace with your chat ID

  // Check if the request is a POST
  if (request.method !== 'POST') {
    return new Response('Method Not Allowed', { status: 405 })
  }

  try {
    // Parse the incoming JSON payload
    const payload = await request.json()
    const message = payload.message || 'No message provided'

    // Construct Telegram API URL
    const telegramUrl = `https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage`

    // Send message to Telegram
    const response = await fetch(telegramUrl, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        chat_id: TELEGRAM_CHAT_ID,
        text: message,
        parse_mode: 'Markdown' // Optional: supports Markdown formatting
      })
    })

    // Check Telegram API response
    if (!response.ok) {
      const error = await response.text()
      return new Response(`Telegram API error: ${error}`, { status: 500 })
    }

    return new Response('Message sent successfully', { status: 200 })
  } catch (error) {
    return new Response(`Error: ${error.message}`, { status: 500 })
  }
}

实现步骤

  1. 创建Telegram Bot
    • 在Telegram中联系@BotFather,使用/newbot命令创建Bot,获取Bot Token。
    • 获取你的Chat ID(可通过@get_id_bot或发送消息后检查API返回的chat.id)。
  2. 设置Cloudflare Worker
    • 登录Cloudflare仪表板,导航到“Workers and Pages” > “Create Application” > “Create Worker”。
    • 给Worker命名(如telegram-proxy),点击“Deploy”。
    • 点击“Quick Edit”,粘贴上述代码,替换YOUR_BOT_TOKEN和YOUR_CHAT_ID。
    • 为安全起见,建议将TELEGRAM_BOT_TOKEN和TELEGRAM_CHAT_ID设置为环境变量:
      • 在Worker设置中,点击“Settings” > “Variables” > “Add Variable”。
      • 添加TELEGRAM_BOT_TOKEN和TELEGRAM_CHAT_ID,并在代码中通过env.TELEGRAM_BOT_TOKEN和env.TELEGRAM_CHAT_ID引用。
    • 保存并部署Worker,获取Worker URL(形如https://telegram-proxy.your-subdomain.workers.dev)。
  3. 墙内推送消息
    • 在墙内,使用HTTP客户端(例如Python的requests库或你的.NET应用)向Worker URL发送POST请求,包含JSON格式的消息: jsonCopy{ "message": "Hello from China!" } 示例Python代码: pythonCopyimport requests url = "https://telegram-proxy.your-subdomain.workers.dev" payload = {"message": "Hello from China!"} response = requests.post(url, json=payload) print(response.text)
    • Worker接收请求后,通过墙外的Cloudflare节点调用Telegram API,将消息发送到指定Chat ID。
  4. 注意事项
    • 网络限制:中国大陆可能屏蔽Cloudflare的部分IP。建议选择Cloudflare的墙外节点(如香港或新加坡)部署Worker。Cloudflare的JD Cloud合作在中国大陆有约35个数据中心,但为避免GFW干扰,优先选择非大陆节点。
    • Telegram封锁:Telegram在中国被屏蔽,直接访问api.telegram.org不可行。Worker作为代理,需确保其运行在墙外环境。
    • Blob限制:Cloudflare Workers不支持Blob对象,因此无法直接发送图片等二进制数据。如需发送图片,需将图片上传至可公开访问的URL,并通过sendPhoto方法发送。
    • 安全性:为防止滥用,建议在Worker中添加密钥验证。例如,在请求中加入secret字段,并在Worker中检查: javascriptCopyconst SECRET = 'your-secret-key' if (payload.secret !== SECRET) { return new Response('Unauthorized', { status: 401 }) }
  5. 测试与调试
    • 使用curl或Postman向Worker URL发送测试POST请求,确保消息成功发送到Telegram。
    • 检查Worker日志(在Cloudflare仪表板的“Workers” > “Logs”中)以排查错误。

扩展功能

  • 定时推送:使用Cloudflare Cron Triggers设置定时任务,每天推送消息(如天气或通知)。在Worker仪表板的“Triggers”选项卡中配置Cron表达式。
  • 集成AI工具:结合你的AI学习计划,使用Hugging Face模型或Cursor生成消息内容。例如,自动生成每日总结并推送。
  • 多用户支持:扩展Worker,支持多个Chat ID,动态处理不同用户的消息。

保持更新

  • 定期检查Telegram Bot API文档,了解新功能(如MarkdownV2格式或inline按钮)。
  • 关注Cloudflare Workers的更新,学习新API(如Queues或KV存储)以优化性能。
  • 参与GitHub上的相关项目(如cvzi/telegram-bot-cloudflare),获取社区支持。

通过Cloudflare Workers,你可以高效地从墙内推送消息到墙外的Telegram,结合你的技术栈,轻松集成到现有项目中。只要确保Worker部署在墙外节点,就能稳定绕过GFW限制。

One thought on “使用Cloudflare worker推送telegram消息,实现从墙内推送到墙外

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注