73 lines
1.6 KiB
Python
73 lines
1.6 KiB
Python
import asyncio
|
|
from asyncio.queues import Queue
|
|
|
|
from datetime import date
|
|
|
|
import hashlib
|
|
from sqlitedict import SqliteDict
|
|
from parsers import PARSERS
|
|
from parsers.base import Announcement
|
|
import aiogram
|
|
|
|
|
|
BOT_TOKEN = "1111111111:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
|
CHANNEL_ID = -1001872853621
|
|
|
|
bot = aiogram.Bot(BOT_TOKEN)
|
|
|
|
|
|
async def start_parsers(db: SqliteDict, queue: Queue) -> None:
|
|
await asyncio.gather(
|
|
*[parser.start_parse(db, queue) for parser in PARSERS]
|
|
)
|
|
|
|
|
|
async def notify(item: Announcement) -> bool:
|
|
message = item.link
|
|
|
|
try:
|
|
await bot.send_message(CHANNEL_ID, message)
|
|
return True
|
|
except aiogram.exceptions.TelegramAPIError:
|
|
return False
|
|
|
|
|
|
async def start_notifier(db: SqliteDict, queue: Queue) -> None:
|
|
while True:
|
|
item: Announcement = await queue.get()
|
|
|
|
link_hash = hashlib.md5(item.link.encode()).hexdigest()
|
|
|
|
current_value = db.get(link_hash, None)
|
|
item_date = item.update_date
|
|
|
|
if current_value != item_date.isoformat():
|
|
if item_date == date.today():
|
|
if await notify(item):
|
|
db[link_hash] = item_date.isoformat()
|
|
db.commit()
|
|
else:
|
|
db[link_hash] = item_date.isoformat()
|
|
db.commit()
|
|
|
|
await asyncio.sleep(1)
|
|
|
|
|
|
async def main():
|
|
db = SqliteDict("notify.sqlite")
|
|
|
|
queue = Queue()
|
|
|
|
try:
|
|
await asyncio.gather(
|
|
start_parsers(db, queue),
|
|
start_notifier(db, queue)
|
|
)
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
while True:
|
|
asyncio.run(main())
|