0
5 комментариев

Пишу телеграм бот для одноклассников. Напоминалка о днях рождения. Реализовал сообщение о дате дня рождения и сколько лет исполниться по текстовому запросу. Например, Вася, бот отвечает, что у него день рождения 12 августа. Ему исполниться 13 лет.

Хотелось бы сделать еще и автоматическое напоминание, что мол сегодня день рождения у Васи. По идеи нужно сравнить дату дня рождения с текущей и написать сообщение, но у меня в исходных переменных указаны даты с годом, то есть 12 лет назад. Как сравнивать только день, месяц и час сообразить не получается. Подскажите, как это можно сделать? Или может есть другой способ?

import telebot
import datetime
 a = ['января.', 'февраля.', 'марта.', 'апреля.', 'мая.', 'июня.', 'июля.', 'августа.', 'сентября.', 'октября.', 'ноября.', 'декабря.']
TOKEN = '.....'
bot = telebot.TeleBot(TOKEN)
 now = datetime.datetime.now()
a14 = datetime.datetime(2007, 11, 20)#Я
delta14 = now - a14
@bot.message_handler(content_types=['text'])
def send_text(message):
    if message.text.lower() == 'матвей':
        bot.send_message(message.chat.id, 'У него день рождения ' +a14.strftime("%d ") +a[10] +' Ему будет ' +str(delta14.days // 365 + 1) +' лет.')
bot.polling()

Вопрос закрыт для новых ответов.
Выделенный ответ как лучший
Матвей добавлен комментарий

С этим разобрался, спасибо!
Появилась другая проблема. Все, что я читал про pytelegrambotapi, касалось ответа за запросы. То есть боту что-то пишут (отправляют документы, видео и т.п.), он что-то делает. А как заставить бота просто написать сообщение при наступлении даты, не понятно. Вот этот код не работает. Дату и время в a1 я выставил как на сервере +5 минут.

def send_text_1(message):
if a1.month == now.month and a1.day == now.day and a1.hour == now.hour and a1.minutes == now.minutes:
bot.send_message(message.chat.id,’День рождения’)

И еще, почему я не могу добавить комментарий к ответу ниже?

stud_55@mail.ru добавлен комментарий

Код не работает потому что нет chat.id. Чтобы отправлять сообщения нужно сначала где-то хранить id пользователей (chat.id), а потом если наступает день рождения пользователя отправлять ему сообщение через bot.send_message(chat.id, ‘День рождения’)

Матвей добавлен комментарий

Так, с этим тоже вроде разобрался. Спасибо!
Получилось вот так.
if a1.month == now.month and a1.day == now.day and a1.hour == now.hour and a1.minute == now.minute:
bot.send_message(-100…..,’День рождения’)
Но в этом случае бот отправляет сообщение в канал только если его запустить в назначенное время. То есть проверка текущей даты и даты в a1 происходит 1 раз во время запуска.
Попробовал вот так
while True:
now = datetime.datetime.now()
a1 = datetime.datetime(2009, 3, 18, 13, 17, 0, 0)
if a1.month == now.month and a1.day == now.day and a1.hour == now.hour and a1.minute == now.minute:
bot.send_message(-100…….,’День рождения’)

Разумеется бот стал слать сообщение одно за другим. По идеи мне нужно проверять соответствие дат 1 раз в сутки, делать sleep как-то не очень. Как реализовать, не соображу, подскажите.
И потом, переменные пришлось засунуть в цикл. Ими можно потом пользоваться в за пределами цикла?

stud_55@mail.ru добавлен комментарий

Чтобы отправлять сообщения 1 раз в сутки можно использовать schedule (https://schedule.readthedocs.io/en/stable/) или другие подобные библиотеки.

Матвей добавлен комментарий

УРА! Все заработало. Всем большое спасибо!
Если кому интересно, выглядит это все вот так.
import telebot
import datetime
import schedule
import time
from multiprocessing import Process

#массив для названия месяцев в нужном падеже
a = [‘января.’, ‘февраля.’, ‘марта.’, ‘апреля.’, ‘мая.’, ‘июня.’, ‘июля.’, ‘августа.’, ‘сентября.’, ‘октября.’, ‘ноября.’, ‘декабря.’]

TOKEN = ‘…’
bot = telebot.TeleBot(TOKEN)

now = datetime.datetime.now()
a1 = datetime.datetime(2007, 11, 20)
delta1 = now — a1

#обработка команды start
@bot.message_handler(commands=[‘start’])
def start_message(message):
bot.send_message(message.chat.id, ‘Сообщение инструкция’)

#обработка имен одноклассников и сообщение о дате дня рождения.
@bot.message_handler(content_types=[‘text’])
def send_text(message):
if message.text.lower() == ‘матвей’:
bot.send_message(message.chat.id, ‘У него день рождения ‘ +a1.strftime(«%d «) +a[10] +’ Ему будет ‘ +str(delta1.days // 365 + 1) +’ лет.’)
else:
bot.send_message(message.chat.id, ‘Вы похоже не правильно написали имя. Повторите попытку.’)

#проверка даты и отправка сообщения
def send():
if a1.month == now.month and a1.day == now.day:
bot.send_message(-100…..,’Сегодня день рождения у Матвея.’ + Ему исполнилось ‘ +str(delta1.days // 365 ) +’ лет.’ )

#периодичность проверки даты. Каждый день в 8 утра.
def timer():
schedule.every().day.at(«08:00»).do(send)
while True:
schedule.run_pending()
time.sleep(1)

#это я подсмотрел. Надо разобраться, что за потоки.
p1 = Process(target=timer, args=())
p1.start()

bot.polling(none_stop=True)

Добавить комментарий