elegram-Bot 可以实现强大的自动化功能,能实现丰富的交互和定制化选项,同时具备高度安全性和稳定性。
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 后,向新注册的机器人随意发送消息,然后打开网址:
# 修改里面的 token 部分,前面的 bot 别删了
https://api.telegram.org/bot6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU/getupdates
其中 "chat" 里的 "id" 就是发消息账户的 chat_id,保存。
向 Bot 添加指令
指令的本质是以
/
开头的文本,因此可以直接发送/指令
触发
通过 BotFather 来为 Bot 设置指令,流程是,发送 /setcommands
,然后选中要修改的机器人,接着按照格式发送指令列表即可,格式如下:
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,然后访问:
https://api.telegram.org/botYour Token/getupdates
# 就比如,这样
https://api.telegram.org/bot6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU/getupdates
向 bot 发送一条消息之后,刷新浏览器,你会得到以下类似下面的 Message:
{'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:
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
官方的例子,可以学习: 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+)
pip3 install python-telegram-bot~=20.3
先看 config.py
,配置 bot_token ,还有代理地址即可。
# 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
启动程序。
# 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
,就是定义机器人的各种动作。
# 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)」这一节的内容并实操过,就会发现上面的结构与网页上的是一一对应的,可以查看网页来查找怎么获取信息。
本文摘自“承飞之咎” blog