Почему не работает программа, когда боту пишут много людей?
Есть Telegram-бот, который выдаёт случайное имя из файла, на библиотеке telebot. Вот код:
import telebot
from telebot import types
import random
name=open('C:\\Users\\user\\naames.txt')
names=name.read()
nnn=names[:].split('.')
aaa=[]
nnn2=nnn[:]
names=names.split('.')
nnn3=names[:]
name.close()
bot = telebot.TeleBot('мой токен')
def fu(cu):
global names
global aaa
aaa.append(cu)
sa=random.choice(nnn3)
msg = 'Тебе выпал(а): '+sa
nnn3.remove(sa)
name=open('C:\\Users\\user\\naames.txt', 'w')
name.write('.'.join(names))
name.close()
return msg
@bot.message_handler(content_types=['text'])
def get_text_messages(message):
global names
global pert
if message.text=='/start':
bot.send_message(message.from_user.id, text='''
Приветствую тебя, мой дорогой друг✨
Напиши фамилию и имя''')
file = open('C:\\Users\\user\\photo.png', 'rb')
bot.send_photo(message.chat.id, file)
else:
if message.text in nnn:
pert=message.text
if message.from_user.first_name and message.from_user.last_name:
print('ID: '+str(message.from_user.id)+' ; NAME: '+message.from_user.first_name+' '+message.from_user.last_name)
elif message.from_user.first_name:
print('ID: '+str(message.from_user.id)+' ; NAME: '+message.from_user.first_name)
elif message.from_user.last_name:
print('ID: '+str(message.from_user.id)+' ; NAME: '+message.from_user.last_name)
bot.send_message(message.from_user.id, "Привет, "+message.text.split()[1]+"!")
keyboard = types.InlineKeyboardMarkup()
key_n = types.InlineKeyboardButton(text='Имя!', callback_data='name')
keyboard.add(key_n)
bot.send_message(message.from_user.id, text='Жми кнопку!', reply_markup=keyboard)
else:
print(message.text+' - такого имени нет - отказ;')
bot.send_message(message.from_user.id, 'Такого имени нет!\nПроверь, что ты ввёл всё верно.')
@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
global s
global aaa
if pert not in aaa:
while True:
s=fu(pert)
if s != pert and pert.split()[0]!=s.split()[0]: break
bot.send_message(call.message.chat.id, s)
print(pert+' - '+s)
else:
bot.send_message(call.message.chat.id, 'Ты уже смотрел(а) имя!')
print(pert+' - отказ - имя уже просмотрено')
print('Запуск\n\n\n')
bot.polling(none_stop=True, interval=0, timeout = 1111120)
В файле naames.txt хранятся имена через точку. Пробовал запускать программу с двух компьютеров, всё нормально. Запустили примерно 40-50 человек - всё стало путаться, выдавалось по 5 имён, иногда давал одинаковые.
В чём проблема? Можно ли её исправить?
P.S. Знаю, что код можно сократить, но писать мне это не надо, т.к. мне так удобнее
Ответы (1 шт):
Проблема в том, что библиотека telebot не асинхронная и в целом не предназначена для работы с большим количеством юзеров в связке с базами данных (или как в твоем случае с naames.txt)
Тут я могу только предложить переписать бота на aiogram. Сам он похож на telebot, однако лучше работает с фильтрами и в целом асинхронен