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)