如何写一个简单的 tg bot
起因
为了试用一下 vercel ,因此写一个转发 twitter 的简易 bot,bot 本身不难,主要还是把整个过程串联起来
其中实际用到的东西
- vercel 提供 faas 服务,是 tg bot 的服务的
- telegraf telegram 的api封装库,实际上没有深入使用,直接用 telegram原生 api 库也可以
- iftt 中转
前期准备
申请一个 bot
要写一个 bot ,需要先申请一个 tg bot
这里可以参考 https://core.telegram.org/bots 进行 bot 的申请,非常简单,这里不作过多说明了
ps:申请 bot 的方式实际上也是通过一个 bot @bot_father 进行申请(
申请成功之后,你会获得一个 token 作为你的 bot 的认证 token,后续和服务的端沟通全靠他
twitter 账号与 iftt
既然是 twitter 转发 bot ,那也必须要一个 twitter 账号。
iftt 中转接入
其实原来我是想直接申请 twitter 的开发者权限直接使用 twitter sdk 的,无奈 twitter 的开发这权限申请现在越发严格,由于是个简单的 bot ,我也就懒得去搞了
而作为替代 iftt 本身恰好提供了转发特定 twitter 账号内容的功能,恰好够用。
所以,参照 iftt 的说明注册一个账号,并关联到你的 twittter 账号,这样,你就可以通过 iftt 抓取特定的账号内容了
vercel 服务
当然作为服务的核心,vercel 也需要申请一个。
bot 转发 twitter 到 tg
写一个 webhook 并部署到 vercel
安装 verlcel-cli 并登录
1 | npm i -g vercel |
这个时候 vercel 需要你输入你的账号绑定的邮箱,接着会往你的邮箱里发送确认邮件,确认后就可以在 terminal 环境下操作了
初始化项目
vercel 绝大多数功能可以直接在 cli 上操作,而不需到 web 中操作
1 | mkdir tg-bot && cd tg-bot |
通过以上代码构建一个基本的项目
然后执行 vercel
vercel 就会默认把当前目录作为一个新的项目进行初始化
接来会有一系列的配置项需要你 y/n ,这个在后续有需要的时候可以根据文档选择
但这里,只需要一路 enter 即可
到这里实际上你已经搭建起了一个 severless 的项目了 ,api
下面的 js文件在发布后会自动部署为一个 http sever 接口
简易的代码
到这,我们终于可以开始写代码了。
vercel serverless 的基本写如下
1 | import { NowRequest, NowResponse } from '@now/node' |
通过 vercel --dev
启动开发环境,这个时候访问相应的 localhost:3000/api/bot` 就能获得相应的返回
这个时候访问 web 可以看到 tg-bot 应该就被部署了,并且 vercel 会根据项目名分配一个域名给你 例如 tg-bot-[hash].now.sh
这个后面会用到
iftt 关联中转
我们这时候可以暂且把代码先放下,先把把 iftt 配置起来
参照文档 ,creat 自建 applet
this 条件选中 twitter >
**New tweet by a specific user**
并输入想要获取的 twitter 账号that 选中
Make a web request
- method 并选择 post ,
- url 填入上面给出的域名地址,完整的地址应该是
https://t-bot-[hash].now.sh/api/bot
- content Type按需配置,这里选 json
- body 可以通过 add ingredient 来配置 要转发那些 twitter 字段,不过要注意的是,我们要完整转发 teweet 的内容会包含 html 所以需要特殊字符通过转义,例如
1
2
3
4
5
6
7{
"Text":"<<<{{Text}}>>>",
"UserName":"<<<{{UserName}}>>>",
"TweetEmbedCode":"<<<{{TweetEmbedCode}}>>>",
"CreatedAt":"<<<{{CreatedAt}}>>>" ,
"LinkToTweet":"<<< {{LinkToTweet}}>>>"
}
配置完成后,当目标用户发新推特的时候就会转发到我们配置 bot 接口上了
过滤内容并转发
输入端解决了之后,我么可以回过来继续我们的 bot 代码了
环境变量配置
为了和我们的 bot 关联起来,我们需要用岛 bot 的相应 token,为了安全,这里需要通过配置token到环境变量中使用。
此外,转发的内容到特定的 chat 或者channel ,也需要确定相应的 chatId,chatId 不如token 私密,因此也可以直接硬编码。
不过放到环境变量的话就可以方便的替换,不需要每次更换都发布一遍。
vercel 设置环境变量有两种方式,
- 直接
vercel secrets add my-secret "my value"
在命令行下操作 - 在 web 端相应的项目 setting 下添加都可以
比如我们此处添加
1 | vercel secrets add token "token" |
接着新增一个 now.json 文件
1 | { |
secrets add
是把变量添加到 vercel 中管理,而 now.json 中的配置才是具体指定有哪些环境变量。
从这里也可以看出,如果只要定义环境变量的话可以直接在 now.json 中配置,如:
1 | { |
参数配置后了之后,代码就很简单了
1 | import Telegraf from 'telegraf' |
接下来,只需要 vercel --prod
一个 bot 就完成部署了
问题
本地开发时候的环境变量
vercel secret
和 now.json 配置的变量适用于正式环境,开发环境需要用到这些环境的话
需要添加一个 .env 文件然后显示设置
1 | tg_token=token |
不显示目录结构
vercel 默认发布项目会把整个项目部署当服务,除了 api 文件夹下的文件会被转化成接口,整个根目录文件夹,也会以目录的形式爆出来,如果不希望了样的话,可以简单的添加一个 index.html 文件,这样就不会把整个项目文件暴露出去了
总结
本文简单的通过 vercel 搭建了一个 tg bot