前几天做的小玩具

OhMyPushBot

Telegram 是个有趣的聊天工具,最好玩的就是它十分开放 Bot 系统。相比于微信公众号这种层层审核还一堆限制,或者 QQ、微信 机器人这种强行扒官方协议的灰色接口, Telegram 提供的 API 非常简单。你可以用 Bot 管理 Channel,制作好玩的 Bot,这一切只需要和 BotFather 聊聊天,就可以设置并创建一个Bot,完全不需要等待审核。

制作这个 Bot,最大的用处就是方便一些自动化脚本通知事件结束。一般的场景下,自动化脚本要发送通知,多数使用发送邮件的方案,但是发送邮件需要使用专用的工具。 而且一般的邮件需要自己检查邮件情况,早些年有过黑莓的PushMail服务,几百元一个月的服务费也不是一般人玩得起的。现在好了,Telegram 作为一个免费 IM 工具, 完善的客户端支持(Linux、Windows上都有,各大手机平台也都有),比较实时的推送速度,简直是事件通知最佳的选择。

如何使用

我已经部署了一个实例,挂在我的服务器上做转发。访问 OhMyPushBot,先和 Bot 聊一下天。

  1. 和 Bot 聊天,点击 start 按钮
  2. 点击命令或者手动输入 /url 命令
  3. Bot 会发送给你一个 URL,像是 https://ohmypushbot.zjyl1994.com/send?chatid=1234567890&sign=xxxxxxxxxxxxxxxxxxx
  4. 给刚才的 URL 发送一个 HTTP POST 请求,请求Body中的消息会被投递到您和 Bot 的聊天窗口中
  5. 消息体正文支持 Markdown 格式,请求成功后接口返回 ok ,否则返回错误消息

Markdown 支持

消息体支持的 Markdown 特性 ,原文是英文的,简单翻译如下:

*粗体*
_斜体_
[行内超链接](http://www.example.com/)
[行内提及用户](tg://user?id=123456789)
`行内代码块`
```代码块
预先格式化过的代码块
```

如何实现

原生的 Telegram Bot API 非常好用,只需要你拿到合法的 Bot Token,调用 HTTP 格式的接口,就可以发送消息,也可以用 Webhook 接收用户发来的消息。

这个 Bot 主要使用了两个 API,sendMessagesetWebhook,使用方法可以参见 Telegram Bot API 文档

首先我先使用 setWebhook 挂了一个 Webhook 到 Telegram 服务器,当 Bot 收到消息的时候,Telegram 会主动调用我们的接口,解析 JSON, 可以得到当前聊天的 ChatID,调用 sendMessage 通过 ChatID 可以发送消息到特定的对话中。 具体实现可以参见开源代码的 service.go

为了防止无聊的人随机生成 ChatID 调用接口发送垃圾消息,我增加了一个简单的参数验证,接口的 sign 部分就是 ChatID 根据 BotToken 进行 HMAC-MD5 之后的结果。 如果不知道的人想伪造 sign,从密码学角度来说几乎不可能。而且 HMAC 的 Key 是 BotToken,每个Bot都不一样,所以十分的安全。

开源代码

为了方便各位审计我的代码,我把代码托管到了 GitHub 上,地址是:https://github.com/zjyl1994/telegram-push-bot 欢迎各位大佬和神仙拍砖。