Я перерыл кучу ресурсов, на которых используют aiogram3 и при этом отправляют отложенные сообщения. У меня не чистый код, разбит на пару файлов, но вот его основная часть.
Что можно почитать или посмотреть, чтобы понять как реализовать отправку сообщений по расписанию?
Вот моя попытка реализовать это через aioschedule и вызове его в main()
Код:
import asyncio
import logging
import aioschedule
from aiogram import Bot, Dispatcher, types, F
from config import TOKEN
from schedule import auto_posting
bot = Bot(token=TOKEN)
dp = Dispatcher()
#Здесь обработка сообщений, всё работает стабильно через @dp хэндлеры
async def scheduler():
aioschedule.every().day.at("23:51").do(asyncio.create_task(auto_posting(bot)))
async def on_startup():
await asyncio.create_task(scheduler())
async def main():
logging.basicConfig(level=logging.INFO)
await asyncio.gather(
dp.start_polling(bot),
on_startup(),
)
if __name__ == '__main__':
asyncio.run(main())
Вот код функций из других файлов:
async def auto_posting(bot: Bot):
await database.connect_db()
data = await database.get_one_post()
text = str(data[0])
photo = str(data[1])
kb = data[2]
print(text, photo, kb)
if photo != 'NULL':
await bot.send_photo(channel_id,
photo=types.FSInputFile(path=photo),
caption=text,
reply_markup=kb,
parse_mode='HTML')
else:
await bot.send_message(channel_id,
text=text,
reply_markup=kb,
parse_mode='HTML')
async def get_one_post():
data = cur.execute('SELECT text, media_path, inline_urls FROM posts WHERE status = ?', (0,)).fetchone()
text = data[0]
photo = data[1]
urls_temp = data[2]
if urls_temp is not 'NULL':
urls = []
for x in urls_temp:
urls.append(x.split(' - '))
buttons = []
for x in urls:
buttons.append([types.InlineKeyboardButton(text=x[0], url=x[1])])
kb = types.InlineKeyboardMarkup(inline_keyboard=buttons)
else:
kb = None
return text, photo, kb
Я готов тратить время на решение этого вопроса без полного переписывания бота в модульную форму.
Читал его про telethon, но это либо переписывать бота полностью, либо писать второго исключительно для работы с бд, а хотелось бы всё сделать с aiogram.
Вариант с loop.time() + delay тоже не подходит ибо нужно высчитывать время отправки, а при любом сбое серверов менять эти значения.