2

我的解决方案中的用户通过在电报中输入消息逐步进行。问题是服务器重启后他的状态没有保存,他需要重新开始。

例如,如果用户在“process_mid”步骤,重新启动后,他无法进入“process_end”。用户只能通过键入“开始”命令开始新阶段。

bot = telebot.TeleBot(TOKEN)


@bot.message_handler(commands=['start'])
def process_start(message):
    text = 'start'
    bot.send_message(message.chat.id, text)
    bot.register_next_step_handler(message, process_mid)


def process_mid(message):
    text = 'mid'
    bot.send_message(message.chat.id, text)
    bot.register_next_step_handler(message, process_end)


def process_end(message):
    text = 'end'
    bot.send_message(message.chat.id, text)

bot.polling(none_stop=True)
4

3 回答 3

2

尝试将用户的状态与用户的聊天 ID 一起存储在数据库中,并从那里验证状态。

因为它尝试创建类似的东西

class States(enumerate):
    # Enter all states like numbers
    S_START = 0
    ...

此外,创建用于从 db 获取状态的函数:

def get_current_state(user_id):
    # getting state by user's chat ID from DB
    ...

之后,只需为每个用户的聊天 ID 状态写入数据库(在您需要的每个处理程序中更改它)并在处理程序 func 中验证它:

@bot.message_handler(func=lambda message: get_current_state(message.chat.id) == config.States.S_START.value)
def some_function(message):
    ...
于 2019-03-20T16:49:45.733 回答
0

此示例将向您展示如何使用register_next_step 处理程序 https://github.com/eternnoir/pyTelegramBotAPI/blob/master/examples/step_example.py

于 2020-02-20T01:46:30.793 回答
0

根据我对这个机器人的经验,如果你想从你离开的地方继续,你需要将所有数据保存到一个文件(或数据库)中。

您可以在此过程中保存您的进度,并在process_start函数中用他在函数入口处标识用户,message.chat.id如果该值存在于文件(数据库)中,则相应地注册下一步。

于 2017-07-30T23:14:06.860 回答