Telegram-Bot 的注册和使用 Python 编写机器人

I might have made some mistakes, please let me know if I’ve gotten anything wrong!

先自荐一个 tg 转发机器人，避免存入 tg 收藏夹然后吃灰。

项目地址： AhFeil/extract_forward_tgbot: 存储转发给它的消息到文件中，并能推送到网页，方便查看编辑信息 (github.com)

它的最基本使用： （更多请查看 GitHub 项目首页）

把消息转存给它（只支持纯文本消息和图片附带消息那种），或者直接发消息

它会提取其中的文本和内链网址并将之存在文件里，内链网址会按照顺序放到文本后面。

发送命令 /push ，它会将上面文件里的全部内容复制到另一个方便访问的文件中，目前用的是 网页记事本，访问对应网页就能看到。

在电脑访问网页，查看并高效处理。

在 Telegram 注册机器人和配置等

注册一个机器人 (Bot)

注册过程很简单，在 telegram 中向 “机器人之父” 发消息，即 https://t.me/BotFather 这个机器人：

打开与 @BotFather 的对话框

发送 /start （开始）

发送 /newbot

发送 Bot 的 name（名称、昵称）

指定 Bot 的 username（用户名、ID），注意这个用户名必须以 bot 结尾，而且不能更改

如果没重名，注册完成，发来的消息中有 Bot 的 token，格式是这样的： 6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU

保存好 token ，不要泄露

获取 chat_id

先注册好机器人，点 start 后，向新注册的机器人随意发送消息，然后打开网址：

Copy
# 修改里面的 token 部分，前面的 bot 别删了
https://api.telegram.org/bot6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU/getupdates

其中 "chat" 里的 "id" 就是发消息账户的 chat_id，保存。

向 Bot 添加指令

指令的本质是以 / 开头的文本，因此可以直接发送 /指令 触发

通过 BotFather 来为 Bot 设置指令，流程是，发送 /setcommands ，然后选中要修改的机器人，接着按照格式发送指令列表即可，格式如下：

Copy
start - 看看我能干什么
forward - 推送到网页
emsg - 保存里的最早的一条消息
dmsg - 删最新的一条并返回文本
shutdown - 停止运行
clear - 清空转存信息

之后点 Bot 输入框左边的 M 即可看见设置的指令列表。

配置 Bot 的个性化介绍

发送 /mybots ，选择一个机器人，接着【Edit Bot】，这里面能编辑名称、头像和介绍，还有指令。

其中 About 编辑的是下面界面展示的

Description 则是第一次进入机器人时的这个界面：

实际上，也可以在机器人的对话框处找到编辑介绍信息的选项，电脑、手机皆可，更方便。

Telegram-Bot 官方

官方文档： Bots: An introduction for developers (telegram.org)
tg 官方列的一些库： Bot API Library Examples (telegram.org)

一些限制

不完整，仅是记录

注意： 机器人必须设置为频道管理员，否则无法发送消息

频道必须设置为公开

在频道可以通过 @name 发消息，对个人不行，只能通过 chat_id 才行

并且，机器人只能在用户向它发过消息，或将机器人加入一个群组之后，才能主动向用户发消息。机器人不能向陌生用户主动发消息。

custom keyboard & inline keyboard

Customer keyboard 和 inline keyboard 有以下几点区别：

inline keyboard 出现在输入区之上，而 custom keyboard 出现在键盘输入区之下；

按下 inline keyboard 会返回给 bot 一个 callback query，而按下 custom keyboard 只后只会给 bot 发送一条文本信息，本质和同为文本的 command 是一样的。

用浏览器直接查看（webhook）

在编写代码之前，可以先手动用 webhook 查看机器人收到的信息，有个直观的认识

Telegram 的 API 接口形式是 URL，它和我们平常使用的网址是类似的。

可以将以下的 URL 复制在浏览器的网址栏中，将 Your Token 替换为实际的 Token，然后访问：

Copy
https://api.telegram.org/botYour Token/getupdates

# 就比如，这样
https://api.telegram.org/bot6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU/getupdates

向 bot 发送一条消息之后，刷新浏览器，你会得到以下类似下面的 Message：

Copy
{'chat': {'first_name': 'Jean',
'id': 24601,
'last_name': 'Valjean',
'type': 'private',
'username': 'MonsierMadeleine'},
'date': 17691833,
'from': {'first_name': 'Jean',
'id': 24601,
'is_bot': False,
'last_name': 'Valjean',
'username': 'MonsierMadeleine'},
'message_id': 7417,
'text': 'I am warning you Javert'}

message 以 json 的形式被包装和发送，它的本质是 nested dictionary，也就是 dictionary 包了一层 dictionary。

如果你在地址栏中键入如下 URL：

Copy
https://api.telegram.org/botYour Token/sendMessage?chat_id="Some Chat id"&text="Hello"

https://api.telegram.org/bot6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU/sendMessage?chat_id=2066666604&text="Hello"

替换为实际的 Token 和 chat ID，编辑 text，回车后，你的 Bot 就会将”Hello“发送给指定用户。

形式类似地，Telegram 规定了很多功能，比如 sendMessage，sendPhoto 等。

message 的 key 包括 chat (用户的名字，ID 和聊天的种类），date（消息发送的日期），from（发送者的信息），message_id（指向特定的一条信息），而 text 就是用户所发送消息的文本。

在 telegram 中，聊天的种类分为三种，private, group 以及 channel

python-telegram-bot

选一种编程语言，和封装 API 的库，方便开发。

这里使用 Python ，库使用 python-telegram-bot ，方便快速操作官方 API，其相关网站如下：

GitHub 地址： https://github.com/python-telegram-bot/python-telegram-bot

文档： http://python-telegram-bot.org/

官方的例子，可以学习： Examples - v20.4

推荐创建三个文件，比如 extract_forward_tgbot.py 和 tgbotBehavior.py ，前一个用来 设置路由和注册以启动路由，后一个放具体的函数（定义机器人动作）。

还有 config.py ，用来配置 token 等配置信息的。

流程图来了！

实际编写

我是看这个库 wiki 入门的： Extensions Your first Bot (github.com)。

可以看一遍下面 AhFei 写的小例子，起码是中文，好理解一些。再看官方 wiki ，其实更多的也没必要写，官方的文档才是最好的参考。

这个例子只需要填入 bot_token ，剩下的完全复制粘贴就能运行（如果是国内网络，还需要配置代理地址）。

推荐有兴趣的可以先跑一遍，成功的话再修改。

先拉库（Python 3.7+）

Copy
pip3 install python-telegram-bot~=20.3

先看 config.py ，配置 bot_token ，还有代理地址即可。

Copy
# config.py
import platform
from enum import Enum
import os
import sys

# 将参数值赋给变量
bot_token = "6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU"

# 下面跟机器人没什么关系，主要作用方便开发，如果在 Windows ，则说明是开发环境，配置代理和修改一些变量的值，如果是 Linux，就是生产环境

system = platform.system() # 获取操作系统名字

if system == 'Windows':
# 处于开发环境
os.environ["http_proxy"] = "http://127.0.0.1:10809"
os.environ["https_proxy"] = "http://127.0.0.1:10809"
elif system == 'Linux':
# 处于生产环境
pass
else:
# 直接退出
sys.exit('Unknown system.')

再看 extract_forward_tgbot.py ，这里就导入三个动作，start, myid, transfer ，并配置路由，也就是

机器人收到 '/start' 后，就执行 start 函数

机器人收到 '/myid' 后，就执行 myid 函数

机器人收到指令之外的内容，就执行 transfer 函数

暂时从我的项目，转发机器人里抽出来的代码，以后有空改成简单又有实际应用的具体例子。

这个是我们的主程序，需要 python3 extract_forward_tgbot.py 启动程序。

Copy
# extract_forward_tgbot.py

from telegram import Update # 获取消息队列的
from telegram.ext import filters, MessageHandler, ApplicationBuilder, CommandHandler, ContextTypes

import config
# 从 tgbotBehavior.py 导入定义机器人动作的函数
from tgbotBehavior import start, transfer, myid

if __name__ == '__main__':
# 创建实例的，在这里放入 token
application = ApplicationBuilder().token(config.bot_token).build()

# 类似路由，接收到 /start 执行哪个函数，左边是指令，右边是定义动作的函数
start_handler = CommandHandler('start', start)
# (~filters.COMMAND) 就是指令之外的消息
transfer_handler = MessageHandler((~filters.COMMAND), transfer)
#
myid_handler = CommandHandler('myid', myid)

# 注册 start_handler ，以便调度
application.add_handler(start_handler)
application.add_handler(transfer_handler)
application.add_handler(myid_handler)

# 启动，直到按 Ctrl-C
application.run_polling(allowed_updates=Update.ALL_TYPES)

最后看 tgbotBehavior.py ，就是定义机器人的各种动作。

Copy
# tgbotBehavior.py

from telegram import Update
from telegram.ext import ContextTypes

import config

# 回复固定内容
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
# 定义一些行为

# 向发来 /start 的用户发送消息
await context.bot.send_message(chat_id=update.effective_chat.id,
text=f"这是一个转存机器人")

# 返回 ID
async def myid(update: Update, context: ContextTypes.DEFAULT_TYPE):
# update.effective_chat.id 可以就是与机器人交流的用户的 chat id
your_chat_id = update.effective_chat.id

await context.bot.send_message(chat_id=update.effective_chat.id, text=f'你的 chat id 是 {your_chat_id}')

async def transfer(update: Update, context: ContextTypes.DEFAULT_TYPE):
# 定义一些行为
# 省略
pass

运行主程序后，

发送 /start ，就会收到 “这是一个转存机器人”，

发送 /myid，就会收到 “你的 chat id 是 123456789”

其他信息则没有任何回应

其实结构蛮清晰的，先编写定义动作的函数，再配置路由和使能。
参考文档就能编写出功能丰富的机器人啦！

使用 systemd 守护进程

实际在 Linux 上运行机器人时，使用 systemd 守护进程是持久运行的好方法，具体配置可以参考本站的这篇文章： Telegram 转发机器人 的部署流程

CheatSheet

用户 ID ： update.effective_chat.id

转发来源： update.message.forward_from_chat.title 和 update.message.forward_from_chat.username ，前者是频道名称，后者是 @用户名

转发的消息源 ID： update.message.forward_from_message_id

文本消息内容： update.message.text

图片消息内容： update.message.caption

如果你看过「用浏览器直接查看（webhook）」这一节的内容并实操过，就会发现上面的结构与网页上的是一一对应的，可以查看网页来查找怎么获取信息。

原文链接： https://blog.vfly2.com/2023/08/register-telegram-bot-and-build-a-bot-using-python/

版权声明：本博客所有文章除特別声明外，均为 AhFei 原创，采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 承飞之咎 (blog.vfly2.com) 。

保持更新 ٩(・̤̀ᵕ・̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰可重复的实用技能，欢迎使用 RSS 订阅，也欢迎留言指正。

可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。