Lire des cookies avec Python
Il peut parfois être utile d'accéder aux cookies de Firefox depuis un script python. Voici comment faire.
Contexte
J'ai récemment travaillé sur un petit projet perso en python. L'application devait se connecter à la base de donnée d'un site internet (via son API), et contrôler l'intégrité de certaines données. Rien de bien extraordinaire, si ce n'est que le site en question n'avait pas d'API publique, j'ai donc utilisé l'API normalement utilisée par l'application React du site.
Pour ce faire, j'ai du
contourner le mécanisme d'authentification du site. En effet, celui-ci
était un peut trop mal fait complexe pour être géré facilement
avec la bibliothèque
requests. Une solution
serait d'utiliser Selenium
ou Weboob. Mais ces solutions présentent
plusieurs inconvénients. Notamment leur complexité, et leur faible
robustesse aux changements dans l'interface du site.
Je me suis donc mis d'accords avec les utilisateurs de mon application pour qu'ils ouvrent Firefox et se connectent au site web avant de lancer le programme. Mon programme peut ensuite utiliser le cookie de session pour contacter l'API.
Lire les cookies de Firefox ou Chrome
Firefox et Chrome stockent leurs cookies dans une base de donnée SQLite. Il s'agit d'un fichier déposé dans le dossier de l'utilisateur. Il serait tout à fait possible d'aller lire directement les cookies dans le fichier SQLite. Personnellement, j'apprécie la bibliothèque peewee pour accéder aux bases de données (dont SQLite).
Mais un problème se pose : l'emplacement du fichier SQLite varie en fonction du navigateur utilisé (Firefox ou Chrome), ainsi que du système d'exploitation utilisé (GNU/Linux, MacOS ou Windows). Il faut alors prévoir tous les cas. Ou alors utiliser une bibliothèque qui gère cela pour nous. C'est là qu'intervient browser-cookie3. Cette bibliothèque propose une API très simple pour accéder aux cookies :
import browser_cookie3
import requests
cookie_jar = browser_cookie3.firefox()
r = requests.get('https://mysite.fr',
cookies=cookie_jar)
Comme le montre cet exemple, browser-cookie3 permet d'obtenir, à
partir des cookies de Firefox, un objet cookiejar qui peut être fourni
directement à requests
. Il est aussi possible d'appeler
browser_cookie3.chrome()
pour récupérer les cookies de Chrome. Ou
encore browser_cookie3.load()
pour récupérer les cookies des deux
navigateurs. Enfin, ces fonctions acceptent le paramètre optionnel
cookie_file
, pour spécifier l'emplacement du cookie s'il n'est pas à
un emplacement standard (par exemple si vous avez récupéré le fichier
sur une autre machine).