Files
nekretnine_parser/main.py
2022-10-20 10:28:21 +02:00

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())