6

Telegram bot API を使用して、Python で電報ボットをプログラミングしています。ユーザーの回答が必要な質問を管理するという問題に直面しています。プログラムがあるユーザーの回答を待っているときに、別のユーザーが情報を要求したり、最初のユーザーが応答する前に別の質問をしたりすると、問題が発生します。

Telegram API は、コードを使用してリクエストを処理します。更新を要求するときは、コードを含めます。送信したコードがリクエスト コードより高い場合は、処理済みとしてマークされ、電報で削除され、更新に表示されなくなります。このコードはシーケンシャルなので、更新 3 を処理済みとしてマークすると、更新 1 と 2 も消去されます。

問題は、ユーザーへの回答が必要な複数の要求を処理するための最良のフィトニック/エレガントな方法はなぜですか?

4

2 に答える 2

10

これを行うための最もpythonicな方法はありません。それはあなたが解決するためにプログラムしなければならない問題です。

基本的に、各ユーザーに関するいくつかの状態変数を維持する必要があります。新しいメッセージが到着すると、ボットはそのユーザーの状態を確認し、それに応じて応答します。

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`

これは単純なプログラムで十分です。

より複雑な状況では、Telegram Bot API 用に作成した Python フレームワークであるtelepotを使用することをお勧めします。この種の問題を具体的に解決する機能を備えています。

たとえば、以下は、個々のユーザーが送信したメッセージの数をカウントするボットです。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>

興味のある方は、プロジェクト ページにアクセスして詳細をご覧ください。多くのドキュメントと重要な例があります。

于 2015-10-30T12:38:18.120 に答える