En 2019, j'ai travaillé sur un assistant de shopping pour la high-tech appelé Kalico, dont le but était d'être toujours à jour sur les nouvelles sorties téléphones, mais aussi l'évolution de leur prix.

En essayant de récupérer les prix grâce à un crawler sur les pages des sites e-commerce, je me suis vite heurté à un problème que je n'avais encore jamais rencontré. Certains sites tentaient de détecter la localisation géographique de mon "faux" client afin de lui indiquer si le produit pouvait être livré dans sa zone.

Problème, mon api tournait sur un serveur Heroku, localisé en France, et lorsque j’essayai de crawler les liens des boutiques UK et US, les produits étaient toujours indisponibles à l'envoi (logique) et refusait donc d'afficher le prix local.

Ma solution fût donc de monter trois machines Amazon localisées en France, au Royaume-Uni et aux Etats-Unis afin d'y faire tourner de simples proxies pour déjouer la localisation des plateformes.

Après avoir testé plusieurs librairies Javascript, tournant sous NodeJS (dans le but de garder une infrastructure homogène), j'ai découvert la solution complète, open-source et très facilement déployable : Anyproxy.

Anyproxy

Anyproxy est (comme son nom l'indique) un proxy, entièrement configurable, développé et maintenu par le géant du e-commerce chinois : Alibaba.

L'installation se faire directement depuis npm et le démarrage du logiciel ne nécessite qu'une seule ligne de commande:

$ npm install -g anyproxy
$ anyproxy
Note : AnyProxy est configuré pour écouter par défaut sur le port 8001 (proxy) et 8002 (interface),  pensez à vérifier que vos port sont ouverts si vous êtes sur un serveur distant

Une fois lancé, vous pouvez accéder à l'interface web sur votre http://localhost:8002 et commencer à faire passer des requêtes au travers de votre proxy !

Les spécificités d'AnyProxy

AnyProxy est très configurable, notamment pour :

  • La prise en charge de certificat SSL et des requêtes https
  • L'ajout de règles de routage spécifiques à l'aide d'un simple fichier .js
  • Être lancé à l'intérieur d'une application, comme un module NodeJS classique

Pour apprendre à configurer votre proxy, je vous renvoie vers la documentation officielle : http://anyproxy.io/en/

A noter que j'ai vu quelques morceaux de textes encore écrits en Chinois mais jamais dans la doc technique.

Sécurité

Si vous laissez l'accès distant à votre proxy, je vous conseille fortement de ne pas ouvrir le port de l'interface web en production car il n'y a pas d'authentification.

Mais surtout, pensez à ne jamais laisser tourner un proxy ouvert sans filtre, je vous ai expliqué les possibles conséquences dans mon article "Le jour où Amazon m'a mis la pression...", la solution la plus simple est d'ajouter une règle d'authentification comme ci-dessous :


//rule.js
module.exports = {
  // introduction
  summary: 'Authentication',
  // intercept before send request to server
  beforeSendRequest(requestDetails) {
    console.log(requestDetails.requestOptions.headers);
    if(requestDetails.requestOptions.headers.authorization !== 'Basic test:token'){
      return {
        response: {
          statusCode: 401,
          header: { 'content-type': 'text/html' },
          body: 'You are not authorized to use this proxy'
        }
      };
    }
    return {};
  }
};

Pour activer cette règle, il ne vous reste plus qu'à relancer AnyProxy avec un paramètre --rule comme ci-dessous !

$ anyproxy --rule ./rule.js
J'espère que cet article vous aura plu, et moi je vous dis à bientôt sur le blog !

À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage de d'expériences et de connaissances.

Aujourd'hui je suis aussi coach pour développeurs web juniors, tu peux me contacter sur nicolas@brondin.com, sur mon site ou devenir membre de ma newsletter pour ne jamais louper le meilleur article de la semaine et être tenu au courant de mes projets !


Photo par Max Gotts sur Unsplash