Telegram bot на Python. Как отправить сообщение пользователю когда наступит определенная дата
Друзья ситуация такая, имею такой код:
@bot.message_handler(commands=['nap'])
def send_notification(message):
if message.text == '/nap':
chat_id = message.chat.id
username = message.from_user.username
bot.send_message(chat_id, f'{username} Я напомню Вам когда состоится матч')
if match_date == True:
bot.send_message(chat_id, f'{napominalka}')
else:
print('ass')
schedule.every().day.at('14:10').do(match_date)
while True:
schedule.run_pending()
time.sleep(60)
по идее он должен после того как пользователь напишет боту команду /nap запустить отслеживание дня матча и когда день матча совпадёт с реальной датой то бот напишет об этом пользователю. Не понимаю как все правильно записать. Функция match_date выполняет сравнение даты с реальным временем.
def match_date():
url = 'https://www.sports.ru/zenit/calendar/'
page = requests.get(url) # записываем в переменную page html код страницы
clear_date = [] # объявили несколько списков
parse_page = []
soup = BeautifulSoup(page.text, "html.parser") #парсим страницу в формате хтмл
parse_page = soup.findAll('td', class_="name-td alLeft bordR") #вычленяем их хтмл кода страницы нужный нам участок с играми зенита
for data in parse_page:
clear_date.append(data.text)
clear_date.remove('Дата')
#print(filteredNews)
for data in clear_date:
data2 = data.strip('\n')
data2 = data2[:10]
data3 = dt.datetime.strptime(data2, '%d.%m.%Y') # даты спарсеные с сайта
current_date = str(date.today())
current_date2 = current_date.split("-")
current_date2.reverse()
current_date3 = ".".join(current_date2)
current_date4 = dt.datetime.strptime(current_date3, '%d.%m.%Y') # дата текущего дня в верном формате
if current_date4 == current_date4:
return True
else:
return False
а функция Napominalka по идее должна отправить пользователю сообщение что сегодня день матча. Функцию прилагаю...
def napominalka():
url = 'https://www.sports.ru/zenit/calendar/'
page = requests.get(url) # записываем в переменную page html код страницы
filteredNews = [] # объявили несколько списков
allNews = []
new_games = []
old_games = []
new_games.clear() #очистить список, т.к. в него вроде как много говна с предыдущих прогонов записывается
soup = BeautifulSoup(page.text, "html.parser") #парсим страницу в формате хтмл
allNews = soup.findAll('td', class_="name-td alLeft bordR") #вычленяем их хтмл кода страницы нужный нам участок с играми зенита
for data in allNews:
filteredNews.append(data.text)
filteredNews.remove('Дата')
#print(filteredNews)
for data in filteredNews:
n = str()
data2 = data.strip('\n')
time = data2[11:16]
data2 = data2[:10]
data3 = dt.datetime.strptime(data2, '%d.%m.%Y') # даты спарсеные с сайта
current_date = str(date.today())
current_date2 = current_date.split("-")
current_date2.reverse()
current_date3 = ".".join(current_date2)
current_date4 = dt.datetime.strptime(current_date3, '%d.%m.%Y') # дата текущего дня в верном формате
if data3 < current_date4:
old_games.append(f'Зенит играл: {data2}')
else:
new_games.append(f' {data2} в {time}')
if current_date4 == current_date4:
n = f'Зенит играет сегодня {new_games[0]}'
else:
n = f'Зенит играет не сегодня'
return n
И вот не могу понять как все это увязать чтобы бот следил за датой и в нужный день посылал пользователю сообщение что сегодня день матча. P.S. я нубас с кодинге, конструктивную критику по коду с удовольствием принимаю, но в приоритете конечно решить вопрос.
Ответы (1 шт):
from datetime import datetime
import requests
from bs4 import BeautifulSoup
url = 'https://www.sports.ru/zenit/calendar/'
users = {'2021-10-19': {1, 2}}
page = requests.get(url)
clear_date = []
soup = BeautifulSoup(page.text, "html.parser")
parse_page = soup.findAll('td', class_="name-td alLeft bordR")
for data in parse_page:
clear_date.append(data.text.strip('\n'))
clear_date.remove('Дата')
for data in clear_date:
now = datetime.strptime(datetime.now().strftime('%d.%m.%Y'), '%d.%m.%Y').date()
data_1 = datetime.strptime(data[:10], '%d.%m.%Y').date()
if now == data_1:
for i in users[now.strftime('%Y-%m-%d')]:
print(f'текущая дата: {now.strftime("%Y-%m-%d")}\nотправка сообщения пользователю с id {i}:\n матч сегодня')
if now < data_1:
for i in users[now.strftime('%Y-%m-%d')]:
print(f'текущая дата: {now.strftime("%Y-%m-%d")}\nотправка сообщения пользователю с id {i}:'
f'\n матч состоится {data_1.strftime("%d.%m.%Y")}')
if now > data_1:
for i in users[now.strftime('%Y-%m-%d')]:
print(f'текущая дата: {now.strftime("%Y-%m-%d")}\nотправка сообщения пользователю с id {i}:'
f'\n матч прошёл {data_1.strftime("%d.%m.%Y")}')
добавление в словарь даты и id пользователей которым необходимо выполнить рассылку - пример. желательно использовать БД, на крайний случай файл - это позволит хранить даты матчей и пользователей которые подписались на уведомления, а так же будет возможность забирать данные с сайта n раз в требуемый период.
в schedule запланируйте выполнение функции проверки словаря (пример) на наличие ключа с текущей датой.