Проблема с register_next_step_handler() используя WebHook. threaded=False
Telegram Bot использует Django 3.2.6, pyTelegramBotAPI 4.0.0. Apache 2.2.29. Cервер использует сертификат от Let’s Encrypt. Бот обрабатывает пошаговый обработчик, однако работоспособность заканчивается на первом шаге. По всей видимости это связанно с переменной:
user_dict = {}
После первого шага переменная становиться пустой и продолжение пошагового обработчика невозможно. Подскажите, пожалуйста как исправить это? Планирую пошаговый обработчик записывать в бд, однако как и запись в бд пошагово, также и отдельным классом не работает.
Файл views.py
from django.shortcuts import render
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
import requests
import telebot
from telebot import apihelper, types
import logging
logger = logging.getLogger(__name__)
WEBHOOK = 'https://exemple.com'
bot = telebot.TeleBot(settings.TOKEN, threaded=False, parse_mode='HTML')
@csrf_exempt
def index(request):
if request.method != 'POST':
return render(request, 'main/index.html')
if request.META.get('CONTENT_TYPE') != 'application/json':
return render(request, 'main/index.html')
json_string = request.body.decode('utf-8')
update = telebot.types.Update.de_json(json_string)
logger.info('Update: %s', update)
bot.process_new_updates([update])
return HttpResponse(status=200)
text_messages = {
'welcome':
'Привет! Для использования бота, требуется зарегистрироваться.\n\n<b>Как вы хотите зарегистрироваться?</b>',
'private_person':
'<b>Вы будете зарегистрированы как физическое лицо.</b>\nСледуйте инструкции ниже.',
'company':
'<b>Вы будете зарегистрированы как юридическое лицо.</b>\n Следуйте инструкции ниже.',
}
registration_messages = {
'first_name':
'Введите ваше имя.',
'last_name':
'Введите вашу фамилию.',
}
user_dict = {}
class UserReg:
def __init__(self, id_telegram):
self.id_telegram = id_telegram
self.first_name = None
self.last_name = None
def __repr__(self):
return f'id_telegram: {self.id_telegram} first_name: {self.first_name} last_name: {self.last_name}'
btn_private_person = types.InlineKeyboardButton(text='Физическое лицо', callback_data='private_person')
btn_company = types.InlineKeyboardButton(text='Юридическое лицо', callback_data='company')
@bot.message_handler(commands=['start'])
def start(message):
markup = types.InlineKeyboardMarkup()
markup.add(btn_private_person, btn_company)
bot.send_message(message.chat.id, text_messages['welcome'], reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True)
def registration(call):
bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, reply_markup='')
if call.data == 'private_person':
bot.send_message(call.message.chat.id, text_messages['private_person'])
elif call.data == 'company':
bot.send_message(call.message.chat.id, text_messages['company'])
msg = bot.send_message(call.message.chat.id, registration_messages['first_name'])
bot.register_next_step_handler(msg, first_step_reg_org)
def first_step_reg_org(message):
try:
chat_id = message.chat.id
user = UserReg(message.chat.id)
user_dict[chat_id] = user
user.first_name = message.text
msg = bot.send_message(message.chat.id, registration_messages['last_name'])
logger.warning('FIRST: %s', user_dict[chat_id])
bot.register_next_step_handler(msg, second_step_reg_org)
except Exception as e:
bot.reply_to(message, f'Что-то пошло не так! first\n{e}')
def second_step_reg_org(message):
try:
chat_id = message.chat.id
logger.warning('SECOND: %s',user_dict[chat_id])
user = user_dict[chat_id]
user.last_name = message.text
bot.send_message(message.chat.id, f'Результат: \n{user.first_name}\n{user.last_name}')
except Exception as e:
bot.reply_to(message, f'Что-то пошло не так! second\n{e}')
bot.enable_save_next_step_handlers(delay=1, filename="./.handlers-saves/step.save")
bot.load_next_step_handlers(filename="./.handlers-saves/step.save")
bot.set_webhook(url=WEBHOOK)
Файл logs.log
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: Starting new HTTPS connection (1): api.telegram.org:443
DATE: 19/09/2021 TIME: 10:41:54 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "GET /BOT.TOKEN/getWebhookInfo HTTP/1.1" 200 266
DATE: 19/09/2021 TIME: 10:41:54 AM
TYPE: INFO, LOCALIZATION: views
MESSAGE: WebHookInfo: {'url': 'https://exemple.com', 'has_custom_certificate': False, 'pending_update_count': 1, 'ip_address': '00.000.00.0', 'last_error_date': 1632024887, 'last_error_message': 'Wrong response from the webhook: 500 Internal Server Error', 'max_connections': 40, 'allowed_updates': None}
DATE: 19/09/2021 TIME: 10:41:54 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%21+%D0%94%D0%BB%D1%8F+%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F+%D0%B1%D0%BE%D1%82%D0%B0%2C+%D1%82%D1%80%D0%B5%D0%B1%D1%83%D0%B5%D1%82%D1%81%D1%8F+%D0%B7%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F.%0A%0A%3Cb%3E%D0%9A%D0%B0%D0%BA+%D0%B2%D1%8B+%D1%85%D0%BE%D1%82%D0%B8%D1%82%D0%B5+%D0%B7%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F%3F%3C%2Fb%3E&reply_markup=%7B%22inline_keyboard%22%3A+%5B%5B%7B%22text%22%3A+%22%5Cu0424%5Cu0438%5Cu0437%5Cu0438%5Cu0447%5Cu0435%5Cu0441%5Cu043a%5Cu043e%5Cu0435+%5Cu043b%5Cu0438%5Cu0446%5Cu043e%22%2C+%22callback_data%22%3A+%22private_person%22%7D%2C+%7B%22text%22%3A+%22%5Cu042e%5Cu0440%5Cu0438%5Cu0434%5Cu0438%5Cu0447%5Cu0435%5Cu0441%5Cu043a%5Cu043e%5Cu0435+%5Cu043b%5Cu0438%5Cu0446%5Cu043e%22%2C+%22callback_data%22%3A+%22company%22%7D%5D%5D%7D&parse_mode=HTML HTTP/1.1" 200 1319
DATE: 19/09/2021 TIME: 10:41:54 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: Starting new HTTPS connection (1): api.telegram.org:443
DATE: 19/09/2021 TIME: 10:41:57 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "GET /BOT.TOKEN/getWebhookInfo HTTP/1.1" 200 266
DATE: 19/09/2021 TIME: 10:41:57 AM
TYPE: INFO, LOCALIZATION: views
MESSAGE: WebHookInfo: {'url': 'https://exemple.com', 'has_custom_certificate': False, 'pending_update_count': 1, 'ip_address': '00.000.00.0', 'last_error_date': 1632024887, 'last_error_message': 'Wrong response from the webhook: 500 Internal Server Error', 'max_connections': 40, 'allowed_updates': None}
DATE: 19/09/2021 TIME: 10:41:57 AM
TYPE: INFO, LOCALIZATION: views
MESSAGE: Update: {'update_id': 52392613, 'message': None, 'edited_message': None, 'channel_post': None, 'edited_channel_post': None, 'inline_query': None, 'chosen_inline_result': None, 'callback_query': {'id': '5231228019845620169', 'from_user': <telebot.types.User object at 0x7f4555420820>, 'message': <telebot.types.Message object at 0x7f455547b3d0>, 'inline_message_id': None, 'chat_instance': '-8056055160872487116', 'data': 'private_person', 'game_short_name': None}, 'shipping_query': None, 'pre_checkout_query': None, 'poll': None, 'poll_answer': None, 'my_chat_member': None, 'chat_member': None}
DATE: 19/09/2021 TIME: 10:41:57 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/editMessageReplyMarkup?chat_id=ID_USER&message_id=2483 HTTP/1.1" 200 1044
DATE: 19/09/2021 TIME: 10:41:57 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%3Cb%3E%D0%92%D1%8B+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%D0%B5+%D0%B7%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D1%8B++%D0%BA%D0%B0%D0%BA+%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5+%D0%BB%D0%B8%D1%86%D0%BE.%3C%2Fb%3E%0A%D0%A1%D0%BB%D0%B5%D0%B4%D1%83%D0%B9%D1%82%D0%B5+%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8+%D0%BD%D0%B8%D0%B6%D0%B5.&parse_mode=HTML HTTP/1.1" 200 902
DATE: 19/09/2021 TIME: 10:41:57 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%D0%92%D0%B2%D0%B5%D0%B4%D0%B8%D1%82%D0%B5+%D0%B2%D0%B0%D1%88%D0%B5+%D0%B8%D0%BC%D1%8F.&parse_mode=HTML HTTP/1.1" 200 547
DATE: 19/09/2021 TIME: 10:41:57 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: Starting new HTTPS connection (1): api.telegram.org:443
DATE: 19/09/2021 TIME: 10:42:04 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "GET /BOT.TOKEN/getWebhookInfo HTTP/1.1" 200 266
DATE: 19/09/2021 TIME: 10:42:05 AM
TYPE: INFO, LOCALIZATION: views
MESSAGE: WebHookInfo: {'url': 'https://exemple.com', 'has_custom_certificate': False, 'pending_update_count': 1, 'ip_address': '00.000.00.0', 'last_error_date': 1632024887, 'last_error_message': 'Wrong response from the webhook: 500 Internal Server Error', 'max_connections': 40, 'allowed_updates': None}
DATE: 19/09/2021 TIME: 10:42:05 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%D0%92%D0%B2%D0%B5%D0%B4%D0%B8%D1%82%D0%B5+%D0%B2%D0%B0%D1%88%D1%83+%D1%84%D0%B0%D0%BC%D0%B8%D0%BB%D0%B8%D1%8E.&parse_mode=HTML HTTP/1.1" 200 571
DATE: 19/09/2021 TIME: 10:42:05 AM
TYPE: WARNING, LOCALIZATION: views
MESSAGE: FIRST: id_telegram: ID_USER first_name: Andrey last_name: None
DATE: 19/09/2021 TIME: 10:42:05 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: Starting new HTTPS connection (1): api.telegram.org:443
DATE: 19/09/2021 TIME: 10:42:10 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "GET /BOT.TOKEN/getWebhookInfo HTTP/1.1" 200 266
DATE: 19/09/2021 TIME: 10:42:10 AM
TYPE: INFO, LOCALIZATION: views
MESSAGE: WebHookInfo: {'url': 'https://exemple.com', 'has_custom_certificate': False, 'pending_update_count': 1, 'ip_address': '00.000.00.0', 'last_error_date': 1632024887, 'last_error_message': 'Wrong response from the webhook: 500 Internal Server Error', 'max_connections': 40, 'allowed_updates': None}
DATE: 19/09/2021 TIME: 10:42:10 AM
TYPE: DEBUG, LOCALIZATION: connectionpool
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%D0%A7%D1%82%D0%BE-%D1%82%D0%BE+%D0%BF%D0%BE%D1%88%D0%BB%D0%BE+%D0%BD%D0%B5+%D1%82%D0%B0%D0%BA%21+second%0AID_USER&reply_to_message_id=2488&parse_mode=HTML HTTP/1.1" 200 958
DATE: 19/09/2021 TIME: 10:42:10 AM

Ответы (1 шт):
Решено. Через функцию register_next_step_handler() необходимо предать переменную user_dict. Это можно сделать так:
def first_step_reg_org(message):
try:
chat_id = message.chat.id
user = UserReg(message.chat.id)
user_dict[chat_id] = user
user.first_name = message.text
msg = bot.send_message(message.chat.id, registration_messages['last_name'])
bot.register_next_step_handler(msg, second_step_reg_org, user_dict)
except Exception as e:
bot.reply_to(message, f'Что-то пошло не так! first\n{e}')
def second_step_reg_org(message, user_dict):
try:
chat_id = message.chat.id
user = user_dict[chat_id]
user.last_name = message.text
msg = bot.send_message(message.chat.id, registration_messages['email'])
bot.register_next_step_handler(msg, third_step_reg_org, user_dict)
except Exception as e:
bot.reply_to(message, f'Что-то пошло не так! second\n{e}')
Далее пошаговый обработчик полностью работает. Спасибо, кто уделил внимание этому вопросу!