Fix concurrent ubereats

This commit is contained in:
AlberLC
2023-03-06 07:12:08 +01:00
parent 14793e5eb5
commit 89207de059

View File

@@ -4,6 +4,7 @@ import asyncio
import datetime import datetime
import random import random
from abc import ABC from abc import ABC
from collections import defaultdict
import flanautils import flanautils
import playwright.async_api import playwright.async_api
@@ -22,7 +23,7 @@ class UberEatsBot(MultiBot, ABC):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.playwright: playwright.async_api.Playwright | None = None self.playwright: playwright.async_api.Playwright | None = None
self.browser: playwright.async_api.Browser | None = None self.browser: playwright.async_api.Browser | None = None
self.tasks = {} self.task_contexts: dict[int, dict] = defaultdict(lambda: defaultdict(lambda: None))
# -------------------------------------------------------- # # -------------------------------------------------------- #
# ------------------- PROTECTED METHODS ------------------ # # ------------------- PROTECTED METHODS ------------------ #
@@ -33,30 +34,30 @@ class UberEatsBot(MultiBot, ABC):
self.register(self._on_ubereats, 'ubereats', priority=2) self.register(self._on_ubereats, 'ubereats', priority=2)
async def _cancel_scraping_task(self, chat: Chat): async def _cancel_scraping_task(self, chat: Chat):
if not (task := self.tasks.get(chat.id)) or task.done(): if not (task := self.task_contexts[chat.id]['task']) or task.done():
return return
await self._close_playwright() await self._close_playwright(chat)
task.cancel() task.cancel()
del self.tasks[chat.id] del self.task_contexts[chat.id]
async def _close_playwright(self): async def _close_playwright(self, chat: Chat):
if self.browser: if browser := self.task_contexts[chat.id]['browser']:
await self.browser.close() await browser.close()
if self.playwright: if playwright_ := self.task_contexts[chat.id]['playwright']:
await self.playwright.stop() await playwright_.stop()
async def _scrape_codes(self, chat: Chat) -> list[str]: async def _scrape_codes(self, chat: Chat) -> list[str]:
codes = [] codes = []
self.playwright = await playwright.async_api.async_playwright().start() self.task_contexts[chat.id]['playwright'] = await playwright.async_api.async_playwright().start()
chat.pull_from_database(overwrite_fields=('ubereats_cookies',)) chat.pull_from_database(overwrite_fields=('ubereats_cookies',))
for i, cookies in enumerate(chat.ubereats_cookies): for i, cookies in enumerate(chat.ubereats_cookies):
for _ in range(3): for _ in range(3):
try: try:
self.browser = await self.playwright.chromium.launch() self.task_contexts[chat.id]['browser'] = await self.task_contexts[chat.id]['playwright'].chromium.launch()
context: playwright.async_api.BrowserContext = await self.browser.new_context() context: playwright.async_api.BrowserContext = await self.task_contexts[chat.id]['browser'].new_context()
await context.add_cookies(cookies) await context.add_cookies(cookies)
page = await context.new_page() page = await context.new_page()
@@ -66,10 +67,13 @@ class UberEatsBot(MultiBot, ABC):
await button.click() await button.click()
else: else:
await page.click("'Revelar código'") await page.click("'Revelar código'")
while len(context.pages) != 2: for _ in range(5):
if len(context.pages) == 2:
break
await asyncio.sleep(0.5) await asyncio.sleep(0.5)
else:
continue
page = context.pages[1] page = context.pages[1]
if not (new_code_button := await page.query_selector("button[class='getNewCode button secondary']")): if not (new_code_button := await page.query_selector("button[class='getNewCode button secondary']")):
new_code_button = await page.query_selector("'Obtener nuevo código'") new_code_button = await page.query_selector("'Obtener nuevo código'")
if new_code_button and await new_code_button.is_enabled(): if new_code_button and await new_code_button.is_enabled():
@@ -93,11 +97,11 @@ class UberEatsBot(MultiBot, ABC):
else: else:
break break
finally: finally:
if self.browser: if browser := self.task_contexts[chat.id]['browser']:
await self.browser.close() await browser.close()
if self.playwright: if playwright_ := self.task_contexts[chat.id]['playwright']:
await self.playwright.stop() await playwright_.stop()
chat.save() chat.save()
@@ -150,7 +154,7 @@ class UberEatsBot(MultiBot, ABC):
await self._cancel_scraping_task(chat) await self._cancel_scraping_task(chat)
chat.config['ubereats'] = True chat.config['ubereats'] = True
chat.save(pull_overwrite_fields=('ubereats_cookies',)) chat.save(pull_overwrite_fields=('ubereats_cookies',))
self.tasks[chat.id] = await flanautils.do_every(chat.ubereats_seconds, self.send_ubereats_code, chat, do_first_now=send_code_now) self.task_contexts[chat.id]['task'] = await flanautils.do_every(chat.ubereats_seconds, self.send_ubereats_code, chat, do_first_now=send_code_now)
async def stop_ubereats(self, chat: Chat): async def stop_ubereats(self, chat: Chat):
await self._cancel_scraping_task(chat) await self._cancel_scraping_task(chat)