@kovalchuk_evgenii

Как сделать что бы бот отправлял следующую строчку из файла?

Написал простого бота что бы по нажатию кнопки пользователь получал сообщение которое бот берет из txt файла. В этом файле 30 строк и я хочу что бы они выдавались по очереди не повторяясь.

bot = telebot.TeleBot('токен')

f = open('C:\\Users\\budgetpls\\Desktop\\podarok\\data\\facts.txt', 'r', encoding='UTF-8')
facts = f.read().split('\n')
f.close()

@bot.message_handler(commands=["start"])
def start(m, res=False):
    markup=types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1=types.KeyboardButton("Хочу подарочек")
    markup.add(item1)
    bot.send_message(m.chat.id, 'Нажми на кнопку: \nХочу подарочек',  reply_markup=markup)

@bot.message_handler(content_types=["text"])
def handle_text(message):
    if message.text.strip() == 'Хочу подарочек':
        bot.send_message(message.chat.id, facts)

bot.polling(non_stop=True)


В этом варианте кода бот отправляет первую строчку из файла.
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 2
phaggi
@phaggi
лужу, паяю, ЭВМы починяю
Самый простой вариант - сложить все строки в список и выдергивать их оттуда методом .pop(), отлавливая соответствующий exception об отсутствии элементов в списке. Недостатки:
  • при перезагрузке бота всё начнется сначала.
  • всё это будет работать только для одного клиента, если их станет одновременно несколько, всё запутается.

Для работы с несколькими пользователями надо делать через счетчик и для каждого пользователя свой счетчик заводить и хранить его вне кода, каждый раз меняя. Или пересохранять в файл типа json, или хранить в БД. С файлом проблема с одновременным доступом, надо затевать очередь и асинхронный доступ.
Лучше в БД, это универсальней и надежней, но несколько замороченнее. Зато там можно всё хранить, и ваши строки, и всех пользователей со всеми их атрибутами.
Ответ написан
Комментировать
@kovalchuk_evgenii Автор вопроса
Ответ нашел вот такой

index = 0

@bot.message_handler(content_types=["text"])
def handle_text(message):
    global index 
    if message.text.strip() == 'Хочу подарочек':
        if index < len(facts):
            fact = facts[index]
            bot.send_message(message.chat.id, fact)
            index += 1
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы