From 5f18d9ca5405aa3c1e78645e155b8ed5ebf7eeb5 Mon Sep 17 00:00:00 2001 From: Bastien Le Querrec <blq@laquadrature.net> Date: Sun, 1 Dec 2024 19:02:06 +0100 Subject: [PATCH] =?UTF-8?q?Attrap=5Fbot:=20stocke=20la=20date=20de=20d?= =?UTF-8?q?=C3=A9tection=20du=20dernier=20RAA=20vu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Attrap_bot.py | 81 ++++++++++++++++++++++++++++-------------------- requirements.txt | 1 + 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/Attrap_bot.py b/Attrap_bot.py index fa16364..192684d 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 a76ddfe..a4a8a81 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 -- GitLab