开发一个Telegram Bot
1. Telegram
在介绍Telegram Bot之前先认识一下Telegram这个聊天工具.
先来一个直观的感受, 看一下这个Telegram长什么样
Telegram相信很多同学都应该听说过或者用过这个软件, 这个软件简单的说就是一个简版的微信, 但是和微信不同的是这个软件的安全性更加的高, 这里所说的安全性是指你聊天的内容不容易泄露. 当然, 你知道的, 在一个聊天比较安全的环境下就会有一些比较"劲爆"的内容. 这些就不展开讨论了, 有兴趣的同学自行去发现吧. 最近这个软件比较火热, 我觉得有一部分原因是国内的小密圈被封了, 所以很多业界的网红程序员都开了telegram, 比如池建强, 冯大辉等等. 这里有两篇关于Telegram更加详细的介绍, 有兴趣的可以看一下
2. 开发Telegram Bot之前的准备工作
介绍完Telegram之后, Telegram Bot是干嘛的大家看名字就清楚了, 其实就是一个程序, Telegram会将用户发送的信息发送到你配置的一个webhook url上, 这样程序就可以根据用户发送的信息做出响应, 就是这么简单.
Telegram官方或者第三方已经有一些Bot可以使用了, 但是作为有强迫症什么都要亲自做一遍的程序员来说, 自己写一个Bot是肯定的了.
首先, 要写一个能使用的Bot以下的东西是必须要有的
-
Bot Token
这个简单, 这个Token可以直接到BotFather(后面会介绍)申请 -
一个Bot程序
这个是肯定要有的, 这个程序就是对用户消息做出响应的程序. 这个也简单, 直接写一个可以接受Http请求的web程序就可以了(我们每天都在做的事情) -
支持https的公网地址
ngrok
你写的程序肯定是要放到公网上Telegram才能将消息发到你的程序, 而且Telegram要求这个公网地址必须是Https的. 这个要求就有点高了, 难不成为了写了一个Bot还得搞一台云服务器, 买个Https的证书吗? 如果这个Bot是商用或者要推广的这个是必须要的, 但是我的Bot只是为了满足我的强迫症啊!! 所以是时候祭出这个大杀器了 --- ngrok. 这个工具可以将你本地的地址映射成公网的一个地址, 而且它还支持Https. 一起来看一下这个杀器
这样就把一个公网网址映射到你本地的程序了, 所以只要同时启动你的程序和ngrok, Telegram就可以将消息发送到你本地的程序了. 嗯, 简直完美!
3. 正式开发一个Telegram Bot
万事俱备只欠东风, 这个东风就是Bot程序. 所以我开发了一个叫dude的MiscellaneousBot
MiscellaneousBot看这个名字就知道这个Bot可以做很多事情, 但是现在只有一个查询快递物流的功能.
express嗯, 界面是难看了一点, 但是目的是达到了. Telegram Bot接口支持html, 所以这个界面可以改的更加的好看和友好一点.
3.1 实现
这个Bot的思路很简单, 这里说一下(至于具体的实现可以直接看代码, 非常简单.):
-
首先Bot程序要有一个接口用于Telegram回调(也就是之前说的webhook url), 这个webhook url的后面会再解释一下, 由于我们所处的这个网络环境, 用网上的那个curl或者程序的方式设置webhook url基本都是不行的(一直是请求超时), 所以我用了一个比较trick的方式
-
但程序里接收用户的消息之后, 对用户的消息进行校验提取出快递商户名和快递单号, 对于提取方式其实是自定义的, 因为程序会让用户记录一定的格式发送要查询的消息, 我制定的规则是"快递商户名,快递单号". 有了这两个信息就可以查询快递物流信息了. 这里我用的是快递鸟这个免费api, 所以之后要做的就是对接快递鸟提供的api接口了. 这些正是我们每天都在做的事情, 这里就不在赘述了.
-
获取到用户的快递信息之后就可以给用户响应了, 我这里是直接将快递信息返回了, 实际在操作的时候应该要对数据进行格式化之后再返回, Telegram Bot api支持markdown, html等格式, 所以灵活度是很高的.
这样,一个Bot的查询快递的完整流程就完成了.
4. Miscellaneous
4.1 BotFather
BotFather的作用就是帮你初始化一个Bot, 只要在Telegram和BotFather发起聊天, 它就会给你提示, 你只要一步一步按要求回答它的问题, 比如输入Bot名字等等, 一个Bot就创建好了
BotFather4.2 设置webhook url
网上设置webhook url的方式基本都是使用官方的curl(因为我们之间使用ngrok获取了一个https的域名, 如果是自己搭建的服务, 设置webhook url要更加复杂, 具体看官方文档).
curl -X POST -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "url=https://你的webhook url" "https://api.telegram.org/bot你的token/setWebhook"
这样执行基本上就是超时
所以在我都快绝望的时候, 看到官网上有这么一段描述:
trick然后我抱着试一试的心理(比较网上没说这样可以做, 在官网上我也没找到可以这样做的例子),
用了这种方法:
https://api.telegram.org/bot你的token/setWebhook?url=https://你的域名
没想到设置成功了. 也因此有了这个dude Bot
5. 最后
Telegram在我个人看来体验还是很好的,界面很清爽, 作为实时通讯的软件各个功能也都有了, 还是值得用一用的. 其实对于Telegram来说, bot只是它锦上添花的一部分, 最重要的是它的安全性, 而这个安全性的基石MTProto协议应该是值得研究的(虽然我还没有研究...).
基于我们所处的网络环境, 如果想要用一用Telegram, 你先要找把梯子.
如果要开发Bot, 那就看一看Telegram Bot Api
最后, 我的Bot的源代码