@valerr007

Как создать многопользовательского бота в Telegram на Python?

Пишу Телеграм-бота на питоне. Использую pyTelegramBotApi.

В целом всё готово, но при тестировании понял что если 2 пользователя одновременно начнут пользоваться - возникает путаница и баги. Необходимо как-то добиться многопользовательского режима.

Знаю что можно с помощью БД, с помощью текстового файла или даже с помощью словарей для хранения данных пользователей.

Предполагаю что может помочь и многопоточность или разделение на процессы, хотя сомневаюсь, я пока что новичок, но мысли просто такие есть, поправьте если ошибаюсь.

В целом меня интересует логика. Ну запишу я ID пользователя и какой-то статус в таблицу, а что с этим делать ? Как разделить сессии пользователей чтобы они не пересекались и получить эффект многопользовательского режима?
  • Вопрос задан
  • 3080 просмотров
Пригласить эксперта
Ответы на вопрос 4
shurshur
@shurshur
Сисадмин, просто сисадмин...
Ошибка в том, что бот сохраняет в одних и тех же переменных данные разных пользователей.

Решение этой задачи называется FSM (Finite State Machine - конечный автомат) и в указанной библиотеке есть простая реализация FSM на основе метода register_next_step_handler. Пример.
Ответ написан
@tro_pic_rock
Есть такой патерн программирования - конечный автомат.
Если кратко - в боте стоит создать хеш таблицу в которой будет храниться id и текущая операция пользователя.
https://youtu.be/X49LG8JhcGQ
Надеюсь, что здесь можно вставлять ссылки на ютуб. Этот парень делал тг бота для ржд. У него применен этот патерн и есть полу рабочий код на гите( слегка устарел). Подсмотри у него
Ответ написан
Комментировать
Xreymonster
@Xreymonster
аэаэ
Можно попробовать асинхронностью воспользоваться, правда в pyTelegramBotApi она вроде не предусмотрена, поэтому через другие библиотеки придется химичить. Если любишь заморачиваться, то можешь вовсе код на aiogram переписать, по сути не трудно, схема один в один, просто функции все переписать, сделав как надо
Ответ написан
Vindicar
@Vindicar
RTFM!
Логика очень простая. При поступлении события от пользователя (например, команды) нужно загрузить состояние этого пользователя из БД, а потом на основании этого состояния уже решать, как обработать событие. Например, вызывая разные функции обработки.

Например, если бот должен поприветствовать пользователя, а потом узнать у него имя и возраст, то будет 4 возможных состояния:
1. пользователь нам неизвестен, ждём начала работы
2. приветствие отправлено, ожидаем ввод имени
3. введено имя, ожидаем ввод возраста
4. введено имя и возраст
Тогда у нас будет 4 возможных реакции, в зависимости от текущего состояния пользователя. И мы должны будем обновлять состояние пользователя при успешном срабатывании реакции.

Разумеется, такое решение будет несколько велосипедным, тем более что часто в библиотеках для создания ботов есть готовые инструменты реализации автомата состояний. Но идея в целом та же самая.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы