Сохранение пользовательского ввода после определенного сообщения телеграмм-бота

Я создаю бот телеграммы на 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 в инструкции, но все еще не могу ее реализовать. Как я могу это решить? Любые идеи? Спасибо.


person user3151148    schedule 18.05.2017    source источник


Ответы (5)


Это поможет вам 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() 
person Nematillo Ochilov    schedule 25.08.2017

это не вопрос, связанный с питоном или даже программированием. это больше похоже на проблему проектирования. но все таки. решение поддерживает сеанс для пользователей. например, пользователь отправляет вам:

Наш компьютер не работает.

сначала вы создаете сеанс для этого пользователя (идентификатор должен быть идентификатором пользователя), а затем отправляете ему / ей соответствующее сообщение. когда пользователь отправляет следующее сообщение, сначала вы смотрите на статус пользователя и видите, есть ли у него сеанс или нет. если у него / нее сеанс, вы переходите ко второму шагу. Я разрабатываю такого бота и использую словарь для хранения пользовательских сессий. но это все немного усложняет.

person Mohammad    schedule 18.05.2017

Вы можете использовать Forcereply. После получения сообщения с этим объектом клиенты Telegram будут отображать интерфейс ответа для пользователя (действовать так, как если бы пользователь выбрал сообщение бота и нажал «Ответить»). Это может быть чрезвычайно полезно, если вы хотите создавать удобные пошаговые интерфейсы, не жертвуя режимом конфиденциальности. https://core.telegram.org/bots/api#forcereply

person user2448849    schedule 02.08.2017

Вы должны сохранить данные в кеше или базе данных.

person ManzoorWani    schedule 21.05.2017

я знаю, как это исправить. На решение ушло 3 года.

Просто посмотрите мой код и создайте свой собственный. Спасибо

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call): #your call
    UserID = str(call.message.chat.id)

    if call.data == 'PhotoTEXT': 
       @bot.message_handler(content_types=['text'])
       def SetTEXTonPHOTO(message):  # THIS FUNCTION
           sent = bot.send_message(message.chat.id,'send me text')
           bot.register_next_step_handler(sent, TextONphoto)

           def TextONphoto(message): #Thsi function add text on photo
              im = Image.open('UserData/Files/photos/not_converted/'+UserID+'.jpg')
              idraw = ImageDraw.Draw(im)
              text = message.text
              font = ImageFont.truetype("arial.ttf", size=18)
              idraw.text((10, 10), text, font=font)  
              im.save('UserData/Files/photos/converted/'+UserID+'.jpg')
              im.show()

    SetTEXTonPHOTO(call.message) #just run your function
    with open('UserData/Files/photos/converted/'+UserID+'.jpg', 'rb') as file:
         bot.send_document(UserID,file)

Думаю, я помог вам друзья ‹3

person OLD Man    schedule 08.11.2020
comment
Добро пожаловать в stack overflow и это вы за ответ на свой первый вопрос. Это очень ценно! Тем не менее, это помогло бы пользователям, если бы вы были немного более конкретными в отношении того, как именно ваш код помогает пользователю в решении его проблемы. - person piterbarg; 09.11.2020