在某些消息电报机器人之后保存用户输入

时间:2017-05-18 17:16:36

标签: python telegram-bot user-interaction python-telegram-bot

我正在python上构建一些电报机器人(使用这个框架pyTelegramBotAPI)。我用用户输入遇到了问题。我需要在某些机器人的消息之后保存用户输入(可以是任何文本)。例如:

  

Bot: - 请描述一下你的问题。

     

用户: - 我们的电脑无法正常工作。

然后我需要保存此文本"我们的计算机不能正常工作"到某个变量并转到下一步。 这是我的代码:

#!/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 个答案:

答案 0 :(得分:2)

它不是python甚至编程相关的问题。它更像是设计问题。但无论如何。 解决方案是为用户保留会话。例如用户发送给你:

  

我们的电脑无法使用。

首先,您为此用户创建会话(标识应为用户ID),然后向他/她发送正确的消息。当用户首先发送下一条消息时,您会查看用户状态并查看他/她是否有会话。如果他/她有会话,你继续第二步。我开发这样的机器人并使用字典来存储用户会话。但它使一切都变得复杂。

答案 1 :(得分:1)

这会对你有所帮助 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 :(得分:0)

您应该将数据保存在缓存或数据库中。

答案 3 :(得分:0)

您可以使用Forcereply。 收到带有此对象的消息后,Telegram客户端将向用户显示回复界面(就好像用户已选择机器人的消息并点击“回复”#39;)。如果您想要创建用户友好的逐步界面而不必牺牲隐私模式,这将非常有用。 https://core.telegram.org/bots/api#forcereply

答案 4 :(得分:0)

我知道该如何解决。解决方案花了3年时间。

只要看看我的代码,然后自己编写即可。谢谢

module Visit =
    type Model =
        {
            Id: int
            Name: string
        }
    let initWithTime (t:DateTime) =
        {
            Id = 0
            Name = sprintf "Time is %A" t
        }

module Cell =
    type Model =
       {
            Id: int
            Visit: Visit.Model option
       }

let setVisitFromInteger (i:int, m:Model) =
        let appointmentTime = 
            DateTime.Today + TimeSpan.FromMinutes(float i)
        { m with Visit = { m.Visit 
                           match m.Visit with
                           | Some x -> x with Name = sprintf "New appointment time %A" appointmentTime
                           | None -> Visit.initWithTime appointmentTime
                         }
        }

我想我帮助了你的朋友<3