簡體   English   中英

在python中處理Telegram機器人的多個問題

[英]Handle multiple questions for Telegram bot in python

我正在使用Telegram bot API在Python中編程一個電報bot。 我面臨着管理需要用戶回答的問題。 當程序正在等待一個用戶的回答而另一個用戶第一個用戶做出響應之前請求信息或詢問另一個問題時,就會出現問題。

Telegram API使用代碼來處理請求。 當您要求更新時,您將包括一個代碼。 如果您發送的代碼高於請求代碼,則將其標記為已處理,並以電報方式將其刪除,並且不再顯示在更新中。 該代碼是順序的,因此,如果將更新3標記為已處理,則更新1和2也將被刪除。

問題是, 為什么要處理需要用戶回答的多個請求的最佳植物/優雅方式?

沒有最Python的方法可以做到這一點。 這是您必須編程解決的問題。

基本上,您必須維護一些有關每個用戶的狀態變量。 當收到新消息時,漫游器會檢查該用戶所處的狀態,並做出相應的響應。

假設您有一個函數handle(msg) ,該函數會針對每條到達的消息進行調用:

user_states = {}

def handle(msg):
    chat_id = msg['chat']['id']

    if chat_id not in user_states:
        user_states[chat_id] = some initial state ...

    state = user_states[chat_id]

    # respond according to `state`

這將為一個簡單的程序做。

對於更復雜的情況,我建議使用telepot ,這是我為Telegram Bot API創建的Python框架 它具有專門解決此類問題的功能。

例如,下面是一個漫游器,它計算單個用戶發送了多少消息。 如果10秒鍾后未收到任何消息,它將重新開始(超時)。 每次聊天都進行計數-這很重要。

import sys
import telepot
from telepot.delegate import per_chat_id, create_open

class MessageCounter(telepot.helper.ChatHandler):
    def __init__(self, seed_tuple, timeout):
        super(MessageCounter, self).__init__(seed_tuple, timeout)
        self._count = 0

    def on_message(self, msg):
        self._count += 1
        self.sender.sendMessage(self._count)

TOKEN = sys.argv[1]  # get token from command-line

bot = telepot.DelegatorBot(TOKEN, [
    (per_chat_id(), create_open(MessageCounter, timeout=10)),
])
bot.notifyOnMessage(run_forever=True)

通過以下方式運行程序:

python messagecounter.py <token>

如果您有興趣,請轉到項目頁面以了解更多信息。 有很多文檔和不平凡的例子。

在我的機器人程序中,我使用了Webhooking。 如果可以使用網絡掛鈎-這樣做,這是與電報機器人進行交互的更舒適的方法。

如果您無法進行網絡掛鈎(例如ssl問題),則可以使用解決方法。 使用ForceReply可以獲取以前的漫游器答案,並根據用戶的答復編寫邏輯。

檢查更新是否包含回復(reply_to_message密鑰),然后根據此回復做出機器人答案。 這些操作必須異步才能獲得較高的機器人性能。

如果您是python程序員,我建議出於這些目的使用Tornado。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM