一篇关于如何从 0 建起一个 telegram bot 的文章. ( python )
参考内容
github
telegram bot
1 | Bots are third-party applications that run inside Telegram. Users can interact with bots by sending them messages, commands and [inline requests](https://core.telegram.org/bots#inline-mode). You control your bots using HTTPS requests to our [Bot API](https://core.telegram.org/bots/api). |
telegram bot 就是一种特殊的 telegram 账号, 它可以通过后台程序来响应用户的命令.
也正是因为它是一种特殊的 telegram 账号, 所以它并不是直接跟用户做数据交互, 而是中间通过 telegram 的服务端作为中介进行交互.
因此它有一个很重要的优点就是不需要公网 ip 即可运行. 这极大地方便了开发. (省钱).
注册 telegram bot
注册的过程很简单. 首先找到 @BotFather
输入命令 /newbot, 接着按提示填写相关信息就完成了一个 bot 的创建.
需要注意的一点是, bot 的 username 不能以数字开头.
创建完成后, BotFather 会返回 bot 的 api token, 利用这个 token 可以通过代码来让 bot 对用户的命令做出响应.
bot 的信息和配置可以向 BotFather 发送 /mybots 进行查询和设置.
这时无论向 bot 发送什么信息它都不会回复的, 但通过下面的步骤可以一步步地让 bot 对命令做出对应的响应.
配置后台
Telegram bot 提供了 js, python, java 等多种语言的开发包 ( 突然不知道怎么描述这玩意. ). 本文会以 python 作为后端的开发语言. 怎么方便怎么来.
引入依赖包
1 | pip install python-telegram-bot --upgrade |
没啥好介绍的, 速度不行的话翻墙解决.
新建一个 python 文件, 引入依赖
1 | from telegram.ext import (Updater, CommandHandler) |
Hello World
简单地说 Updater 就是接收 token 后, 并暴露出一些方法来供我们控制 bot.
首先创建一个 Updater 对象如下. 这里的 use_context 是 telegram-python-bot api 12 引入的. 为 True 时, 使用新的, 基于上下文的回调 API. 为 False 时, 使用旧的 API.(这里描述不好, 还是参考文档吧~)
1 | updater = Updater(token='Your token', use_context=True) |
接着注册一个分发器( 我自己起的名 ) dispatcher, 这东西就是分发各种命令.
并通过 dispatcher 添加 handler.
1 | dispatcher = updater.dispatcher |
start 方法定义如下:
1 | def start(update, context): |
最后让 updater 开始轮询.
1 | updater.start_polling() |
最后的最后, 运行代码.
如果抛出 NetworkError, 参考 powershell 翻墙. 由于我是用 vscode 写并在上面的 terminal 运行的代码, 所以操作基本一样, 如果是通过别的方法或在别的操作系统上运行的可以参考其他方法.
成功运行后向 bot 发送 /start 指令, 将能看到如下图效果:
其他功能
默认命令提示
通常使用一个 bot 时能看到它有一些默认的命令的提示如下图
要实现这种效果只需要在 BotFather 中操作如下
/mybot -> 选出的你要修改的 bot -> Edit Bot -> Edit Commands, 按提示输入 Command 和 Description 即可.
对命令做出响应
这里参考前面的 Hello World.
对未识别命令做出响应
这里需要用到 Filters, 可以根据不同的配置响应对应的 Message
1 | dispatcher.add_handler(MessageHandler(Filters.command, unknown)) |
inline-keyboard
提供按钮供用户点击. telegram 提供了两种 keyboard, 一种是跟随在消息下面的 inline keyboard, 另一种是在输入框下方 ( 暂时忘了叫啥, 也没搜出来 ). 个人更喜欢 inline keyboard.其效果如下图:
这些按钮是通过一个二维数组来定义的, 第一层为列, 第二层为行. 每个按钮都是一个 InlineKeyboardButton 对象, 常用的两个传入参数为显示的内容 text 和 回调参数 callback_data, 回调参数只能是字符串.
1 | def getKeyBoard(): |
最后在 reply_text 中加入参数 reply_markup=getKeyBoard() 即可.
conversation
通过对话的方式来实现较为复杂的交互
job
让 bot 定时执行任务的一个 api