Почему при запуске телеграмм бота на двух разных аккаунтах он отправляет все сообщения, только тому, кто 1 его запустил
Я пишу теллеграмм бота для проекта на конкурс, нужно сделать по сути некий каталог задач, который отправляет задания по математике смотря от того, какой выбрал пользователь.
Проблема состоит в том, что когда я проверяю бота только на одном аккаунте, то он работает отлично, но если с ним одновременно работает несколько аккаунтов, то он начинает отправлять сообщения только тому, кто первый его запустил, даже если с других аккаунтов нажимают выбор какого то задания, то оно сразу отправляется не тому кто захотел открыть это задание, а тому кто первый запустил бота
Вот главный код:
import telebot
from telebot import types
from telegram_bot_open import OPEN_NAMES_TASKS, OPEN_CATALOG, OPEN_ANSWER
from telegram_bot_text import TEXT_START, TEXT_HELP, TEXT_INFO
from telegram_bot_names_tasks import KEYBOARD
bot = telebot.TeleBot('')
"""
OPEN_NAMES_TASKS, OPEN_CATALOG и OPEN_ANSWER - это функции, написанные в другом файле, которые открывают текстовый документ
и возвращают список с содержимым
TEXT_START, TEXT_HELP и TEXT_INFO возвращают написанный в другом коде текст и выводят его
"""
@bot.message_handler(commands=['start'])
def start(message):
"""Выводит начальное приветствие и дает команды которые можно использовать"""
kb = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn_1 = types.KeyboardButton(text='/catalog')
btn_2 = types.KeyboardButton(text='/help')
kb.add(btn_1, btn_2)
bot.send_message(message.chat.id, TEXT_START(message), reply_markup=kb)
@bot.message_handler(commands=['help'])
def help(message):
"""Выводит просто текст"""
bot.send_message(message.chat.id, TEXT_HELP(message))
@bot.message_handler(commands=['info'])
def info(message):
"""Выводит просто текст"""
bot.send_message(message.chat.id, TEXT_INFO(message))
@bot.message_handler(commands=['catalog'])
def names_tasks(message):
"""Выводим названия задач"""
names_tasks_list = OPEN_NAMES_TASKS()
bot.send_message(message.chat.id, ''.join(names_tasks_list), reply_markup=KEYBOARD(message))
@bot.callback_query_handler(func=lambda callback: callback.data)
def task(callback):
"""Выводим задание"""
if callback.data == '0':
user_response = 0
elif callback.data == '1':
user_response = 1
elif callback.data == '2':
user_response = 2
elif callback.data == '3':
user_response = 3
elif callback.data == '4':
user_response = 4
elif callback.data == '5':
user_response = 5
elif callback.data == '6':
user_response = 6
elif callback.data == '7':
user_response = 7
elif callback.data == '8':
user_response = 8
elif callback.data == '9':
user_response = 9
catalog_zd_list = OPEN_CATALOG()
bot.send_message(message.chat.id, f'{catalog_zd_list[user_response]}\nОтветом является число')
@bot.message_handler(content_types=['text'])
def Except(message):
bot.send_message(message.chat.id,
'Я тебя не понимаю :(\n'
'Используй интерактивную клавиатуру\n'
'Если возникли вопросы, то отправь команду /help')
bot.polling(non_stop=True)
Вот уже дополнительные коды которые используются: telegram_bot_open
def OPEN_NAMES_TASKS():
"""Выводим названия задач"""
names_tasks = open(r'D:\Programming\function_per_hundred_bot\names_tasks.txt', encoding='utf-8')
names_tasks_list = [line for line in names_tasks.readlines()]
names_tasks.close()
return names_tasks_list
def OPEN_CATALOG():
"""Выводим задание"""
catalog = open(r'D:\Programming\function_per_hundred_bot\catalog.txt', encoding='utf-8')
catalog_zd_list = [line.strip() for line in catalog.readlines()]
catalog.close()
return catalog_zd_list
def OPEN_ANSWER():
"""Проверка ответа"""
answer = open(r'D:\Programming\function_per_hundred_bot\answer.txt', encoding='utf-8')
answer_zd_list = [line.strip() for line in answer.readlines()]
answer.close()
return answer_zd_list
telegram_bot_names_tasks:
from telebot import types
def KEYBOARD(message):
kb = types.InlineKeyboardMarkup()
name_1 = types.InlineKeyboardButton(text='Задание 1', callback_data='0')
name_2 = types.InlineKeyboardButton(text='Задание 2', callback_data='1')
name_3 = types.InlineKeyboardButton(text='Задание 3', callback_data='2')
name_4 = types.InlineKeyboardButton(text='Задание 4', callback_data='3')
name_5 = types.InlineKeyboardButton(text='Задание 5', callback_data='4')
name_6 = types.InlineKeyboardButton(text='Задание 6', callback_data='5')
name_7 = types.InlineKeyboardButton(text='Задание 7', callback_data='6')
name_8 = types.InlineKeyboardButton(text='Задание 8', callback_data='7')
name_9 = types.InlineKeyboardButton(text='Задание 9', callback_data='8')
name_10 = types.InlineKeyboardButton(text='Задание 10', callback_data='9')
kb.add(name_1, name_2, name_3, name_4, name_5, name_6, name_7, name_8, name_9, name_10)
return(kb)
На 1 скрине я запустил бота и отправил команду /catalog, после этого на данном аккаунте я ничего не делал На втором скрине уже на другом аккаунте я сделал тоже самое, но в этот раз нажал для обратной отправки задания 1 2 и 3, но вместо того что бы они появились в том же диалоге, они отправились в чат, где бот был запущен самым первым, что видно на первом скрине
А вот как он должен работать, ну и как он впринципе работает если только один аккант общается с ботом
Я запускаю бот, нажимаю на выбранный мной номер и он все правильно делает, ничего лишнего в отличии от того, когда несколько человек работает с ботом

Ответы (1 шт):
Ваши функции чтения(сохранения) настроек необходимо немного поправить: Добавить параметр, который будем использовать для чтения данных по каждому пользователю.
def OPEN_NAMES_TASKS(uid):
names_tasks = open('D:\\Programming\\function_per_hundred_bot\\'+uid+'\\names_tasks.txt', encoding='utf-8')
def OPEN_CATALOG(uid):
catalog = open('D:\\Programming\\function_per_hundred_bot\\'+uid+'\\catalog.txt', encoding='utf-8')
def OPEN_ANSWER(uid):
answer = open('D:\\Programming\\function_per_hundred_bot\\'+uid+'\\answer.txt', encoding='utf-8')
Для тех файлов которые общие для всех пользователей - такие параметры добавлять не нужно, или использовать всегда одинаковый параметр, например "0"
@bot.message_handler(commands=['catalog'])
def names_tasks(message):
#В дальнейшем для использования подобных функций нужно будет передавать параметр
#Например использовать user.id или chat.id
#При использовании chat.id - получим в приватном чате у каждого свои результаты, а в общем чате - общие на всех
#Если же использовать user.id - в общем чате так же будут персональные результаты по запросу :)
names_tasks_list = OPEN_NAMES_TASKS(message.user.id)
catalog_zd_list = OPEN_CATALOG(message.chat.id)
з.ы. вы случайно сделали замыкание :)
@bot.message_handler(commands=['catalog'])
def names_tasks(message):
names_tasks_list = OPEN_NAMES_TASKS()
bot.send_message(message.chat.id, ''.join(names_tasks_list), reply_markup=KEYBOARD(message))
#Вот тут вы сделали замыкание своим отступом(исправлено):
@bot.callback_query_handler(func=lambda call: True)
def task(callback):
if callback.data == '0':
user_response = 0
elif callback.data == '1':
user_response = 1
elif callback.data == '2':
user_response = 2
elif callback.data == '3':
user_response = 3
elif callback.data == '4':
user_response = 4
elif callback.data == '5':
user_response = 5
elif callback.data == '6':
user_response = 6
elif callback.data == '7':
user_response = 7
elif callback.data == '8':
user_response = 8
elif callback.data == '9':
user_response = 9
catalog_zd_list = OPEN_CATALOG()
bot.send_message(callback.message.chat.id, f'{catalog_zd_list[user_response]}\nОтветом является число')

