Se connecter à un proxy résidentiel est une tâche de cinq minutes qui prend régulièrement un après-midi, généralement parce que la documentation d’un fournisseur suppose les conventions d’un autre. Il n’y a que quatre éléments mobiles : un host, un port, un username et un password. Ce qui varie entre fournisseurs, c’est la quantité de sens intégrée dans le username, et sur une gateway comme celle-ci, c’est là que se joue presque tout.
Voici le format, ce que fait chaque élément, et comment lire les erreurs quand quelque chose ne va pas.
Les quatre éléments
| Élément | Valeur |
|---|---|
| Host | p.shifter.io |
| Port | 443 |
| Username | customer-USERNAME plus des indicateurs de ciblage optionnels |
| Password | depuis le panel |
Le host et le port ne changent jamais. Pas pour un pays différent, pas pour une session sticky, pas pour SOCKS5 au lieu de HTTP. Chaque requête va vers le même endpoint, et ce que vous voulez est exprimé dans le username. C’est la chose la plus importante à comprendre, car c’est ce qui diffère le plus des anciens produits basés sur des ports, où chaque configuration correspondait à une adresse différente.
HTTP(S) et SOCKS5 s’adressent tous deux au même host et au même port. Vos identifiants se trouvent dans le panel sous Residential Proxies.
La requête la plus simple possible
Commencez ici et confirmez que cela fonctionne avant d’ajouter quoi que ce soit :
curl -x customer-USERNAME:PASSWORD@p.shifter.io:443 https://ipinfo.io/json
Cela renvoie un JSON décrivant l’adresse de sortie qui vous a été attribuée. Exécutez-le deux fois et vous devriez voir deux adresses différentes, car la rotation est activée par défaut. Si cela fonctionne, vos identifiants sont corrects et tout le reste n’est que configuration.
Ajouter du ciblage au username
Les indicateurs sont ajoutés au username avec des tirets. L’ordre n’a pas d’importance, les valeurs sont en minuscules, et les valeurs à plusieurs mots utilisent des underscores.
customer-USERNAME # rotation, pas de géo
customer-USERNAME-country-de # sortie allemande
customer-USERNAME-country-us-city-new_york # niveau ville
customer-USERNAME-country-us-asn-7922 # réseau spécifique
customer-USERNAME-sid-abc123 # session sticky
customer-USERNAME-sid-abc123-ttl-600 # sticky pendant 10 minutes
customer-USERNAME-country-gb-sid-abc123-ttl-600 # combiné
Les codes pays sont au format ISO 3166-1 alpha-2, ainsi le Royaume-Uni est gb plutôt que uk, ce qui est la faute de frappe la plus courante. sid est une chaîne de caractères que vous choisissez et conserve la même adresse de sortie pour les requêtes suivantes ; ttl définit la durée en secondes et n’est valide qu’avec sid, avec une valeur par défaut de 120. La référence complète se trouve dans la documentation de géociblage et la documentation des sessions, et la différence conceptuelle est expliquée dans sticky versus rotating.
Un élément utile en plus : par défaut, si rien ne correspond à un filtre très étroit à ce moment-là, la gateway se rabat sur un pool plus large pour que votre requête aboutisse quand même. Ajoutez strict-true lorsqu’une correspondance géographique exacte compte plus que la réussite de la requête, et vous obtiendrez un 502 au lieu d’un repli silencieux.
Les deux formats que vous rencontrerez
Les identifiants de proxy s’écrivent de deux manières, et la conversion entre les deux fait souvent trébucher.
Format URL, utilisé par la plupart des bibliothèques et par curl :
http://customer-USERNAME-country-de:PASSWORD@p.shifter.io:443
Format séparé par des deux-points, utilisé par de nombreux outils de bureau et extensions de navigateur, qui demandent généralement les éléments dans des champs séparés :
p.shifter.io:443:customer-USERNAME-country-de:PASSWORD
Ils portent une information identique. Si un outil demande quatre champs, utilisez la seconde disposition ; s’il demande une seule chaîne, utilisez la première.
En code
import requests
USER = "customer-USERNAME-country-de"
PROXY = f"http://{USER}:PASSWORD@p.shifter.io:443"
r = requests.get("https://ipinfo.io/json",
proxies={"http": PROXY, "https": PROXY}, timeout=20)
print(r.json())
Définissez à la fois les entrées http et https. N’en définir qu’une seule est une cause fréquente de “ça marche pour certaines requêtes et pas pour d’autres”, car les requêtes en clair et sécurisées empruntent des chemins différents.
Si votre password contient des caractères significatifs dans une URL, comme @, :, / ou #, encodez-le en pourcentage avant de l’intégrer, sinon l’URL est mal interprétée et vous obtenez une erreur d’authentification avec des identifiants pourtant tout à fait corrects.
Pour SOCKS5, gardez le même host, port et identifiants, et changez le schéma. Utilisez la variante qui résout les noms d’hôte au niveau du proxy plutôt que localement, car l’autre fait fuiter votre DNS et peut renvoyer des résultats géographiquement erronés, ce qui est traité dans prévenir les fuites DNS.
Des configurations fonctionnelles pour d’autres stacks se trouvent dans la documentation des intégrations et, pour Python en particulier, dans utiliser des proxies résidentiels avec Python.
Lire les erreurs
Quatre réponses couvrent presque tous les problèmes de configuration, et chacune pointe vers un endroit différent.
407 Proxy Authentication Required signifie que la gateway a rejeté vos identifiants. Soit ils sont incorrects, soit un indicateur dans votre username est mal formé, car une valeur non reconnue rend l’ensemble du username impossible à analyser. Retirez tous les indicateurs et testez d’abord le username nu : si cela fonctionne, le problème vient des indicateurs, et vous pouvez les rajouter un par un pour trouver lequel pose problème. Le parcours de diagnostic complet se trouve dans résoudre les erreurs 407 et d’identifiants.
502 Bad Gateway signifie que vos identifiants étaient corrects mais que rien ne correspondait à votre filtre à ce moment-là. Élargissez-le, passez du niveau ville au niveau pays, ou retirez strict-true.
509 Bandwidth Limit Exceeded signifie que l’allocation du plan est épuisée avec le dépassement désactivé. Rien ne cloche avec la connexion.
Connexion refusée ou timeout signifie que vous n’avez jamais atteint la gateway. Vérifiez que vous pointez bien vers p.shifter.io:443 plutôt que vers un ancien host basé sur un port, et testez la connectivité brute avec nc -vz p.shifter.io 443 avant de conclure à un problème de proxy.
Vérifier que cela fonctionne réellement
Deux vérifications valent la peine d’être effectuées une fois au départ.
Confirmer la rotation : envoyez la même requête plusieurs fois sans sid et vérifiez que l’adresse change. Si ce n’est pas le cas, la cause habituelle est que votre client HTTP réutilise une connexion plutôt qu’un échec de rotation du proxy, ce qui est traité dans IP qui ne tourne pas.
Confirmer la géographie : demandez un pays et vérifiez que l’adresse renvoyée se géolocalise bien là-bas, et plus significativement qu’une cible sensible à la géolocalisation se comporte comme si vous y étiez. La méthode plus complète se trouve dans tester la vitesse, le taux de réussite et la précision de localisation.
En résumé
Un host, un port, tout le reste dans le username. Faites d’abord fonctionner une requête nue, puis ajoutez les indicateurs de ciblage un par un, et souvenez-vous que les codes pays sont au format ISO, donc le Royaume-Uni est gb. Définissez à la fois les entrées de proxy HTTP et HTTPS, encodez en pourcentage un password contenant des caractères spéciaux, et utilisez la variante SOCKS5 qui résout à distance si vous empruntez cette voie. Quand quelque chose échoue, le code de statut vous indique où regarder : 407 signifie des identifiants ou un indicateur mal formé, 502 signifie un filtre sans rien derrière, 509 signifie la bande passante, et connexion refusée signifie que vous ne parlez pas du tout à la gateway.
Cette gateway est la porte d’entrée vers les proxies résidentiels, où le pays, la ville, l’ASN et la session sont tous des paramètres de la même connexion, facturée par GB de sorte que rien dans votre configuration ne change ce que vous payez. Si tout cela est nouveau pour vous, commencez par les proxies résidentiels pour débutants.