Telegram 是一款非常优秀的聊天软件,它非常重视用户隐私并对所有聊天信息进行加密并做永久存储,它还提供了种类丰富的群组和机器人,机器人是通过程序运作的账号,可以回复我们发送的消息,还可以提供消息的定时推送功能,例如推送新闻、天气预报、提醒事项等。

Telegram 官方为了让开发者能够参与到机器人的开发,还免费提供了功能齐全的 API,我们可以用它创建自己的机器人,下面介绍下如何创建和部署机器人程序。

准备工作

Telegram 支持多种语言来编写机器人,相对来说使用 Python 的比较多,并且有比较成熟的第三方库 python-telegram-bot 供选择使用,所以建议花点时间学习下 Python,掌握基本的开发方式和语法后就可以上手了,然后在开发过程中再去慢慢解决遇到的问题。

建议使用 PyCharm 作为 IDE 来编写程序,这样不仅可以在编写代码时有语法高亮和自动提示,而且还可以更方便的添加第三方库和包管理器,默认的包管理器是 pip,我们可以换成 pipenv,它会自动帮你管理虚拟环境和依赖文件。

下面列出几条 Python 语法中比较特别的地方

  • 代码缩进非常重要,同一代码块中的多行代码强制使用相同数量的空格,否则程序会编译不过
  • 定义变量用 x = 5 就可以了,不用声明是常量还是变量,并且 x 作为 int 类型时,它的长度不受限制
  • python 中的字符串可以直接当数组来用,例: z = ‘abcdefg’ z[0] = a, z[1:3] = bc
  • if 语句中可使用 in 或 not in 关键字,例:if ‘ab’ in ‘abcd’
  • [‘a’, ‘b’, ‘c’] 是 Array,(‘a’, ‘b’, ‘c’) 是 Set
  • 操作数组时索引可以是负数,表示从数组的后面开始按索引查找数据

创建机器人

在 Telegram 应用中通过与 @BotFather 交谈来创建自己的机器人,具体方式跟着引导来操作就可以了,需要注意的是每个机器人都会对应一个 Token,机器人的所有信息交互都会用到它,所以要保管好不要泄漏,避免其他人也能使用你的机器人做事情,创建机器人后可用链接 https://api.telegram.org/bot<token>/getMe 在浏览器里查看机器人信息,并能够看到以下反馈信息。

{
    "ok": true,
    "result": {
        "id": 985878205,
        "is_bot": true,
        "first_name": "万达电影 iOS 团队",
        "username": "WandaFilm_Bot"
    }
}

通过与 BotFather 交谈还能实现很多功能,详见以下图片内容

举个例子

下面这个简单例子可以使机器人能够响应 /start 和 /help 命令,还能够在收到聊天信息时进行回复,需要注意的是,如果你需要 VPN 才能够使用 Telegram,那么在机器人程序里你需要将 VPN 软件中的代理设置写在代码里。

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

def start(update, context):
    update.message.reply_text('Hi!')

def help(update, context):
    update.message.reply_text('Help!')

def echo(update, context):
    update.message.reply_text(update.message.text)

def error(update, context):
    logger.warning('Update "%s" caused error "%s"', update, context.error)

if __name__ == '__main__':
    updater = Updater('<token>', use_context=True, request_kwargs={
        'proxy_url': 'socks5://127.0.0.1:1086/'
    })

    dispatcher = updater.dispatcher

    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("help", help))

    dispatcher.add_handler(MessageHandler(Filters.text, echo))

    dispatcher.add_error_handler(error)

    updater.start_polling()
    updater.idle()

想要了解机器人都能够做些什么事情,可以参考官方提供的 API,还可以参考 python-telegram-bot 提供的 文档Wiki,最后就是发挥你的想象力了~

部署

目前 Telegram 机器人支持两种获取用户消息的方法

  • Long Polling:每隔一段时间通过 getUpdates 获取消息,缺点是会有延迟

  • Webhook:需要设置一个 HTTPS 协议的回调 URL,当有人给机器人发消息时,Telegram 会把消息发送到这个 URL 上,缺点是麻烦一些

下面介绍在使用 Webhook 方式时,如何用最简单的方式将我们的机器人程序部署到 Heroku 云平台所提供的回调地址上

  • 将机器人程序代码放到 GitHub 仓库中,注意不要暴露机器人的 Token,需要提交的仓库中的文件如下

    • bot.py:编写机器人程序的代码文件
    • runtime.txt:描述所使用 python 语言版本的文件
    • requirements.txt:记录程序所使用第三方库的名称和版本号
    • Procfile:记录机器人程序代码所在的文件名
  • 在 Heroku 上注册账号并创建项目,然后再进行以下设置

    • 关联机器人程序所在的 GitHub 仓库和代码分支,目的是当你提交代码到该分支后能够自动部署
    • 将一些如机器人 Token 这类的私密信息以环境变量的形式配置在 Heroku 提供的对应页面中,然后在代码中读取并使用,在本地开发调试程序时也需要将此类信息通过 PyCharm 配置到环境变量中

完整的例子可以参考 https://github.com/lijingcheng/telegram-bot