From 24df3400491acb45405969a57e0abc61dc59df89 Mon Sep 17 00:00:00 2001 From: Brieuc Dubois Date: Sun, 21 Jan 2024 18:27:36 +0100 Subject: [PATCH] Randomness in interval and increasing waiting time to prevent API ban --- main.py | 107 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 35 deletions(-) diff --git a/main.py b/main.py index 0082e24..3b23d7e 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,5 @@ from tgtg import TgtgClient +from tgtg.exceptions import TgtgAPIError import os import json import telegram @@ -6,7 +7,16 @@ import asyncio import time import datetime import requests +import random +initial_waiting_time = 60 +waiting_time = initial_waiting_time +waiting_time_limit = 60 * 60 * 24 +waiting_time_increase = 2 + +randomness = 0.1 + +interval = 60 client = None telegram_bot = None @@ -16,6 +26,21 @@ if removal_notification is None: removal_notification = False +def parse_duration(seconds): + seconds = int(seconds) + minutes = seconds // 60 + seconds = seconds % 60 + hours = minutes // 60 + minutes = minutes % 60 + + if hours > 0: + return f'{hours}h {minutes}m {seconds}s' + elif minutes > 0: + return f'{minutes}m {seconds}s' + else: + return f'{seconds}s' + + def check_env(): if os.environ.get('TGTG_EMAIL') is None: return False @@ -74,53 +99,65 @@ async def main(): last = [] while True: - items = client.get_items() + try: + items = client.get_items() - texts = [] + texts = [] - next = [] + next = [] - for item in items: - if item['items_available'] > 0: - next.append(item["item"]["item_id"]) - if item["item"]["item_id"] not in last: - amount = item["items_available"] - item_name = item["item"]["name"] - price = item["item"]["price_including_taxes"]["minor_units"]/(10**item["item"]["price_including_taxes"]["decimals"]) - store_name = item["store"]["store_name"] - store_branch = item["store"]["branch"] + for item in items: + if item['items_available'] > 0: + next.append(item["item"]["item_id"]) + if item["item"]["item_id"] not in last: + amount = item["items_available"] + item_name = item["item"]["name"] + price = item["item"]["price_including_taxes"]["minor_units"]/(10**item["item"]["price_including_taxes"]["decimals"]) + store_name = item["store"]["store_name"] + store_branch = item["store"]["branch"] - name = ', '.join(filter(bool, [item_name, store_name, store_branch])) + name = ', '.join(filter(bool, [item_name, store_name, store_branch])) - if not name: - name = "Panier anti-gaspi" + if not name: + name = "Panier anti-gaspi" - texts.append(f'{amount} x "{name}" ({price:.2f}€)') - elif removal_notification and item["item"]["item_id"] in last: - amount = item["items_available"] - name = item["item"]["name"] - price = item["item"]["price_including_taxes"]["minor_units"]/(10**item["item"]["price_including_taxes"]["decimals"]) - store_name = item["store"]["store_name"] - store_branch = item["store"]["branch"] + texts.append(f'{amount} x "{name}" ({price:.2f}€)') + elif removal_notification and item["item"]["item_id"] in last: + amount = item["items_available"] + name = item["item"]["name"] + price = item["item"]["price_including_taxes"]["minor_units"]/(10**item["item"]["price_including_taxes"]["decimals"]) + store_name = item["store"]["store_name"] + store_branch = item["store"]["branch"] - name = ', '.join(filter(bool, [item_name, store_name, store_branch])) + name = ', '.join(filter(bool, [item_name, store_name, store_branch])) - if not name: - name = "Panier anti-gaspi" + if not name: + name = "Panier anti-gaspi" - texts.append(f'no more "{name}"') + texts.append(f'no more "{name}"') - - if len(texts) > 1: + + if len(texts) > 1: - print(f'\n{datetime.datetime.now()}: {len(texts)-1} new items available') + print(f'\n{datetime.datetime.now()}: {len(texts)-1} new items available') - await send_message(texts) - else: - print('-', end='', flush=True) - - last = next - time.sleep(60) + await send_message(texts) + else: + print('-', end='', flush=True) + + last = next + time.sleep(interval + randomness * interval * (2 * random.random() - 1)) + + waiting_time = initial_waiting_time + + except TgtgAPIError as e: + print(e) + real_waiting_time = round(waiting_time + randomness * waiting_time * (2 * random.random() - 1)) + await send_message([f'tg² failed to fetch data, retrying in {parse_duration(real_waiting_time)}']) + time.sleep(real_waiting_time) + + if waiting_time < waiting_time_limit: + waiting_time *= waiting_time_increase if __name__ == '__main__': print('Check environ:', check_env())