Merge branch 'cookie-fetch' into 'master'

Simplification de la manipulation des cookies

See merge request sdjgeek/purge-registres-deces-insee!2
This commit is contained in:
Sdj Geek 2020-06-16 23:36:01 +02:00
commit 9d216600f8
6 changed files with 79 additions and 62 deletions

View File

@ -1,5 +1,9 @@
# Changelog
### [v4.0] - 2020-06-16
- Recherche automatique des cookies dans firefox
- Supression du fichier settings.py, remplacé par argparse
### [v3.1] - 2020-06-08
- Amélioration de la documentation

View File

@ -34,7 +34,7 @@ exemple) pour s'assurer que les registres restent à jour.
### Logiciels
- Git
- Python 3.6
- Python 3.6+
- Virtualenv
Testé uniquement sur GNU/Linux (Ubuntu 18.4)
@ -65,45 +65,43 @@ pip install -r requirements.txt
## Utilisation
Le fichier ```purge-registres-deces-insee/settings.py``` contient les
paramètres à configurer :
Aller sur le [site de l'Église](https://lcr.churchofjesuschrist.org),
et se connecter au compte SDJ. Puis lancer le script.
```bash
source localenv/bin/activate
python purge-registres-deces-insee/trouver_deces.py chemin_base_donnees chemin_repertoire_sortie numeros_unites
```
Avec :
- chemin_base_donnees : Le chemin vers le [fichier
téléchargé](https://git.roflcopter.fr/sdjgeek/purge-registres-deces-insee/-/wikis/home#t%C3%A9l%C3%A9charger-la-base-de-donn%C3%A9e)
- chemin_repertoire_sortie : Le chemin vers le répertoire qui
contiendra la fichiers de sortie
- numeros_unites : La liste des unités que le programme doit
tester. La liste commence par le caractère '['. Les numéros d'unités
sont séparés par des virgules. La liste se termine par le caractère
']'. Par exemple [47823, 67745, 31456]
- cookie : Les cookies de la session au compte SDJ. Pour obtenir ces
cookies il faut :
Le script devrait trouver seul le cookie de session permettant de
consulter la liste des membres. Mais en cas d'échec, il est possible
de lui donner le chemin vers le fichier SQLite que Firefox utilise
pour stocker les cookies avec l'option '-c'. En règle générale ce
fichier se trouve le répertoire :
1- Ouvrir Firefox
- sur linux :
"~/.mozilla/firefox/<un_code_étrange>.default/cookies.sqlite"
2- Ouvrir les outils de développement : CTRL + MAJ + E
- sur windows :
"C:\Users\<nom_utilisateur>\AppData\Local\Mozilla\Firefox\Profiles\<un_code_étrange>.default\cookies.sqlite"
3- Aller sur le site des outils pour greffiers : https://lds.org/lcr
4- Entrer identifiant et mot de passe SDJ
5- Aller dans la liste des membres
6- Dans l'outil de développement, cliquer sur la dernière ligne
7- Dans le panneau de droite, dans la section "En-tête de la requête",
rechercher le champ "cookie"
8- Copier la valeur contenue dans ce champ
- chemin_repertoire_sortie : Le chemin vers le répertoire qui
contiendra la fichiers de sortie
Une fois la configuration effectuée, lancer le script :
Par exemple :
```bash
. localenv/bin/activate
python purge-registres-deces-insee/trouver_deces.py
python purge-registres-deces-insee/trouver_deces.py ~/Documents/fichier-des-personnes-decedees.sqlite ~/Documents/ 123,854 -c ~/.mozilla/firefox/8h3jsedf.default/cookies.sqlite
```
Le script mettra un peu de temps à s'exécuter. En fin d'exécution, le

View File

@ -25,7 +25,7 @@ chemin_base_donnees = "/chemin/vers/fichier-des-personnes-decedees.sqlite"
numeros_unites = [47823, 67745, 31456]
# Cookie de session compte SDJ
cookie = ""
cookie = "/home/julien/.mozilla/firefox/615tua7r.lds/cookies.sqlite"
# Chemin vers le répertoire de sortie
chemin_repertoire_sortie = "/chemin/vers/repertoire-de-sortie"

View File

@ -3,36 +3,43 @@
"""
import requests
import browser_cookie3
def get_member_list(unit_number, cookie):
"""Recevoir la liste des membres
class SiteEglise:
:param unit_number: numéro de l'unité (paroisse, branche)
:param cookie: le cookie de session pour l'accès au site
:returns: la liste des membres sous forme d'objet JSON
def __init__(self, cookie_path=None):
"""
"""
r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list',
params={'lang': "fra", 'unitNumber': unit_number},
headers={'Accept': "application/json",
'Cookie': cookie})
r.raise_for_status()
return r.json()
:param cookie_path: chemin vers le répertoire inscrire les fichiers de sortie
"""
self.cookie_jar = browser_cookie3.firefox(cookie_file=cookie_path)
def get_member_list(self, unit_number):
"""Recevoir la liste des membres
def get_member_profile(member_id, cookie):
"""Recevoir les informations sur un membre
:param unit_number: numéro de l'unité (paroisse, branche)
:returns: la liste des membres sous forme d'objet JSON
:param member_id: ID du membre
:param cookie: le cookie de session pour l'accès au site
:returns: les informations sur le membre sous forme d'objet JSON
"""
r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list',
params={'lang': "fra", 'unitNumber': unit_number},
headers={'Accept': "application/json"},
cookies=self.cookie_jar)
r.raise_for_status()
return r.json()
"""
r = requests.get(f'https://lcr.churchofjesuschrist.org/records/member-profile/service/{member_id}',
params={'lang': "fra"},
headers={'Accept': "application/json",
'Cookie': cookie,
'Referer': f"https://lcr.churchofjesuschrist.org/records/member-profile/{member_id}?lang=fra"})
r.raise_for_status()
return r.json()
def get_member_profile(self, member_id):
"""Recevoir les informations sur un membre
:param member_id: ID du membre
:returns: les informations sur le membre sous forme d'objet JSON
"""
r = requests.get(f'https://lcr.churchofjesuschrist.org/records/member-profile/service/{member_id}',
params={'lang': "fra"},
headers={'Accept': "application/json",
'Referer': f"https://lcr.churchofjesuschrist.org/records/member-profile/{member_id}?lang=fra"},
cookies=self.cookie_jar)
r.raise_for_status()
return r.json()

View File

@ -33,35 +33,36 @@ Comment utilise ce programme :
------------------------------------------------------------------------------------------------------------------------
Auteur : SDJ GeeK <sdjgeek@protonmail.com>
Date : 1 juin 2020
Version : 3.0
Date : 16 juin 2020
Version : 4.0
"""
import argparse
import os
import peewee
import requests
from bdd_insee import BddInsee
import site_eglise
import settings as param
from site_eglise import SiteEglise
def trouver_decedes(chemin_base_donnees, numeros_unites, cookie, chemin_repertoire_sortie):
def trouver_decedes(chemin_base_donnees, numeros_unites, chemin_repertoire_sortie, cookie_path=None):
"""Recherche les personnes décédées dans les registres
:param chemin_base_donnees: chemin vers le fichier SQLite
:param numeros_unites: liste des numéros d'unités à analyser
:param cookie: le cookie de session pour l'accès au site
:param chemin_repertoire_sortie: chemin vers le répertoire inscrire les fichiers de sortie
:param cookie_path: chemin vers la base de donnée des cookies
"""
base_insee = BddInsee(chemin_base_donnees)
site_eglise = SiteEglise(cookie_path)
# Boucler sur la liste des unités
for unite in numeros_unites:
print(f"Unité {unite}")
# Récupérer la liste des membres
members = site_eglise.get_member_list(unite, cookie=cookie)
members = site_eglise.get_member_list(unite)
# Préparer le fichier de sortie
output_file = os.path.join(chemin_repertoire_sortie, f"liste_membres_decedes_unite_{unite}.txt")
@ -76,7 +77,7 @@ def trouver_decedes(chemin_base_donnees, numeros_unites, cookie, chemin_repertoi
ville_registre = None
# S'il s'agit d'une femme mariée, trouver son nom de jeune fille
if member['isSpouse']:
member_profile = site_eglise.get_member_profile(member['legacyCmisId'], cookie=cookie)
member_profile = site_eglise.get_member_profile(member['legacyCmisId'])
maiden_name = member_profile['individual']['maidenNameGroup']['name1']['family']
ville_registre = member_profile['individual']['birthPlace']
try:
@ -97,7 +98,7 @@ def trouver_decedes(chemin_base_donnees, numeros_unites, cookie, chemin_repertoi
feminin = ""
for person in query:
if not ville_registre:
member_profile = site_eglise.get_member_profile(member['legacyCmisId'], cookie=cookie)
member_profile = site_eglise.get_member_profile(member['legacyCmisId'])
ville_registre = member_profile['individual']['birthPlace']
if not ville_registre:
ville_registre = "<VIDE>"
@ -114,4 +115,10 @@ décédé{feminin} le {person.jour_deces:0>2}/{person.mois_deces:0>2}/{person.an
if __name__ == "__main__":
trouver_decedes(param.chemin_base_donnees, param.numeros_unites, param.cookie, param.chemin_repertoire_sortie)
parser = argparse.ArgumentParser(description='Recherche des personnes décédées dans les registres.')
parser.add_argument('chemin_base_donnees', type=str, help="chemin vers la base de données")
parser.add_argument('chemin_repertoire_sortie', type=str, help="chemin vers le répertoire de sortie")
parser.add_argument('numeros_unites', type=str, help="numéros des l'unités à traiter, séparés par des virgules (ex: 123,753,469)")
parser.add_argument('--cookie', '-c', type=str, help='chemin vers la base de donnée des cookies de Firefox')
args = parser.parse_args()
trouver_decedes(args.chemin_base_donnees, args.numeros_unites.split(','), args.chemin_repertoire_sortie, args.cookie)

View File

@ -1,2 +1,3 @@
peewee
requests
browser_cookie3