我可能犯了一些錯誤,如果我有任何錯誤,請告訴我!
先自薦一個 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)」這一節的內容並實操過,就會發現上面的結構與網頁上的是一一對應的,可以查看網頁來查找怎麼獲取信息。
原文鏈接: 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 交流依文章步驟遇到的問題。