Untitled

 avatar
unknown
plain_text
2 years ago
4.7 kB
2
Indexable
from time import sleep

import requests
import telebot
import threading

sites_timeout = 3  # Максимальное время ожидание от сайта

interval_between_requests = 0.5  # Интервал между запросами в секундах

error_site_message_format = '<b>Сайт недоступен:</b> <i>{0}</i>' \
                            '\n<b>Мы сообщим, когда сайт вновь заработает!</b>'  # Сообщение, которое увидит пользователь, если сайт недоступен. {0} - название сайта.

site_now_work_message_format = '<b>Сайт вновь доступен:</b> <i>{0}</i>'  # Сообщение, которое увидит пользователь, когда сайт вновь заработает.

files_with_sites_lists = {'URL.txt', 'URL2.txt'}  # Список файлов, из которых необходимо читать сайты.

map_of_sites_lists = dict()  # Словарь списков всех файлов

map_of_errors = dict()  # Словарь ошибок


def load_files():  # Загружаем все файлы
    for file_name in files_with_sites_lists:  # Загружаем все файлы из списка файлов
        with open(file_name, 'r') as file:
            map_of_sites_lists[file_name] = file.readlines()

        map_of_errors[file_name] = list()


bot = telebot.TeleBot('5384179843:AAEJa2u-_6RRFIJFHW7FAPncqUcupGit4M0')


# Обработчик при вводе команды /start
@bot.message_handler(commands=['start', 'run'])
def start_command_handler(message):
    bot.send_message(message.from_user.id, f'<b>Вы запустили проверку!</b>', parse_mode='HTML')

    start_checking(message)


def start_checking(message):
    for file_name in map_of_sites_lists.keys():  # Проходимся циклом по всем необходимым файлам
        checking_thread = threading.Thread(target=check_sites, args=(message, file_name,), daemon=True)  # Запускаем по процессу на каждый файл
        checking_thread.start()


def check_sites(message, file_name):
    error_checking_thread = threading.Thread(target=check_errors, args=(message, file_name), daemon=True)

    error_checking_thread.start()  # Запускаем по процессу проверки ошибок на каждый файл

    while True:
        for site_name in map_of_sites_lists[file_name]:
            try:
                if site_name in map_of_errors[file_name]:  # Если сайт уже проверяется потоком ошибок - нет смысла проверять его дважды
                    continue

                response = requests.get(site_name, timeout=sites_timeout)

                print(f'{site_name}\t{response.status_code}')

                if not response.ok:  # Если сайт не ответил на запрос
                    raise Exception()

            except (Exception, ):
                map_of_errors[file_name].append(site_name)  # Вносим сайт в список ошибочных

                bot.send_message(message.from_user.id, error_site_message_format.format(site_name), parse_mode='HTML')  # Сообщаем пользователю, что сайт недоступен

        sleep(interval_between_requests)


def check_errors(message, file_name):
    while True:
        now_working_sites_list = list()  # Список вновь доступных сайтов

        for site_name in map_of_errors[file_name]:  # Проходимся по всем сайтам, которые были указаны ошибочными
            try:
                response = requests.get(site_name, timeout=sites_timeout)

                print(f'{site_name} {response.status_code}')

                if response.ok:  #  Если сайт вновь доступен
                    now_working_sites_list.append(site_name)

                    bot.send_message(message.from_user.id, site_now_work_message_format.format(site_name), parse_mode='HTML')  # Сообщаем пользователю о том, что сайт вновь доступен

            except (Exception, ) as e:  #Игнорируем исключения
                print(e)

            sleep(interval_between_requests)

        for site_name in now_working_sites_list:
            map_of_errors[file_name].remove(site_name)


if __name__ == '__main__':
    load_files()

    try:
        bot.polling(none_stop=True)
    except Exception as e:
        print(e)