通过 Cloudflare 页面函数向 Telegram 发消息

发布: 2024-05-07   上次更新: 2024-05-08   分类: 效率工具   标签: cloudflare, telegram, github

文章目录

最近看到不少朋友分享使用 Cloudflare 的各种心得,中转邮箱、图床、CDN 等等不一而足,甚至有一个 awesome-cloudflare 的仓库,里面收集了各种基于 Cloudflare (免费)服务实现的各种工具,“赛博菩萨”名不虚传。

这篇文章就来分享笔者的一个心得,利用 Cloudflare 的页面函数,把 GitHub 中新建 issue、discusstion 这两个事件,发送到指定 Telegram 群组中。

页面函数

页面函数(Pages Functions)允许我们通过 Cloudflare Workers 执行后端代码,来构建全栈应用程序。用法和 Workers 类似。

页面函数位于项目 functions 目录下,文件名就是 URL 路径,比如有这么一个文件 ${ROOT}/functions/helloworld.js ,内容如下:

1
2
3
export function onRequest(context) {
  return new Response("Hello, world!")
}

假设页面服务的域名是 demo.pages.dev ,那么访问 demo.pages.dev/helloworld 就会执行上面的函数,得到 Hello, world! 的返回。

我们这里需要做的就是实现一个页面函数,用来接受 GitHub Webhook 的请求。

常用 API

  • 页面函数接受一个参数 context,类型是 EventContext,主要有下面两个参数:

    • request,类型 Request,里面有 methodheaders 等字段
    • env,类型 EnvWithFetch,主要用来获取环境变量、Secrets。比如 env['TELEGRAM_TOKEN']
  • 页面函数返回值是 Response 对象,常用的方式就是:

    1
    2
    3
    
      return new Response(message, {
        status: 200,
      });
  • Fetch API,新一代网络请求标准(替换早期的 XMLHttpRequest),上面介绍的 Request、Response 类型都是它提供的。更为重要的是它还提供了一个全局函数 fetch ,可以方便进行网络请求。

    1
    2
    3
    
    const response = await fetch("http://example.com/movies.json");
    const movies = await response.json();
    console.log(movies);

常见的任务 Cloudflare 都提供了 examples,照猫画虎即可,不需要多少 JavaScript 技能。

调试

在编写一个新的页面函数时,或多或少都需要进行调试,虽然有 Local development 指南,但笔者用的最多的还是 console.log ,简单类型可以直接打印,对象需要用 JSON.stringify(obj) 处理后一下,否则看到的就是 [Object object] 的输出。

特殊的是 headers,需要用 new Map(request.headers)这里有解释原因,主要是由于 Headers 对象在存储头信息时,没有放在可枚举(Enumerability)的属性中,导致 JSON stringifier 读不到对应字段。

最后,可以通过命令行工具 Wrangler 或 Dashboard 查看日志,具体可参考:Debugging and logging

GitHub webhook

为了能够接收到 GitHub 中一个仓库的事件,需要利用 GitHub 的 webhook,它可以把事件发送到指定 URL 中,对这里来说,即是一个页面函数对应的地址。

创建 Webhook 的方式可以参考:Creating a repository webhook,其中:

Telegram bot

为了能够通过 API 向 Telegram 频道发消息,我们需要申请一个 Bots,之后就可以调用 sendmessage 这个 API 来向指定群组发送消息了。

申请 Bots 的步骤也比较简单,在 Telegram 中搜索 @BotFather,通过和这个 Bot 聊天,即可申请一个新的机器人。这种方式挺巧妙的,整个过程都是在 Telegram App 中完成,用起来十分舒心,没有短信验证、没有扫描二维码,这才是互联网该有的样子!

申请完 Bot 后,会得到一个 token,之后就可以利用这个脚本进行测试:

1
2
3
4
5
export TGSEND_TOKEN=""
export TGSEND_CHATID="@chat_name"
curl "https://api.telegram.org/bot$TGSEND_TOKEN/sendMessage" \
    --data-urlencode "chat_id=$TGSEND_CHATID" \
    --data-urlencode "text=hell world" \

为了之后能向一个群组发送消息,需要提前将这个 Bot 添加到群组中。

完整脚本

github-webhook.js 是一个完整的页面函数,它接受 Github Webhook 请求,针对感兴趣的事件,转发到指定的 Telegram 频道,在使用前需要做以下事项:

  1. 在 Cloudflare Dashboard 里面配置一个 Secrets: TELEGRAM_TOKEN ,具体方式见:Bindings · Cloudflare Pages docs
  2. 修改 CHAT_ID 为需要发送的群组 ID

完成这两步,就可以发布页面函数使用了!

评论

欢迎读者通过邮件与我交流,也可以在 MastodonTwitter 上关注我。