Как сделать отправку сообщение каждый час?
elif message.text == 'Подписаться':
bot.send_message(message.chat.id, 'Подписка оформлена')
def son(message):
bot.send_message(message.chat.id, 'Я сплю')
def zavtrak(message):
bot.send_message(message.chat.id, 'Я Завтракаю')
def rabota(message):
bot.send_message(message.chat.id, 'Начинаю работать,делаю превьюшки,ютубчик все дела.')
schedule.every().day.at("04:00").do(son(message))
schedule.every().day.at("05:00").do(son(message))
schedule.every().day.at("06:00").do(son(message))
schedule.every().day.at("07:00").do(son(message))
schedule.every().day.at("08:00").do(son(message))
schedule.every().day.at("09:00").do(son(message))
schedule.every().day.at("10:00").do(son(message))
schedule.every().day.at("11:00").do(son(message))
schedule.every().day.at("12:00").do(son(message))
schedule.every().day.at("13:00").do(son(message))
schedule.every().day.at("14:00").do(son(message))
schedule.every().day.at("15:00").do(zavtrak(message))
schedule.every().day.at("16:00").do(rabota(message))
schedule.every().day.at("17:00").do(rabota(message))
schedule.every().day.at("18:00").do(rabota(message))
schedule.every().day.at("19:00").do(rabota(message))
schedule.every().day.at("20:00").do(rabota(message))
schedule.every().day.at("21:00").do(rabota(message))
schedule.every().day.at("22:00").do(rabota(message))
schedule.every().day.at("23:00").do(rabota(message))
schedule.every().day.at("24:00").do(rabota(message))
schedule.every().day.at("01:00").do(rabota(message))
schedule.every().day.at("02:00").do(rabota(message))
schedule.every().day.at("03:00").do(rabota(message))
Есть условие что если человек нажимает на кнопку "подписаться" то ему каждый час начинается отправляться сообщение из определенной функции. Как это реализовать? Я попробовал использовать schedule.Но как правильно с ним работать не понял, даже по методичке.При запуске бот выполняет отправку сообщения с подпиской,выполняет первую функцию son(Причем мгновенно) и выключается ,выдавая это
Traceback (most recent call last): File "C:\Users\bossc\Desktop\Project\main.py", line 149, in bot.polling() File "C:\Users\bossc\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot_init_.py", line 485, in polling self._threaded_polling(none_stop, interval, timeout, long_polling_timeout) File "C:\Users\bossc\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot_init.py", line 544, in _threaded_polling raise e File "C:\Users\bossc\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot_init.py", line 507, in _threaded_polling self.worker_pool.raise_exceptions() File "C:\Users\bossc\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\util.py", line 117, in raise_exceptions raise self.exception_info File "C:\Users\bossc\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\util.py", line 69, in run task(*args, **kwargs) File "C:\Users\bossc\Desktop\Project\main.py", line 121, in next6 schedule.every().day.at("04:00").do(son(message)) File "C:\Users\bossc\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule_init.py", line 471, in do self.job_func = functools.partial(job_func, *args, **kwargs) TypeError: the first argument must be callable
Не особо понял как это все реализовать. Может есть другой способ?
Ответы (3 шт):
Используйте асинхронность, самый простой способ решения задачи
import asyncio
loop = asyncio.get_event_loop()
async def spam_start():
while True:
print("Какое-то сообщение")
await asyncio.sleep(3) # время в секундах
loop.run_until_complete(spam_start())
Если таких человек много, то подобная реализация теряет смысл. Тогда нужно сделать скрипт, который будет запускаться раз в час, например с помощью cron, брать сообщения из бд и отправлять их кому нужно
async def scheduler():
aioschedule.every(30).minutes.do(start_function)
#aioschedule.every(1).hours.do(start_function) каждый час
while True:
await aioschedule.run_pending()
await asyncio.sleep(1)
import asyncio
import aioschedule as schedule
import time
async def job(message='stuff', n=1):
print("Asynchronous invocation (%s) of I'm working on:" % n, message)
asyncio.sleep(1)
for i in range(1,3):
schedule.every(1).seconds.do(job, n=i)
schedule.every(5).to(10).days.do(job)
schedule.every().hour.do(job, message='things')#Каждый час!
schedule.every().day.at("10:30").do(job)
loop = asyncio.get_event_loop()
while True:
loop.run_until_complete(schedule.run_pending())
time.sleep(0.1)
Читайте документацию https://pypi.org/project/aioschedule/