1 min read

Node.js 开发 Telegram bot

昨天 Ingress 厦门的 telegram 群里大家在逗机器人,于是自己也想开发一个玩。

首先,在 telegram 里找 @BotFather ,跟它对话,让它创建一个 bot,并且讨要一个 token,token 大概长这样:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

接下来,我们与 bot 对话,或是在带了 bot 玩的群里说话,bot 都能够读取到,它相当于中间的传话者,服务器与 bot 对话的方式有两种:

  1. getUpdates – 我们的服务器主动读取

    拿上面那个假 token 说,GET https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getUpdates 就可以得到数据。

  2. setWebhook – telegram bot 在得到消息后,会主动往我们通过 setWebhook 接口设定的服务器 url POST 数据。

    setWebhook 的用法是,在浏览器中访问 https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/setWebhook?url=https://example.org,页面会返回结果:

    {“ok”:true,”result”:true,”description”:”Webhook was set”}

    返回结果表示 Webhook 设定成功,之后 telegram 就会往 https://example.org 地址 POST 新数据。

    webhook 的地址必需是 https 的,telegram 文档中有提到证书 – 除非你的网站是自己签名的,否则可以不理会该参数。

另外,getUpdates 方法与 setWebhook 只能二选一,不能同时使用。

我用的 node.js 框架是 hapi.js,整个代码大致如下:

const Hapi = require('hapi')
const ajax = require('request')

// Create a server with a host and port
const server = new Hapi.Server()
const token = require('./token')
const api = `https://api.telegram.org/bot${token}/`

server.connection({
  host: 'localhost',
  port: 8888
})

// Add the route
server.route({
  method: 'GET',
  path: '/',
  handler: function (request, reply) {
    return reply('hello world')
  }
})
server.route({
  method: 'POST',
  path: '/' + token,
  handler: function (req, reply) {
    reply('done')
    const message = req.payload.message
    const chat_id = message.from.id
    ajax.post(api + 'sendMessage',
          {
            form: {chat_id: chat_id, text: message.text}
          }, (err, response, body) => {
            if (err) console.log(err)
            console.log('everything is ok: ', body)
          })
  }
})

// Start the server
server.start((err) => {
  if (err) {
    throw err
  }
  console.log('Server running at:', server.info.uri)
})

把代码上传到 vps 上,通过 pm2 启动,并配置 Apache,将指定路由的流量全部转发给 node.js 服务器上

报告问题 修订

如果你有自建 https 代理的需求,欢迎尝试 Phantom,一键搭建,方便快捷。查看 demo