Как создать многопользовательского телеграм бота с использованием PyTelegramBotAPI?

в 11:18, , рубрики: pyTelegramBotAPI, python

Используя библиотеку PyTelegramBotAPI я столкнулась с тем, что написанный мною бот работает мягко говоря не очень - когда ботом одновременно пользовалось несколько человек сообщения пересекались, записывались левые данные, да и вообще творилась какая-то вакханалия.

Хочу отметить, что я только начинаю свой путь и в данной статье по случайности могла написать какой-то бред, пожалуйста, не судите строго, если что - поправляйте)

Итак, предлагаю рассмотреть пример кода:

import telebot

bot = telebot.TeleBot('токен')
 возможные состояния пользователя
@bot.message_handler(commands=['start'])
def hello_message(message):
    id1 = message.from_user.id
    bot.send_message(message.chat.id, f'Ваш id {id1}')

Здесь мы можем видеть небольшой кусок кода. Человек пишет команду /start и мы выдаем ему его id.

Вообще, этот кусок скорее всего будет работать без проблем, но если это всего лишь часть проекта, где нам нужно запомнить id и передавать его далее в другие функции, мы увидим проблемы.

Какие?

Представим ситуацию: два пользователя плюс минус в одно время нажали /start. Сначала код выполняется у первого и записывается его id, аналогично происходит и со вторым. В переменную id1 последним записался id второго пользователя, и да, самое главное - он будет доступен и будет пересекаться с другими пользователями! Функции доступны для взаимодействия для всех пользователей одинаково, и если один пользователь с нашей первой функции, рассмотренной в примере, переходит уже на следующую, куда будет передан его id, а потом второй пользователь перейдет в эту функцию, в конечном итоге запишется id второго пользователя! Это ужасно...)

Как же исправить этот недуг?

Я пять часов пыталась понять как исправить это, и знаете, все оказалось довольно таки просто. Вот новый, обновленный код:

import telebot
import random
bot = telebot.TeleBot('')
states = {}  # словарь для хранения состояний пользователей

START = range(1)  # возможные состояния пользователя
@bot.message_handler(commands=['start'])
def hello_message(message):
    secret = 0
    states[secret] = START
    secret = random.randint(1,49494985894939494944)
    states[secret] = START
    id1 = message.from_user.id
    bot.send_message(message.chat.id, f'Ваш id {id}')

Что же мы здесь видим?

Я добавила в этот код так скажем строки состояний. START = range(1) - это все возможные состояния пользователей - их может быть сколько угодно, в зависимости от функционала вашего бота и располагать их надо в каждой функции. Изначально был создан словарь states, он создавался вне всех функций. В первой функции, в самом ее начале, нам необходимо создать любую переменную (в нашем случае secret), и в эту переменную нужно записывать рандомное значение, которое не должно будет повторяться, затем передавать эту переменную далее в другие функции и аналогично писать в начале каждой функции states[secret] = (тут состояние пользователя). Я использую модуль random для генерации рандомного значения. Теперь при входе в функцию у каждого пользователя будет генерироваться свой, скажем, ключ идентификации, и другой пользователь не сможет получить доступ к этой функции.

Да, secret = 0
states[secret] = START
secret = random.randint(1,49494985894939494944)
states[secret] = START

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

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

Спасибо за внимание) Надеюсь, кому-нибудь это поможет)

Автор: daxata

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js