web-dev-qa-db-ja.com

特定のメッセージテレグラムボットの後にユーザー入力を保存する

python(このフレームワークを使用 pyTelegramBotAPI )でテレグラムボットを構築しています。ユーザー入力の問題が発生しました。ユーザー入力を保存する必要があります(特定のボットのメッセージの後のテキスト)例:

ボット:-問題について説明してください。

ユーザー:-私たちのコンピューターは動作しません。

次に、このテキスト「コンピュータが機能しません」を変数に保存して、次の手順に進む必要があります。これが私のコードです:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import telebot
import constants
from telebot import types

bot = telebot.TeleBot(constants.token)

@bot.message_handler(commands=['start'])
def handle_start(message):
    keyboard = types.InlineKeyboardMarkup()
    callback_button = types.InlineKeyboardButton(text="Help me!", callback_data="start")
    keyboard.add(callback_button)
    bot.send_message(message.chat.id, "Welcome I am helper bot!", reply_markup=keyboard)



@bot.inline_handler(lambda query: len(query.query) > 0)
def query_text(query):
    kb = types.InlineKeyboardMarkup()
    kb.add(types.InlineKeyboardButton(text="Help me!", callback_data="start"))
    results = []
    single_msg = types.InlineQueryResultArticle(
        id="1", title="Press me",
        input_message_content=types.InputTextMessageContent(message_text="Welcome I am helper bot!"),
        reply_markup=kb
    )
    results.append(single_msg)
    bot.answer_inline_query(query.id, results)

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.message:
        if call.data == "start":
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Please describe your problem.")
            #here I need wait for user text response, save it and go to the next step

ステートメントでmessage_idを使用することを考えていますが、それでも実装できません。どうすればこれを解決できますか?何か案は?ありがとうございました。

5
user3151148

それはpythonまたはプログラミング関連の質問でさえありません。問題の設計に似ていますが、とにかく、解決策はユーザーのセッションを維持することです。

私たちのコンピューターは動作しません。

最初にこのユーザーのセッションを作成し(IDはユーザーIDである必要があります)、次に適切なメッセージを送信します。ユーザーが最初に次のメッセージを送信するときは、ユーザーのステータスを調べて、セッションがあるかどうかを確認します。彼/彼女がセッションを持っている場合、あなたは2番目のステップに進みます。私はこのようなボットを開発し、ユーザーセッションを保存するために辞書を使用しました。しかし、それはすべてを少し複雑にします。

2
Mohammad

これはあなたを助けます https://github.com/eternnoir/pyTelegramBotAPI/blob/master/examples/step_example.py

import telebot
import constants
from telebot import types

bot = telebot.TeleBot(constants.token)

@bot.message_handler(commands=['start'])
def start(message):
  sent = bot.send_message(message.chat.id, 'Please describe your problem.')
  bot.register_next_step_handler(sent, hello)

def hello(message):
    open('problem.txt', 'w').write(message.chat.id + ' | ' + message.text + '||')
    bot.send_message(message.chat.id, 'Thank you!')
    bot.send_message(ADMIN_ID, message.chat.id + ' | ' + message.text)

bot.polling() 
2
Admin

データはキャッシュまたはデータベースに保存する必要があります。

0
ManzoorWani

Forcereplyを使用できます。このオブジェクトを含むメッセージを受信すると、Telegramクライアントはユーザーに返信インターフェースを表示します(ユーザーがボットのメッセージを選択して「返信」をタップしたかのように動作します)。これは、プライバシーモードを犠牲にすることなく、ユーザーフレンドリーなステップバイステップのインターフェイスを作成する場合に非常に役立ちます。 https://core.telegram.org/bots/api#forcereply

0
user2448849