前置阅读
什么是 Telegram Bot?
Telegram Bot 通过在聊天界面里交谈
来提供服务
如果你只是想提供一个核心服务(或者测试一个产品想法),开发那么 Bot 很适合。
如何创建一个 Bot
因为不需要经过国内复杂的审核备案,创建一个 Telegram Bot 简单的令人发指。
在 Telegram 里添加 @botfather 为好友。
发送 /start
给 BotFather,他便会回复一个命令指引
想要创建一个 Bot, 继续发送 /newbot
即可,BotFather 会问机器人的名字。
我决定命名为苏轼
接下来,BotFather 会让你给机器人设定一个 username
规则是 xxx_bot
我决定叫 sudongpo_bot
Done,创建完成,BotFather 提示你点击 t.me/sudongpo_bot(你的肯定不是这个地址)就可以给你的 Bot 发信息了。
同时,BotFather 会给你一段 Token
,这是控制你的 Bot 的令牌,保存好它,我们后面会用到。
如何控制 Bot?
尝试给你自己的 Bot 发个信息,你会发现……什么反应也没有,当然啦,我们只在 Telegram 创建了这个 Bot,但还没有把 Bot 接入到我们的服务器上。
Telegram 使用 webhook
将 Bot 收到的请求都转发给你的服务器,利用刚才获取到的 Token,给 Telegram 的服务器发个请求,告诉他改把请求都转到哪里。
Telegram 接受请求的地址是
https://api.telegram.org/bot<bot token>/setWebhook
如果你创建 Bot 时获取的 token 是 1231322:AVBNMFGHJKTYUIKOLFGHJ
那么这里的地址就是
https://api.telegram.org/bot1231322:AVBNMFGHJKTYUIKOLFGHJ/setWebhook
发送的字段为
url=https://callback_url
关于如何获取 callback_url 你可以查看这篇博文 使用 ngrok 将 localhost 发布到网上, 如果你获取到的 URL 是 d6a1dd59.ngrok.io
那么这个字段就应该是
url=https://d6a1dd59.ngrok.io/telegram
现在在命令行里执行这段代码,给 Telegram 发送设置请求
curl -X POST -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "url=https://d6a1dd59.ngrok.io/telegram" "https://api.telegram.org/bot1231322:AVBNMFGHJKTYUIKOLFGHJ/setWebhook"
Telegram 设置成功后会给你返回一段 JSON
{
"ok": true,
"result": true,
"description": "Webhook was deleted"
}
OK,现在 Telegram 就会将用户发送的请求转发给你本地的 Server 了。
处理请求
现在我们服务器还不会处理发送到 localhost:8000/telegram
的请求,现在需要给 main.swift
加一个逻辑去处理发送到 /telegram
的请求
import Vapor
import HTTP
let drop = Droplet()
drop.get { request in request.description }
drop.post { request in request.description }
drop.post("/telegram") { request in
var response: String = ""
/// 获取聊天 ID
let chatID: Int = request.data["message", "chat", "id"]?.int ?? 0
/// 获取信息内容
let message: String = request.data["message", "text"]?.string ?? ""
/// 获取对方用户名
var userFirstName: String = request.data["message", "from", "first_name"]?.string ?? ""
/// 创建 JSON 响应
/// 关于响应数据格式 https://core.telegram.org/bots/api#sendmessage
return try JSON(node: [
"method": "sendMessage",
"chat_id": chatID,
"text": "Hi \(userFirstName) Hello!"
]
)
}
drop.run()
关于如何解析 Telegram 发过来的信息格式,可以查看文档
解析来你可以拓展这个逻辑,针对不同的命令作出相应,关于 Bot 都可以做什么,你可以越多 Telegram 的 Bot Deverloper Guide 。
在下一篇文章里,我们会尝试使用 Docker 把这个机器人部署到云端。