mogilyoy
@mogilyoy
учусь

Ошибка записи данных из бота в файл?

Привет! Бот в телеграме записывает входящие сообщения в текстовые документы. Причем записывает все сообщения только в один док, тот, в который записывал первым. т.е. например, пишем боту /api_id, затем /api_hash, и данные, которые должны идти в api_hash.txt, идут в api_id.txt. Есть мысль, что после запуска функции мб она не останавливается.
from telethon import TelegramClient, events, sync
import time
from random import randint
import telebot

bot = telebot.TeleBot('TOKEN')

@bot.message_handler(commands=["start"])
def start(m, res=False):
    bot.send_message(m.chat.id, 'Привет! Я скоро буду самой угрожающей спам-машиной современности. \n /api_id\n /api_hash\n /spamtext')

@bot.message_handler(commands=["api_id"])
def api_id(m, res=False):
    bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
    @bot.message_handler(func=lambda message: True, content_types=['text'])
    def msg(message):
        print(message.text)
        f = open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a')
        f.write(message.text + '\n')
        f.close()
        bot.send_message(m.chat.id, 'Прекрасно!')
        

@bot.message_handler(commands=["api_hash"])
def api_hash(m, res=False):
    bot.send_message(m.chat.id, 'Введите Api Hash, полученное на сайте my.telegram.org')
    @bot.message_handler(func=lambda message: True, content_types=['text'])
    def msg(message):
        print(message.text)
        f1 = open('C:/Users/асер/Desktop/python/bot/api_hash.txt', 'a')
        f1.write(message.text + '\n')
        f1.close()
        bot.send_message(m.chat.id, 'Чудесно!')  

@bot.message_handler(commands=["spamtext"])
def spamtext(m, res=False):
    bot.send_message(m.chat.id, 'Введите текст для спама')
    @bot.message_handler(func=lambda message: True, content_types=['text'])
    def msg(message):
        print(message.text)
        f2 = open('C:/Users/асер/Desktop/python/bot/spamtext.txt', 'a')
        f2.write(message.text + '\n')
        f2.close()
        bot.send_message(m.chat.id, 'Великолепно!')

bot.polling(none_stop=True, interval=0)
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
@o5a
Потому что это так не делается. От того, что хэндлеры записали как вложенные функции, они не будут работать только внутри тех функций. Первый записанный хэндлер одинакового типа (в данном случае content_types=['text']) и будет использоваться для всех вводов.
В данном случае подойдет использование register_next_step_handler, когда указывается функция, обрабатывающая последующий шаг операции. Про нее много где написано подробно, в т.ч. на этом сайте.
Для данного бота будет примерно так:
вместо
@bot.message_handler(commands=["api_id"])
def api_id(m, res=False):
    bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
    @bot.message_handler(func=lambda message: True, content_types=['text'])
    def msg(message):
        print(message.text)
        f = open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a')
        f.write(message.text + '\n')
        f.close()
        bot.send_message(m.chat.id, 'Прекрасно!')

сделать так (указать запрос api_id следующим шагом):
@bot.message_handler(commands=["api_id"])
def api_id(m, res=False):
    bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
    # указываем запуск следующего шага обработки - свою функцию
    bot.register_next_step_handler(message, get_api_id)

def get_api_id(message):
    print(message.text)
    with open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a') as f:
        f.write(message.text + '\n')
    bot.send_message(m.chat.id, 'Прекрасно!')


Аналогично для обработчиков других команд.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
InternetMaster
@InternetMaster
Интернет
with open('C:\\Vash\\Put\\K\\Papke\\nuzhnoe_nazvanie.txt', 'a+') as file:
    file.write('Необходимый для записи текст')
    file.close()
print('All done!')
Ответ написан
Комментировать
@PavelMos
По каким-то причинам во всех случаях причинам пишется только в тот файл что указан в пункте меню который пользователь выбрал первый раз, то есть в если поставить брейкпойнт то видно что хэдлер файла всегда один и тот же, и выдаётся только то сообщение, которое было в соответствующем пункте, независимо от того, какая команда даётся.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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