diff --git a/Attrap_bot.py b/Attrap_bot.py index fa163643ee745f97e8d426f5a34fcc5c4bc58a58..192684d1e955daa655b2c5b3875d1e6e90ead5f8 100644 --- a/Attrap_bot.py +++ b/Attrap_bot.py @@ -4,6 +4,7 @@ import hashlib import json import logging import os +import pytz import requests import smtplib import ssl @@ -156,10 +157,13 @@ class Attrap_bot: status_file_path = f'{query_id}.latest.txt' if os.path.isfile(status_file_path): status = open(status_file_path, 'r').read().strip() + last_raa_id = status.split('|')[0] + last_raa_first_seen_on = datetime.datetime.fromtimestamp(float(status.split('|')[1]), pytz.utc) send_results = True else: logger.info('Requête lancée pour la première fois, les résultats ne seront pas envoyés') - status = '0000000000000000000000000000000000000000000000000000000000000000' + last_raa_id = '0000000000000000000000000000000000000000000000000000000000000000' + last_raa_first_seen_on = datetime.datetime.now(pytz.utc) if self.config['send_on_new_queries']: send_results = True else: @@ -173,59 +177,68 @@ class Attrap_bot: if os.path.isfile(status_file_path): os.remove(status_file_path) status_file = open(status_file_path, 'w') + + status = f'{last_raa_id}|{int(round(last_raa_first_seen_on.timestamp()))}' status_file.write(status) status_file.close() else: # Si le dernier RAA n'est pas celui connu, on analyse les résultats latest = raa[0] - if latest['id'] != status: + if latest['id'] != last_raa_id: email_message = "" # On récupère les derniers RAA jusqu'à ce qu'on trouve le dernier analysé raa_candidates = [] for result in raa: - if result['id'] != status: + if result['id'] != last_raa_id: raa_candidates.append(result) else: break # Maintenant, on prend les derniers RAA à analyser, pour commencer par les plus anciens en premier for result in raa_candidates[::-1]: - status = result['id'] - - # On affiche le résultat dans la console - if (self.config['console_output']): - print(f"\033[92m{result['name']}\033[0m ({result['date']}) : {result['url']}") - - if send_results: - # On ajoute le résultat à la liste des RAA à publier - if send_to_mastodon: - if not raa_to_publish_mastodon.get(query['mastodon']): - raa_to_publish_mastodon[query['mastodon']] = {} - # On regroupe les toots par RAA (un toot par RAA) - if not raa_to_publish_mastodon[query['mastodon']].get(result['id']): - raa_to_publish_mastodon[query['mastodon']][result['id']] = result - # On indique le hashtag de la requête - if not raa_to_publish_mastodon[query['mastodon']][result['id']].get('hashtags'): - raa_to_publish_mastodon[query['mastodon']][result['id']]['hashtags'] = [] - raa_to_publish_mastodon[query['mastodon']][result['id']]['hashtags'].append(hashtag) - - if send_email: - if not raa_to_publish_email.get(query['email']): - raa_to_publish_email[query['email']] = {} - # On regroupe les mails par administration (un mail par administration) - if not raa_to_publish_email[query['email']].get(result['administration']): - raa_to_publish_email[query['email']][result['administration']] = {} - if not raa_to_publish_email[query['email']][result['administration']].get(result['id']): - raa_to_publish_email[query['email']][result['administration']][result['id']] = result - # On indique le hashtag de la requête - if not raa_to_publish_email[query['email']][result['administration']][result['id']].get('queries'): - raa_to_publish_email[query['email']][result['administration']][result['id']]['queries'] = [] - raa_to_publish_email[query['email']][result['administration']][result['id']]['queries'].append(query_id) + # On vérifie que la date de détection du RAA est plus récente (au cas où l'API n'ait pas renvoyé + # tous les résultats, ce qui arrive pendant une mise à jour de la base de données) + first_seen_on = datetime.datetime.fromisoformat(result['first_seen_on']) + if first_seen_on > last_raa_first_seen_on: + last_raa_id = result['id'] + last_raa_first_seen_on = result['first_seen_on'] + + # On affiche le résultat dans la console + if (self.config['console_output']): + print(f"\033[92m{result['name']}\033[0m ({result['date']}) : {result['url']}") + + if send_results: + # On ajoute le résultat à la liste des RAA à publier + if send_to_mastodon: + if not raa_to_publish_mastodon.get(query['mastodon']): + raa_to_publish_mastodon[query['mastodon']] = {} + # On regroupe les toots par RAA (un toot par RAA) + if not raa_to_publish_mastodon[query['mastodon']].get(result['id']): + raa_to_publish_mastodon[query['mastodon']][result['id']] = result + # On indique le hashtag de la requête + if not raa_to_publish_mastodon[query['mastodon']][result['id']].get('hashtags'): + raa_to_publish_mastodon[query['mastodon']][result['id']]['hashtags'] = [] + raa_to_publish_mastodon[query['mastodon']][result['id']]['hashtags'].append(hashtag) + + if send_email: + if not raa_to_publish_email.get(query['email']): + raa_to_publish_email[query['email']] = {} + # On regroupe les mails par administration (un mail par administration) + if not raa_to_publish_email[query['email']].get(result['administration']): + raa_to_publish_email[query['email']][result['administration']] = {} + if not raa_to_publish_email[query['email']][result['administration']].get(result['id']): + raa_to_publish_email[query['email']][result['administration']][result['id']] = result + # On indique le hashtag de la requête + if not raa_to_publish_email[query['email']][result['administration']][result['id']].get('queries'): + raa_to_publish_email[query['email']][result['administration']][result['id']]['queries'] = [] + raa_to_publish_email[query['email']][result['administration']][result['id']]['queries'].append(query_id) if os.path.isfile(status_file_path): os.remove(status_file_path) status_file = open(status_file_path, 'w') + + status = f'{last_raa_id}|{int(round(last_raa_first_seen_on.timestamp()))}' status_file.write(status) status_file.close() diff --git a/requirements.txt b/requirements.txt index a76ddfe04af63a8344ca3df9d105f8b5d4b73525..a4a8a8127dd8490f8294420c8ebea8f29ec63a9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ Mastodon.py>=1.8.1 pycodestyle>=2.12.1 +pytz>=2024.2 pyyaml>=6.0.2 requests>=2.32.3