前置阅读

什么是 Telegram Bot?

Telegram Bot 通过在聊天界面里交谈来提供服务
20170316148966136917297.png
如果你只是想提供一个核心服务(或者测试一个产品想法),开发那么 Bot 很适合。

如何创建一个 Bot

因为不需要经过国内复杂的审核备案,创建一个 Telegram Bot 简单的令人发指。

在 Telegram 里添加 @botfather 为好友。

20170316148966165987146.png

发送 /start 给 BotFather,他便会回复一个命令指引
2017031614896616963591.png

想要创建一个 Bot, 继续发送 /newbot 即可,BotFather 会问机器人的名字。

20170316148966180352716.png

我决定命名为苏轼

20170316148966186391009.png

接下来,BotFather 会让你给机器人设定一个 username 规则是 xxx_bot 我决定叫 sudongpo_bot

20170316148966197439566.png

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 把这个机器人部署到云端。