最近看到不少朋友分享使用 Cloudflare 的各种心得,中转邮箱、图床、CDN 等等不一而足,甚至有一个 awesome-cloudflare 的仓库,里面收集了各种基于 Cloudflare (免费)服务实现的各种工具,“赛博菩萨”名不虚传。
这篇文章就来分享笔者的一个心得,利用 Cloudflare 的页面函数,把 GitHub 中新建 issue、discusstion 这两个事件,发送到指定 Telegram 群组中。
页面函数
页面函数(Pages Functions)允许我们通过 Cloudflare Workers 执行后端代码,来构建全栈应用程序。用法和 Workers 类似。
页面函数位于项目 functions
目录下,文件名就是 URL 路径,比如有这么一个文件 ${ROOT}/functions/helloworld.js
,内容如下:
|
|
假设页面服务的域名是 demo.pages.dev
,那么访问 demo.pages.dev/helloworld
就会执行上面的函数,得到 Hello, world!
的返回。
我们这里需要做的就是实现一个页面函数,用来接受 GitHub Webhook 的请求。
常用 API
页面函数接受一个参数 context,类型是 EventContext,主要有下面两个参数:
- request,类型 Request,里面有
method
、headers
等字段 - env,类型 EnvWithFetch,主要用来获取环境变量、Secrets。比如
env['TELEGRAM_TOKEN']
- request,类型 Request,里面有
页面函数返回值是 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,其中:
Payload URL
填写页面函数的地址Content type
选择 JSON,便于页面函数处理。不同事件对应的请求体可以在这里找到,对于我们这里来说,主要是下面这两个:Secret
这里可以先不管,这样也省去了校验的逻辑。如有需要,大家可以参考 Validating webhook deliveries 自行实现Which events would you like to trigger this webhook?
这一项中,选择Let me select individual events.
,之后在选择Issues
、Discussions
这两个,这样就能够接收到创建它们的请求了。
Telegram bot
为了能够通过 API 向 Telegram 频道发消息,我们需要申请一个 Bots,之后就可以调用 sendmessage 这个 API 来向指定群组发送消息了。
申请 Bots 的步骤也比较简单,在 Telegram 中搜索 @BotFather,通过和这个 Bot 聊天,即可申请一个新的机器人。这种方式挺巧妙的,整个过程都是在 Telegram App 中完成,用起来十分舒心,没有短信验证、没有扫描二维码,这才是互联网该有的样子!
申请完 Bot 后,会得到一个 token,之后就可以利用这个脚本进行测试:
|
|
为了之后能向一个群组发送消息,需要提前将这个 Bot 添加到群组中。
完整脚本
github-webhook.js 是一个完整的页面函数,它接受 Github Webhook 请求,针对感兴趣的事件,转发到指定的 Telegram 频道,在使用前需要做以下事项:
- 在 Cloudflare Dashboard 里面配置一个 Secrets:
TELEGRAM_TOKEN
,具体方式见:Bindings · Cloudflare Pages docs , - 修改
CHAT_ID
为需要发送的群组 ID
完成这两步,就可以发布页面函数使用了!