diff --git a/RAAspotter.py b/RAAspotter.py index e291ddd0336024411f1363a5144106f3d3d7a092..fef1576eef93ca8f1a658bae38ff74e36db16b33 100644 --- a/RAAspotter.py +++ b/RAAspotter.py @@ -22,6 +22,8 @@ import hashlib import smtplib from email.message import EmailMessage +from mastodon import Mastodon + logger = logging.getLogger(__name__) class RAAspotter: @@ -60,6 +62,8 @@ class RAAspotter: self.tor_requests = 0 self.not_before = datetime.datetime(1970, 1, 1) self.smtp_configured = False + self.mastodon = None + self.mastodon_prefix = '' self.update_user_agent(user_agent) @@ -67,6 +71,21 @@ class RAAspotter: f.write('') f.close() + def configure_mastodon(self, access_token, instance, mastodon_prefix): + if (not access_token == "") and (not instance == ""): + self.mastodon = Mastodon( + access_token=access_token, + api_base_url=instance + ) + self.mastodon_prefix = mastodon_prefix + + def mastodon_toot(self, content): + if self.mastodon: + if not self.mastodon_prefix == '': + self.mastodon.toot(f'{self.mastodon_prefix} {content}') + else: + self.mastodon.toot(f'{self.mastodon_prefix} {content}') + def enable_tor(self, max_requests=0): proxies = { "http": f"socks5h://localhost:9050", @@ -203,6 +222,7 @@ class RAAspotter: else: text = extract_text(f'{self.data_dir}{raa.get_sha256()}.pdf') found = False + found_keywords = [] for keyword in keywords: if re.search(keyword, text, re.IGNORECASE|re.MULTILINE): if not found: @@ -212,6 +232,7 @@ class RAAspotter: found = True self.found = True self.print_output(f' Le terme \033[1m{keyword}\033[0m a été trouvé.') + found_keywords.append(keyword) # Écrit le texte du PDF dans un fichier texte pour une analyse future, puis supprime le PDF f = open(f'{self.data_dir}{raa.get_sha256()}.txt','w') @@ -220,6 +241,10 @@ class RAAspotter: os.remove(f'{self.data_dir}{raa.get_sha256()}.pdf') if found: self.print_output('') + url = quote(raa.url, safe='/:') + found_keywords_str = ', '.join([str(x) for x in found_keywords]) + self.mastodon_toot(f"{raa.name} ({raa.date}).\n\nLes termes suivants ont été trouvés : {found_keywords_str}\n\nURL : {url}") + def ocr(self, raa, retry_on_failure=True): cmd = ['ocrmypdf', '-l', 'eng+fra', '--output-type', 'pdfa', '--redo-ocr', '--skip-big', '500' , f'{self.data_dir}{raa.get_sha256()}.pdf', f'{self.data_dir}{raa.get_sha256()}.pdf'] diff --git a/README.md b/README.md index 43af65ac6c4d4bc4e129b038cbd636db22169622..529793b372f1f25a09d0b802451153c34579b316 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Une série de scripts en Python qui récupère les derniers recueils des actes a Conçu pour être utilisé dans une CI. +Peut envoyer par email et sur Mastodon les résultats. + ## Installation Il est recommandé d'utiliser virtualenv : diff --git a/ppparis.py b/ppparis.py index 7b4678e15217f75f73ba439889c779119b1931aa..d938e6d412beccc7e637f2cdef0d5f76310b6d2e 100755 --- a/ppparis.py +++ b/ppparis.py @@ -30,6 +30,8 @@ if os.getenv('NOT_BEFORE'): __NOT_BEFORE = datetime.datetime.strptime(os.getenv('NOT_BEFORE'), '%Y-%m-%d') else: __NOT_BEFORE = datetime.datetime(1970, 1, 1) +__MASTODON_ACCESS_TOKEN = os.getenv('MASTODON_ACCESS_TOKEN') +__MASTODON_INSTANCE = os.getenv('MASTODON_INSTANCE') # Début du script parser = argparse.ArgumentParser(prog='ppparis.py', description='Télécharge les RAA de la Préfecture de police de Paris et recherche des mots-clés') @@ -43,6 +45,8 @@ parser.add_argument('--smtp-starttls', action='store_true', help='connexion SMTP parser.add_argument('--smtp-ssl', action='store_true', help='connexion SMTP avec SSL') parser.add_argument('-f', '--email-from', action='store', help='adresse de courrier électronique expéditrice des notifications') parser.add_argument('-t', '--email-to', action='store', help='adresses de courrier électronique destinataires des notifications (séparées par une virgule)') +parser.add_argument('--mastodon-access-token', action='store', help='jeton d\'accès pour publier sur Mastodon (par défaut : vide)') +parser.add_argument('--mastodon-instance', action='store', help='URL de l\'instance (doit inclure "http://" ou "https://" ; par défaut : vide)') parser.add_argument('-v', action='store_true', help='relève le niveau de verbosité à INFO') parser.add_argument('-vv', action='store_true', help='relève le niveau de verbosité à DEBUG') args = parser.parse_args() @@ -83,6 +87,12 @@ if args.email_from: if args.email_to: __EMAIL_TO = args.email_to +if args.mastodon_access_token: + __MASTODON_ACCESS_TOKEN = args.mastodon_access_token + +if args.mastodon_instance: + __MASTODON_INSTANCE = args.mastodon_instance + # On crée le dossier de téléchargement os.makedirs(__DATA_DIR, exist_ok=True) @@ -90,5 +100,6 @@ raa_spotter = RAAspotter_ppparis(__DATA_DIR) raa_spotter.not_before = __NOT_BEFORE raa_spotter.configure_mailer(__SMTP_HOSTNAME, __SMTP_USERNAME, __SMTP_PASSWORD, __SMTP_PORT, __SMTP_STARTTLS, __SMTP_SSL, __EMAIL_FROM, __EMAIL_TO, - '[RAAspotter] [ppparis] Nouveaux éléments trouvés') + '[RAAspotter] [Préfecture de police de Paris] Nouveaux éléments trouvés') +raa_spotter.configure_mastodon(__MASTODON_ACCESS_TOKEN, __MASTODON_INSTANCE, '[Préfecture de police de Paris]') raa_spotter.get_raa(__KEYWORDS) diff --git a/pref13.py b/pref13.py index 75eadcbacf712a0761683cb3d7ee211e66666953..309d11db5a89a7595217c29fd6ceed012751b04c 100755 --- a/pref13.py +++ b/pref13.py @@ -30,6 +30,8 @@ if os.getenv('NOT_BEFORE'): __NOT_BEFORE = datetime.datetime.strptime(os.getenv('NOT_BEFORE'), '%Y-%m-%d') else: __NOT_BEFORE = datetime.datetime(1970, 1, 1) +__MASTODON_ACCESS_TOKEN = os.getenv('MASTODON_ACCESS_TOKEN') +__MASTODON_INSTANCE = os.getenv('MASTODON_INSTANCE') # Début du script parser = argparse.ArgumentParser(prog='pref13.py', description='Télécharge les RAA de la préfecture des Bouches-du-Rhône et recherche des mots-clés') @@ -43,6 +45,8 @@ parser.add_argument('--smtp-starttls', action='store_true', help='connexion SMTP parser.add_argument('--smtp-ssl', action='store_true', help='connexion SMTP avec SSL') parser.add_argument('-f', '--email-from', action='store', help='adresse de courrier électronique expéditrice des notifications') parser.add_argument('-t', '--email-to', action='store', help='adresses de courrier électronique destinataires des notifications (séparées par une virgule)') +parser.add_argument('--mastodon-access-token', action='store', help='jeton d\'accès pour publier sur Mastodon (par défaut : vide)') +parser.add_argument('--mastodon-instance', action='store', help='URL de l\'instance (doit inclure "http://" ou "https://" ; par défaut : vide)') parser.add_argument('-v', action='store_true', help='relève le niveau de verbosité à INFO') parser.add_argument('-vv', action='store_true', help='relève le niveau de verbosité à DEBUG') args = parser.parse_args() @@ -83,6 +87,12 @@ if args.email_from: if args.email_to: __EMAIL_TO = args.email_to +if args.mastodon_access_token: + __MASTODON_ACCESS_TOKEN = args.mastodon_access_token + +if args.mastodon_instance: + __MASTODON_INSTANCE = args.mastodon_instance + # On crée le dossier de téléchargement os.makedirs(__DATA_DIR, exist_ok=True) @@ -90,5 +100,6 @@ raa_spotter = RAAspotter_pref13(__DATA_DIR) raa_spotter.not_before = __NOT_BEFORE raa_spotter.configure_mailer(__SMTP_HOSTNAME, __SMTP_USERNAME, __SMTP_PASSWORD, __SMTP_PORT, __SMTP_STARTTLS, __SMTP_SSL, __EMAIL_FROM, __EMAIL_TO, - '[RAAspotter] [pref13] Nouveaux éléments trouvés') + '[RAAspotter] [Préfecture des Bouches-du-Rhône] Nouveaux éléments trouvés') +raa_spotter.configure_mastodon(__MASTODON_ACCESS_TOKEN, __MASTODON_INSTANCE, '[Préfecture des Bouches-du-Rhône]') raa_spotter.get_raa(__KEYWORDS) diff --git a/pref35.py b/pref35.py index 5de33c61eb5bbc9b26be19e2df1969c86880ff30..4e9603cff490f69346505ea92fac6068104945fc 100755 --- a/pref35.py +++ b/pref35.py @@ -30,6 +30,8 @@ if os.getenv('NOT_BEFORE'): __NOT_BEFORE = datetime.datetime.strptime(os.getenv('NOT_BEFORE'), '%Y-%m-%d') else: __NOT_BEFORE = datetime.datetime(1970, 1, 1) +__MASTODON_ACCESS_TOKEN = os.getenv('MASTODON_ACCESS_TOKEN') +__MASTODON_INSTANCE = os.getenv('MASTODON_INSTANCE') # Début du script parser = argparse.ArgumentParser(prog='pref35.py', description='Télécharge les RAA de la préfecture d\'Ille-et-Vilaine et recherche des mots-clés') @@ -43,6 +45,8 @@ parser.add_argument('--smtp-starttls', action='store_true', help='connexion SMTP parser.add_argument('--smtp-ssl', action='store_true', help='connexion SMTP avec SSL') parser.add_argument('-f', '--email-from', action='store', help='adresse de courrier électronique expéditrice des notifications') parser.add_argument('-t', '--email-to', action='store', help='adresses de courrier électronique destinataires des notifications (séparées par une virgule)') +parser.add_argument('--mastodon-access-token', action='store', help='jeton d\'accès pour publier sur Mastodon (par défaut : vide)') +parser.add_argument('--mastodon-instance', action='store', help='URL de l\'instance (doit inclure "http://" ou "https://" ; par défaut : vide)') parser.add_argument('-v', action='store_true', help='relève le niveau de verbosité à INFO') parser.add_argument('-vv', action='store_true', help='relève le niveau de verbosité à DEBUG') args = parser.parse_args() @@ -83,6 +87,12 @@ if args.email_from: if args.email_to: __EMAIL_TO = args.email_to +if args.mastodon_access_token: + __MASTODON_ACCESS_TOKEN = args.mastodon_access_token + +if args.mastodon_instance: + __MASTODON_INSTANCE = args.mastodon_instance + # On crée le dossier de téléchargement os.makedirs(__DATA_DIR, exist_ok=True) @@ -90,5 +100,6 @@ raa_spotter = RAAspotter_pref35(__DATA_DIR) raa_spotter.not_before = __NOT_BEFORE raa_spotter.configure_mailer(__SMTP_HOSTNAME, __SMTP_USERNAME, __SMTP_PASSWORD, __SMTP_PORT, __SMTP_STARTTLS, __SMTP_SSL, __EMAIL_FROM, __EMAIL_TO, - '[RAAspotter] [ppparis] Nouveaux éléments trouvés') + '[RAAspotter] [Préfecture d\'Ille-et-Vilaine] Nouveaux éléments trouvés') +raa_spotter.configure_mastodon(__MASTODON_ACCESS_TOKEN, __MASTODON_INSTANCE, '[Préfecture d\'Ille-et-Vilaine]') raa_spotter.get_raa(__KEYWORDS) diff --git a/requirements.txt b/requirements.txt index e206a7a93a6da943fd1d632d2d3cd806fca54b60..0ae92bce4b09529135445e9138f9c10899fe0207 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ pyvirtualdisplay pdfminer.six requests stem +Mastodon.py