AhFei

AhFei

简洁的写作需要勇气

Telegram-Bot 的註冊和使用 Python 編寫機器人

我可能犯了一些錯誤,如果我有任何錯誤,請告訴我!


先自薦一個 tg 轉發機器人,避免存入 tg 收藏夾然後吃灰。

項目地址: AhFeil/extract_forward_tgbot: 存儲轉發給它的消息到文件中,並能推送到網頁,方便查看編輯信息 (github.com)

它的最基本使用: (更多請查看 GitHub 項目首頁)

  1. 把消息轉存給它(只支持純文本消息和圖片附帶消息那種),或者直接發消息
  2. 它會提取其中的文本和內鏈網址並將之存在文件裡,內鏈網址會按照順序放到文本後面。
  3. 發送命令 /push ,它會將上面文件裡的全部內容複製到另一個方便訪問的文件中,目前用的是 網頁記事本,訪問對應網頁就能看到。
  4. 在電腦訪問網頁,查看並高效處理。

在 Telegram 註冊機器人和配置等#

註冊一個機器人 (Bot)#

註冊過程很簡單,在 telegram 中向 “機器人之父” 發消息,即 https://t.me/BotFather 這個機器人:

  1. 打開與 @BotFather 的對話框
  2. 發送 /start (開始)
  3. 發送 /newbot
  4. 發送 Bot 的 name(名稱、暱稱)
  5. 指定 Bot 的 username(用戶名、ID),注意這個用戶名必須以 bot 結尾,而且不能更改
  6. 如果沒重名,註冊完成,發來的消息中有 Bot 的 token,格式是這樣的: 6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU
  7. 保存好 token ,不要洩露

register-Telegram-Bot.png

獲取 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 編輯的是下面界面展示的

customize-About-Telegram-Bot.png

Description 則是第一次進入機器人時的這個界面:

customize-Description-Telegram-Bot.png

實際上,也可以在機器人的對話框處找到編輯介紹信息的選項,電腦、手機皆可,更方便。


Telegram-Bot 官方#

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

Telegram-Bot-flowchart.png

一些限制#

不完整,仅是记录

注意: 機器人必須設置為頻道管理員,否則無法發送消息

頻道必須設置為公開

在頻道可以通過 @name 發消息,對個人不行,只能通過 chat_id 才行

並且,機器人只能在用戶向它發過消息,或將機器人加入一個群組之後,才能主動向用戶發消息。機器人不能向陌生用戶主動發消息。

custom keyboard & inline keyboard#

Customer keyboard 和 inline keyboard 有以下幾點區別:

  1. inline keyboard 出現在輸入區之上,而 custom keyboard 出現在鍵盤輸入區之下;
  2. 按下 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,其相關網站如下:


推薦創建三個文件,比如 extract_forward_tgbot.pytgbotBehavior.py ,前者用來 設置路由和註冊以啟動路由,後者放具體的函數(定義機器人動作)。

還有 config.py ,用來配置 token 等配置信息的。

流程圖來了!

image

實際編寫#

我是看這個庫 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 ,並配置路由,也就是

  1. 機器人收到 '/start' 後,就執行 start 函數
  2. 機器人收到 '/myid' 後,就執行 myid 函數
  3. 機器人收到指令之外的內容,就執行 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 交流依文章步驟遇到的問題。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。