/
kaws
/
telegrambot
Обзор
Документация
Войти
/
kaws
/
telegrambot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
bot/Bot.py
118 строк
5 KB
nikdev010
update bot/Bot.py
26 июл 2024, 08:48
26 июл 2024, 08:48
5dcab2b
Код
Авторство
О чём код?
import telebot import requests from bs4 import BeautifulSoup import logging import time import signal import sys # Ваш токен бота Telegram token = "" # ID вашего Telegram-канала channel_id = "" bot = telebot.TeleBot(token) # Настройка логирования logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # Глобальные переменные для хранения информации о последней отправленной статье last_post_url = None # Обработчик сигнала Ctrl+C. Завершение работы бота из консоли(Windows) или терминала(Linux) def signal_handler(sig, frame): logging.info("Получен сигнал завершения, останавливаю бота...") sys.exit(0) signal.signal(signal.SIGINT, signal_handler) @bot.message_handler(content_types=['text']) def commands(message): # Эта функция обрабатывает команды, отправленные пользователем в чат бота. # Если пользователь отправляет сообщение "новости", запускается функция start_bot(). global last_post_url logging.info(f"Получено сообщение: {message.text}") if message.text.lower() == "новости": logging.info("Выполняется команда 'новости'") start_bot() else: logging.info("Неверная команда") bot.send_message(message.from_user.id, "Неверная команда. Для запуска парсинга введите команду 'новости'") def start_bot(): # Эта функция запускает парсинг последней статьи и отправляет ее в Telegram-канал. # Она проверяет, была ли статья уже отправлена ранее, и пропускает повторную отправку. global last_post_url while True: post_title, post_url = get_latest_post() if post_title is not None and post_url is not None: try: if post_url != last_post_url: logging.info("Отправка сообщения в канал") bot.send_message(chat_id=channel_id, text=f"{post_title}\n{post_url}") last_post_url = post_url else: logging.info("Поиск новых статей...") except telebot.apihelper.ApiTelegramException as e: if e.error_code == 429: logging.error(f"Слишком много запросов: повторная попытка через {e.parameters.retry_after} секунд") time.sleep(e.parameters.retry_after) bot.send_message(chat_id=channel_id, text=f"{post_title}\n{post_url}") else: logging.error(f"Ошибка при отправке сообщения: {e}") else: logging.info("Новых статей не найдено, ожидание 300 секунд перед следующей попыткой") time.sleep(300) def get_latest_post(): # Эта функция получает последнюю статью. Она возвращает заголовок и ссылку на статью, или сообщение об ошибке. try: # Ссылка на страницу со списком статей url = "" response = requests.get(url) soup = BeautifulSoup(response.content, "html.parser") # Тег и класс карточки статьи post_elements = soup.find_all("", class_="") if post_elements: post_element = post_elements[0] # Селектор ссылки на статью post_url_element = post_element.select_one("") # Вывод ссылки на статью if post_url_element: post_url = "" + post_url_element["href"] else: post_url = None # Селектор заголовка статьи title_element = post_element.select_one("") if title_element: title = title_element.text.strip() else: title = "Заголовок не найден" return title, post_url else: return "Статьи не найдены", None except Exception as e: logging.error(f"Ошибка при получении последней статьи: {e}") return "Ошибка при получении данных", None if __name__ == "__main__": # Этот блок кода запускает бота и перезапускает его в случае возникновения ошибок. while True: try: logging.info("Запуск бота...") bot.polling(non_stop=True) except Exception as e: logging.error(f"Ошибка в bot.polling: {e}") time.sleep(10)