From a1cefe437de02e407332818b1983d09e2fbb8ba3 Mon Sep 17 00:00:00 2001 From: AlberLC Date: Sun, 5 Mar 2023 06:41:45 +0100 Subject: [PATCH] Add UberEatsBot support for multiple cookies --- flanabot/bots/flana_bot.py | 2 +- flanabot/bots/ubereats_bot.py | 100 ++++++++++++++++++++-------------- flanabot/models/chat.py | 4 +- 3 files changed, 63 insertions(+), 43 deletions(-) diff --git a/flanabot/bots/flana_bot.py b/flanabot/bots/flana_bot.py index 5e2a1cc..3eddbd0 100644 --- a/flanabot/bots/flana_bot.py +++ b/flanabot/bots/flana_bot.py @@ -273,7 +273,7 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe "ubereats_cookies": {"$exists": True, "$ne": []} }): chat = await self.get_chat(chat.id) - chat.pull_from_database(overwrite_fields=('ubereats_seconds',)) + chat.pull_from_database(overwrite_fields=('_id', 'config', 'ubereats_cookies', 'ubereats_seconds')) await self.start_ubereats(chat, send_code_now=False) @inline(False) diff --git a/flanabot/bots/ubereats_bot.py b/flanabot/bots/ubereats_bot.py index 71cd4fa..546b419 100644 --- a/flanabot/bots/ubereats_bot.py +++ b/flanabot/bots/ubereats_bot.py @@ -46,44 +46,62 @@ class UberEatsBot(MultiBot, ABC): if self.playwright: await self.playwright.stop() - async def _scrape_code(self, chat: Chat) -> str: + async def _scrape_codes(self, chat: Chat) -> list[str]: + codes = [] + self.playwright = await playwright.async_api.async_playwright().start() - self.browser = await self.playwright.chromium.launch() - context: playwright.async_api.BrowserContext = await self.browser.new_context() - await context.add_cookies(chat.ubereats_cookies) - page = await context.new_page() - await page.goto('https://www.myunidays.com/ES/es-ES/partners/ubereats/access/online') + chat.pull_from_database(overwrite_fields=('ubereats_cookies',)) + for i, cookies in enumerate(chat.ubereats_cookies): + for _ in range(3): + try: + self.browser = await self.playwright.chromium.launch() + context: playwright.async_api.BrowserContext = await self.browser.new_context() + await context.add_cookies(cookies) - if button := await page.query_selector("button[class='button highlight']"): - await button.click() - else: - await page.click("'Revelar código'") - while len(context.pages) != 2: - await asyncio.sleep(0.5) - page = context.pages[1] + page = await context.new_page() + await page.goto('https://www.myunidays.com/ES/es-ES/partners/ubereats/access/online') - 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'") - if new_code_button and await new_code_button.is_enabled(): - await new_code_button.click() - await page.wait_for_load_state('networkidle') + if button := await page.query_selector("button[class='button highlight']"): + await button.click() + else: + await page.click("'Revelar código'") + while len(context.pages) != 2: + await asyncio.sleep(0.5) + page = context.pages[1] - if code_input := await page.query_selector("input[class='code toCopy']"): - code = await code_input.input_value() - else: - if button := await page.query_selector("button[class='copy button quarternary']"): - await button.click() - else: - await page.click("'Copiar'") - code = pyperclip.paste() + 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'") + if new_code_button and await new_code_button.is_enabled(): + await new_code_button.click() + await page.wait_for_load_state('networkidle') + + if code_input := await page.query_selector("input[class='code toCopy']"): + code = await code_input.input_value() + else: + if button := await page.query_selector("button[class='copy button quarternary']"): + await button.click() + else: + await page.click("'Copiar'") + code = pyperclip.paste() + codes.append(code) + + chat.ubereats_cookies[i] = await context.cookies('https://www.myunidays.com') + + except playwright.async_api.Error: + pass + else: + break + finally: + if self.browser: + await self.browser.close() + + if self.playwright: + await self.playwright.stop() - chat.ubereats_cookies = await context.cookies('https://www.myunidays.com') chat.save() - await self._close_playwright() - - return code + return codes # ---------------------------------------------- # # HANDLERS # @@ -115,24 +133,26 @@ class UberEatsBot(MultiBot, ABC): # -------------------- PUBLIC METHODS -------------------- # # -------------------------------------------------------- # async def send_ubereats_code(self, chat: Chat): - code = await self._scrape_code(chat) + new_codes = [] + for code in await self._scrape_codes(chat): + new_codes.append(code) - if chat.ubereats_last_code == code: - warning_text = 'Código ya enviado anteriormente:' - else: - chat.ubereats_last_code = code - chat.save() - warning_text = '' + if code in chat.ubereats_last_codes: + warning_text = 'Código ya enviado anteriormente:' + else: + warning_text = '' + await self.send(f'{warning_text} {code}', chat, silent=True) - await self.send(f'{warning_text} {code}', chat, silent=True) + chat.ubereats_last_codes = new_codes + chat.save() async def start_ubereats(self, chat: Chat, send_code_now=True): await self._cancel_scraping_task(chat) chat.config['ubereats'] = True - chat.save() + 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) async def stop_ubereats(self, chat: Chat): await self._cancel_scraping_task(chat) chat.config['ubereats'] = False - chat.save() + chat.save(pull_overwrite_fields=('ubereats_cookies',)) diff --git a/flanabot/models/chat.py b/flanabot/models/chat.py index 81608f4..cf6cf60 100644 --- a/flanabot/models/chat.py +++ b/flanabot/models/chat.py @@ -18,8 +18,8 @@ class Chat(MultiBotChat): } config: dict = field(default_factory=dict) - ubereats_cookies: list[dict] = field(default_factory=list) - ubereats_last_code: str = None + ubereats_cookies: list[list[dict]] = field(default_factory=list) + ubereats_last_codes: list[str] = field(default_factory=list) ubereats_seconds: int = 86700 def __post_init__(self):