Randomness in interval and increasing waiting time to prevent API ban

This commit is contained in:
Brieuc Dubois 2024-01-21 18:27:36 +01:00
parent a2eff32362
commit 24df340049
1 changed files with 72 additions and 35 deletions

107
main.py
View File

@ -1,4 +1,5 @@
from tgtg import TgtgClient from tgtg import TgtgClient
from tgtg.exceptions import TgtgAPIError
import os import os
import json import json
import telegram import telegram
@ -6,7 +7,16 @@ import asyncio
import time import time
import datetime import datetime
import requests 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 client = None
telegram_bot = None telegram_bot = None
@ -16,6 +26,21 @@ if removal_notification is None:
removal_notification = False 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(): def check_env():
if os.environ.get('TGTG_EMAIL') is None: if os.environ.get('TGTG_EMAIL') is None:
return False return False
@ -74,53 +99,65 @@ async def main():
last = [] last = []
while True: while True:
items = client.get_items() try:
items = client.get_items()
texts = [] texts = []
next = [] next = []
for item in items: for item in items:
if item['items_available'] > 0: if item['items_available'] > 0:
next.append(item["item"]["item_id"]) next.append(item["item"]["item_id"])
if item["item"]["item_id"] not in last: if item["item"]["item_id"] not in last:
amount = item["items_available"] amount = item["items_available"]
item_name = item["item"]["name"] item_name = item["item"]["name"]
price = item["item"]["price_including_taxes"]["minor_units"]/(10**item["item"]["price_including_taxes"]["decimals"]) price = item["item"]["price_including_taxes"]["minor_units"]/(10**item["item"]["price_including_taxes"]["decimals"])
store_name = item["store"]["store_name"] store_name = item["store"]["store_name"]
store_branch = item["store"]["branch"] 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: if not name:
name = "Panier anti-gaspi" name = "Panier anti-gaspi"
texts.append(f'{amount} x "{name}" ({price:.2f}€)') texts.append(f'{amount} x "{name}" ({price:.2f}€)')
elif removal_notification and item["item"]["item_id"] in last: elif removal_notification and item["item"]["item_id"] in last:
amount = item["items_available"] amount = item["items_available"]
name = item["item"]["name"] name = item["item"]["name"]
price = item["item"]["price_including_taxes"]["minor_units"]/(10**item["item"]["price_including_taxes"]["decimals"]) price = item["item"]["price_including_taxes"]["minor_units"]/(10**item["item"]["price_including_taxes"]["decimals"])
store_name = item["store"]["store_name"] store_name = item["store"]["store_name"]
store_branch = item["store"]["branch"] 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: if not name:
name = "Panier anti-gaspi" 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) await send_message(texts)
else: else:
print('-', end='', flush=True) print('-', end='', flush=True)
last = next last = next
time.sleep(60) 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__': if __name__ == '__main__':
print('Check environ:', check_env()) print('Check environ:', check_env())