Julien Osman

Ingénieur développement logiciels. Docteur en télédétection.

Lire des cookies avec Python


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).