0%

telegram bot hello world

一篇关于如何从 0 建起一个 telegram bot 的文章. ( python )

参考内容

telegram bot 介绍

telegram python api docs

github

12306 spy

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 进行查询和设置.

Image

这时无论向 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

telegram.ext.Updater docs

简单地说 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
2
dispatcher = updater.dispatcher
dispatcher.add_handler(CommandHandler('start', start))

start 方法定义如下:

1
2
def start(update, context):
update.message.reply_text('Hello World')

最后让 updater 开始轮询.

1
updater.start_polling()

最后的最后, 运行代码.

如果抛出 NetworkError, 参考 powershell 翻墙. 由于我是用 vscode 写并在上面的 terminal 运行的代码, 所以操作基本一样, 如果是通过别的方法或在别的操作系统上运行的可以参考其他方法.

成功运行后向 bot 发送 /start 指令, 将能看到如下图效果:

Image

其他功能

默认命令提示

通常使用一个 bot 时能看到它有一些默认的命令的提示如下图

Image

要实现这种效果只需要在 BotFather 中操作如下

/mybot -> 选出的你要修改的 bot -> Edit Bot -> Edit Commands, 按提示输入 Command 和 Description 即可.

对命令做出响应

这里参考前面的 Hello World.

对未识别命令做出响应

这里需要用到 Filters, 可以根据不同的配置响应对应的 Message

1
2
dispatcher.add_handler(MessageHandler(Filters.command, unknown))
# 这里的 unknow 方法就随便写啦, 同样参照前面的 Hello World

inline-keyboard

提供按钮供用户点击. telegram 提供了两种 keyboard, 一种是跟随在消息下面的 inline keyboard, 另一种是在输入框下方 ( 暂时忘了叫啥, 也没搜出来 ). 个人更喜欢 inline keyboard.其效果如下图:

Image

这些按钮是通过一个二维数组来定义的, 第一层为列, 第二层为行. 每个按钮都是一个 InlineKeyboardButton 对象, 常用的两个传入参数为显示的内容 text 和 回调参数 callback_data, 回调参数只能是字符串.

1
2
3
4
5
6
7
8
9
10
def getKeyBoard():
keyboard = [[
InlineKeyboardButton('API Token'), InlineKeyboardButton('Edit Bot')
],[
InlineKeyboardButton('Bot Settings'), InlineKeyboardButton('Payments')
],[
InlineKeyboardButton('Delete Bot'), InlineKeyboardButton('<< Back to Bots List')
]]
# 接着再把它交给 InlineKeyboardMarkup 处理, 这个函数会返回处理后的 keyboard, 这里就不深究它怎么实现的.
InlineKeyboardMarkup(keyboard)

最后在 reply_text 中加入参数 reply_markup=getKeyBoard() 即可.

conversation

通过对话的方式来实现较为复杂的交互

job

让 bot 定时执行任务的一个 api