@Maks1ma

Почему удалённый хост принудительно разрывает соединение?

Написал бота на питоне Агрегатор новостей. Чтобы все новости читать в Телеграмме, а не бегать по каждому источнику. Так вот, бот работает идеально и никаких ошибок не выдаёт. Но стоит мне кликнуть на любой новостной источник спустя 20 минут, так бот вылетает с ошибкой:
requests.exceptions.ConnectionError: 
('Connection aborted.', ConnectionResetError(10054, 
'Удаленный хост принудительно разорвал существующее подключение', None, 10054, None))

Я решил по экспериментировать и вместо выбора новостного источника сначала по вводить команды по типу /start или /news. Как итог всё хорошо работало и новости выводились без ошибки. Только почему спустя время при нажатии на саму новость, а не ввод команды разрывается соединение - непонятно.
Проблему уже гуглил, но у людей в основном была другая ситуация, которая особо не похожа на мою.
Вот если что последняя строчка кода моего бота. Может что-то с ней не так, но хз как решить данную проблему.
bot.polling(none_stop=True, interval=0)
  • Вопрос задан
  • 1036 просмотров
Решения вопроса 1
@Alexa2007
Запись пользователя в бд
@bot.message_handler(func=lambda message: message.text == "start")
@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Добро пожаловать в бот Агрегатор новостей! Здесь вы можете подписаться на рассылку '
                                      'интересующих вас новостей, которые бот будет вам отправлять. '
                                      'Для вывода новостных источников напишите команду /news', reply_markup = start_buttons())
    Base().add_user(message.from_user.id, message.chat.id)


Унаследованный, модифицированный бот
class Mybot(telebot.TeleBot):
    def __init__(self,arg, *args, **kwargs):
        super().__init__(arg, *args, **kwargs)

    def loop_poop(self):
        while True:
            parse_all_news(self)
            time.sleep(15)
            print(time.ctime())

    def polling(self, *args, **kwargs):
        thread = threading.Thread(target=self.loop_poop)
        thread.start()
        super().polling(*args, **kwargs)


Один декоратор вместо десятка elif
@bot.callback_query_handler(func=lambda call: call.data in news_sources.values())
def callback_worker(call):
    news_source = ''
    for k,v in news_sources.items():
        if call.data == v:
            news_source = k
    try:
        Base().add_subscribe(call.from_user.id, call.data) 
        bot.edit_message_text(f'Вы подписались на новости {news_source}', call.message.chat.id, call.message.message_id, reply_markup=subscribe_news_buttons())
    except Exception as e:
        bot.send_message(call.message.chat.id, f'Подписка на новости {news_source} не удалась')


Создание колбек кнопок согласно подписок
def subscribe_news_buttons():
    keyboard = types.InlineKeyboardMarkup()
    for btn_text, callback in news_sources.items():
        keyboard.add(types.InlineKeyboardButton(text=btn_text, callback_data=callback))
    return keyboard
        
def get_user_subscribes(user_id):
    keyboard = types.InlineKeyboardMarkup()
    sc = Base().get_subscribes(user_id)
    for chanel,sbs in sc:
        if sbs == '1':
            news_source = ''
            for k,v in news_sources.items():
                if chanel == v:
                    news_source = k
            keyboard.add(types.InlineKeyboardButton(text='Отписаться от '+news_source, callback_data=f'del_{chanel}'))
    return keyboard

Получение подписок из базы
def get_subscribes(self,user_id):
        r1,r2=[],[]
        sql = f"SELECT * FROM {self.table} WHERE {user_id} = user_id"
        try:
            res = self.cursor.execute(sql).fetchall()
            rows = self.cursor.execute(sql).description
            x=0
            for row in rows[2:]:
                r1.append(row[0])
            for _ in res[0][2:]:
                r2.append(_)
            result = zip(r1,r2)
            return list(result)
        except Exception as e:
            return False, e


Полный код
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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