From 0580e5f950f47058b19fb8cb8a55381872d97ee5 Mon Sep 17 00:00:00 2001
From: Bastien Le Querrec <blq@laquadrature.net>
Date: Sun, 17 Mar 2024 12:43:16 +0100
Subject: [PATCH] =?UTF-8?q?pref13:=20ajout=20du=20support=20de=20la=20pr?=
 =?UTF-8?q?=C3=A9fecture=20des=20Bouches-du-Rh=C3=B4ne?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 RAAspotter_pref13.py | 50 +++++++++++++++++++++++++
 README.md            |  1 +
 pref13.py            | 88 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 139 insertions(+)
 create mode 100644 RAAspotter_pref13.py
 create mode 100755 pref13.py

diff --git a/RAAspotter_pref13.py b/RAAspotter_pref13.py
new file mode 100644
index 0000000..8d1c269
--- /dev/null
+++ b/RAAspotter_pref13.py
@@ -0,0 +1,50 @@
+import os, sys
+
+from bs4 import BeautifulSoup
+from urllib.parse import unquote
+
+from RAAspotter import RAAspotter
+
+class RAAspotter_pref13(RAAspotter):
+
+  # Config
+  __HOST       = 'https://www.bouches-du-rhone.gouv.fr'
+  __RAA_PAGE   = f'{__HOST}/Publications/RAA-et-Archives'
+  __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
+
+  def __init__(self, data_dir):
+    super().__init__(data_dir, self.__USER_AGENT)
+    self.enable_tor(10)
+
+  def get_raa(self, keywords):
+    self.print_output('RAAspotter_pref13')
+    self.print_output(f'Termes recherchés: {keywords}')
+
+    page_content = self.get_page(self.__RAA_PAGE).content
+    sub_pages = self.get_sub_pages(page_content, 'div.fr-card__body div.fr-card__content h2.fr-card__title a', self.__HOST)
+    raa_elements = []
+    for page in sub_pages:
+      for element in self.get_raa_elements(self.get_page(page).content):
+        raa_elements.append(element)
+    self.parse_raa(raa_elements, keywords.split(','))
+
+  def get_raa_elements(self, page_content):
+    elements = []
+    # On charge le parser
+    soup = BeautifulSoup(page_content, 'html.parser')
+
+    # Pour chaque balise a, on regarde si c'est un PDF, et si oui on le parse
+    for a in soup.find_all('a', href=True):
+      if a['href'].endswith('.pdf'):
+        if a['href'].startswith('/'):
+          url = f"{self.__HOST}{a['href']}"
+        else:
+          url = a['href']
+
+        name     = unquote(url.split('/')[-1])
+        date     = "date non renseignée"
+        filename = unquote(url.split('/')[-1])
+
+        raa = RAAspotter.RAA(url, date, name, filename)
+        elements.append(raa)
+    return elements
diff --git a/README.md b/README.md
index fc27916..8801fb1 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,7 @@ Il est possible de ne lancer l'analyse que pour une seule administration, en lan
 ## Administrations supportées
 
 - Préfecture de police de Paris (`ppparis.py`)
+- Préfecture des Bouches-du-Rhône (`pref13.py`)
 
 ## Licence
 
diff --git a/pref13.py b/pref13.py
new file mode 100755
index 0000000..95cc42f
--- /dev/null
+++ b/pref13.py
@@ -0,0 +1,88 @@
+import os
+import argparse
+import logging
+
+from RAAspotter import RAAspotter
+from RAAspotter_pref13 import RAAspotter_pref13
+
+# Config
+__KEYWORDS = os.getenv('KEYWORDS') or 'vidéoprotection,caméras,captation,aéronef'
+__DATA_DIR = os.path.dirname(os.path.abspath(__file__))+'/data/pref13/'
+__SMTP_HOSTNAME = os.getenv('SMTP_HOSTNAME') or 'localhost'
+__SMTP_USERNAME = os.getenv('SMTP_USERNAME') or ''
+__SMTP_PASSWORD = os.getenv('SMTP_PASSWORD') or ''
+__EMAIL_FROM = os.getenv('EMAIL_FROM')
+__EMAIL_TO = os.getenv('EMAIL_TO')
+if os.getenv('SMTP_PORT'):
+  __SMTP_PORT = int(os.getenv('SMTP_PORT'))
+else:
+  __SMTP_PORT = 587
+if os.getenv('SMTP_STARTTLS'):
+  __SMTP_STARTTLS = True
+else:
+  __SMTP_STARTTLS = False
+if os.getenv('SMTP_SSL'):
+  __SMTP_SSL = True
+else:
+  __SMTP_SSL = False
+
+# 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')
+parser.add_argument('-k', '--keywords', action='store', help='liste des termes recherchés, séparés par une virgule (par défaut : vidéoprotection,caméras,captation,aéronef)')
+parser.add_argument('--smtp-hostname', action='store', help='nom d\'hôte SMTP (par défaut : localhost)')
+parser.add_argument('--smtp-username', action='store', help='nom d\'utilisateur SMTP (par défaut : vide)')
+parser.add_argument('--smtp-password', action='store', help='mot de passe SMTP (par défaut : vide)')
+parser.add_argument('--smtp-port', action='store', help='port SMTP (par défaut : 587)')
+parser.add_argument('--smtp-starttls', action='store_true', help='connexion SMTP avec STARTTLS')
+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('-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()
+
+if args.v or os.getenv('VERBOSE'):
+  logging.basicConfig(level=logging.INFO)
+
+if args.vv or os.getenv('VVERBOSE'):
+  logging.basicConfig(level=logging.DEBUG)
+
+if args.keywords:
+  __KEYWORDS = args.keywords
+
+if args.smtp_hostname:
+  __SMTP_HOSTNAME = args.smtp_hostname
+
+if args.smtp_username:
+  __SMTP_USERNAME = args.smtp_username
+
+if args.smtp_password:
+  __SMTP_PASSWORD = args.smtp_password
+
+if args.smtp_port:
+  __SMTP_PORT = int(args.smtp_port)
+
+if args.smtp_starttls:
+  __SMTP_STARTTLS = True
+
+if args.smtp_ssl:
+  __SMTP_SSL = True
+
+if args.email_from:
+  __EMAIL_FROM = args.email_from
+
+if args.email_to:
+  __EMAIL_TO = args.email_to
+
+# On crée le dossier de téléchargement
+os.makedirs(__DATA_DIR, exist_ok=True)
+
+raa_spotter = RAAspotter_pref13(__DATA_DIR)
+raa_spotter.get_raa(__KEYWORDS)
+
+if raa_spotter.found == True and __SMTP_HOSTNAME and __SMTP_USERNAME and __SMTP_PASSWORD and __SMTP_PORT and __EMAIL_TO and __EMAIL_FROM:
+  output = open(raa_spotter.output_file_path)
+  RAAspotter.mailer(__SMTP_HOSTNAME, __SMTP_USERNAME, __SMTP_PASSWORD, __SMTP_PORT,
+                    __SMTP_STARTTLS, __SMTP_SSL, __EMAIL_FROM, __EMAIL_TO,
+                    '[RAAspotter] [pref13] Nouveaux éléments trouvés', 
+                    output.read())
-- 
GitLab