Comment corriger les problèmes de cookies via un proxy
Les cookies sont l'une des sources d'erreurs les plus fréquentes lors du travail avec un proxy. Les sessions se déconnectent, l'authentification échoue, les données sont perdues. Dans cet article, nous verrons pourquoi cela se produit et comment configurer correctement le traitement des cookies pour un fonctionnement stable.
Pourquoi les cookies sont perdus lors de l'utilisation d'un proxy
Lorsque vous envoyez une requête via un proxy, un nœud intermédiaire s'interpose entre votre client et le serveur cible. Cela crée plusieurs problèmes :
- Adresses IP différentes pour une même session. Le serveur peut remarquer que les requêtes proviennent d'adresses différentes et rejeter les cookies comme suspects.
- Perte des en-têtes Set-Cookie. Une configuration incorrecte du proxy peut ne pas transmettre les en-têtes Set-Cookie au client.
- Incompatibilité du domaine et du chemin. Si le proxy réécrit l'en-tête Host, les cookies peuvent ne pas être sauvegardés en raison d'une incompatibilité de domaine.
- Absence de sauvegarde d'état. Si vous envoyez chaque requête séparément sans sauvegarder les cookies, la session sera perdue.
Qu'est-ce qu'un cookie jar et comment l'utiliser
Un cookie jar est un stockage de cookies qui gère automatiquement leur envoi et leur réception. Au lieu d'ajouter manuellement des en-têtes Cookie à chaque requête, vous permettez à la bibliothèque de le faire automatiquement.
La plupart des clients HTTP ont un support intégré du cookie jar :
import requests
from requests.cookies import RequestsCookieJar
# Créons un jar pour stocker les cookies
jar = RequestsCookieJar()
# Première requête — le serveur enverra Set-Cookie
response1 = requests.get(
'https://example.com/login',
cookies=jar,
proxies={'https': 'http://proxy.example.com:8080'}
)
# Les cookies sont automatiquement sauvegardés dans le jar
print(jar)
# Deuxième requête — les cookies seront envoyés automatiquement
response2 = requests.get(
'https://example.com/dashboard',
cookies=jar,
proxies={'https': 'http://proxy.example.com:8080'}
)
Sans jar, il faudrait analyser manuellement Set-Cookie et les ajouter à la requête suivante — c'est peu fiable et encombrant.
Sauvegarde des cookies entre les requêtes
Si votre script fonctionne longtemps ou si vous devez restaurer une session après un redémarrage, sauvegardez les cookies dans un fichier :
import requests
from http.cookiejar import LWPCookieJar
# Créons un jar avec sauvegarde dans un fichier
jar = LWPCookieJar('cookies.txt')
# Chargeons les anciens cookies s'ils existent
try:
jar.load(ignore_discard=True, ignore_expires=True)
except FileNotFoundError:
pass
# Utilisons le jar dans les requêtes
response = requests.get(
'https://example.com/login',
cookies=jar,
proxies={'https': 'http://proxy.example.com:8080'}
)
# Sauvegardons les cookies mis à jour
jar.save(ignore_discard=True, ignore_expires=True)
Les drapeaux ignore_discard=True et ignore_expires=True permettent de sauvegarder même les cookies temporaires.
Problèmes de liaison de domaine des cookies
Les cookies ont un attribut Domain qui détermine pour quels domaines ils seront envoyés. Des problèmes surviennent si :
- Le proxy réécrit l'en-tête Host. Si le proxy change l'en-tête Host, le cookie jar peut rejeter le cookie comme appartenant à un autre domaine.
- Les sous-domaines ne correspondent pas. Un cookie pour
example.compeut ne pas être envoyé àapi.example.com. - Le chemin ne correspond pas. Un cookie pour
/apine sera pas envoyé à/admin.
Vérifiez les attributs des cookies de cette manière :
import requests
response = requests.get(
'https://example.com',
proxies={'https': 'http://proxy.example.com:8080'}
)
# Affichons tous les cookies
for cookie in response.cookies:
print(f"Name: {cookie.name}")
print(f"Value: {cookie.value}")
print(f"Domain: {cookie.domain}")
print(f"Path: {cookie.path}")
print(f"Secure: {cookie.secure}")
print(f"HttpOnly: {cookie.has_nonstandard_attr('HttpOnly')}")
print("---")
Si le Domain est trop restrictif, essayez de transmettre explicitement les cookies au lieu de la gestion automatique :
headers = {
'Cookie': 'session_id=abc123; user_token=xyz789'
}
response = requests.get(
'https://example.com/api',
headers=headers,
proxies={'https': 'http://proxy.example.com:8080'}
)
Drapeaux Secure et HttpOnly
Le drapeau Secure signifie que le cookie n'est envoyé que via HTTPS. Si vous utilisez un proxy HTTP pour accéder à une ressource HTTPS, assurez-vous que la connexion au proxy est sécurisée ou que le proxy transmet correctement HTTPS.
Le drapeau HttpOnly interdit l'accès au cookie depuis JavaScript. Cela n'affecte pas l'envoi du cookie dans les requêtes, mais il est important de se rappeler que vous ne pourrez pas lire ces cookies depuis le navigateur.
Lors du travail avec des proxies résidentiels, assurez-vous que :
- Le proxy supporte HTTPS (méthode CONNECT)
- Les certificats sont valides (n'utilisez pas
verify=Falseen production) - Les en-têtes ne sont pas réécrits par le proxy
Exemples pratiques avec code
Exemple 1 : Connexion avec sauvegarde de session
import requests
from requests.cookies import RequestsCookieJar
jar = RequestsCookieJar()
proxy = 'http://proxy.example.com:8080'
# Connexion
login_response = requests.post(
'https://example.com/login',
data={'username': 'user', 'password': 'pass'},
cookies=jar,
proxies={'https': proxy}
)
if login_response.status_code == 200:
print("Connexion réussie")
# Utilisons la session sauvegardée
dashboard = requests.get(
'https://example.com/dashboard',
cookies=jar,
proxies={'https': proxy}
)
print(dashboard.text)
Exemple 2 : Traitement de plusieurs requêtes
import requests
from http.cookiejar import LWPCookieJar
import time
jar = LWPCookieJar('session.txt')
try:
jar.load(ignore_discard=True)
except:
pass
proxy = 'http://proxy.example.com:8080'
urls = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3'
]
for url in urls:
response = requests.get(
url,
cookies=jar,
proxies={'https': proxy},
timeout=10
)
print(f"{url}: {response.status_code}")
jar.save(ignore_discard=True)
time.sleep(1) # Ne surchargez pas le serveur
Exemple 3 : Transmission explicite des cookies en cas de problèmes
import requests
proxy = 'http://proxy.example.com:8080'
# Si la gestion automatique ne fonctionne pas
cookies_dict = {
'session_id': 'abc123def456',
'user_pref': 'dark_mode'
}
headers = {
'User-Agent': 'Mozilla/5.0...',
'Cookie': '; '.join([f"{k}={v}" for k, v in cookies_dict.items()])
}
response = requests.get(
'https://example.com/api/data',
headers=headers,
proxies={'https': proxy}
)
print(response.json())
Débogage des problèmes de cookies
Si les cookies ne fonctionnent pas, utilisez ces outils :
| Outil | Objectif |
|---|---|
requests.Session |
Gère automatiquement les cookies pour toutes les requêtes de la session |
logging |
Activez DEBUG pour requests pour voir tous les en-têtes |
Fiddler / Charles |
Interceptez le trafic et consultez les en-têtes Set-Cookie et Cookie |
curl -v |
Testez la même chose via un proxy depuis la ligne de commande |
Activez la journalisation pour le débogage :
import logging
import requests
logging.basicConfig(level=logging.DEBUG)
# Maintenant toutes les requêtes afficheront les en-têtes et les cookies
response = requests.get(
'https://example.com',
proxies={'https': 'http://proxy.example.com:8080'}
)
Vérifiez que le proxy ne bloque pas les cookies :
curl -v -x http://proxy.example.com:8080 https://example.com
# Regardez les en-têtes :
# Set-Cookie: ... (doivent être présents)
# Cookie: ... (doivent être envoyés dans la requête suivante)
Conseil : Si vous utilisez des proxies résidentiels, rappelez-vous qu'ils peuvent faire tourner les IP entre les requêtes. Assurez-vous que votre logique de traitement des cookies en tient compte — certains serveurs rejettent les requêtes provenant d'adresses IP différentes dans une même session.
Résumé
Les problèmes de cookies lors du travail via un proxy sont résolus par une configuration appropriée :
- Utilisez un cookie jar pour la gestion automatique des cookies
- Sauvegardez les cookies entre les requêtes dans un fichier
- Vérifiez la liaison de domaine et les attributs Path
- Assurez-vous du support HTTPS du proxy
- Utilisez le débogage pour identifier les problèmes
Pour les tâches d'automatisation et de scraping où un fonctionnement fiable des sessions via un proxy est nécessaire, les proxies résidentiels avec support HTTPS et gestion des cookies conviennent bien. Commencez par un simple cookie jar et passez à des schémas plus complexes uniquement si nécessaire.