samyun / southwest-price-drop-bot

Les versions déployées avant le 30/06/2019 (< 3.4.0) pourraient vouloir faire un déploiement propre – nous passons de Redis à MongoDB, et cela ne se traduit pas, proprement. Ceci est capable de fonctionner localement pendant le développement de manière assez cohérente.

Southwest Price Drop Bot

Cet outil vous permet de surveiller le prix des vols Southwest que vous avez réservés. Il vous prévient si le prix chute en dessous de ce que vous avez payé initialement. Vous pourrez alors réserver à nouveau le même vol et obtenir un crédit Southwest pour la différence de prix. Cet outil vous permet également de surveiller le prix de tous les vols Southwest pour un jour donné. Il vous notifiera si l’un des vols de ce jour tombe en dessous du précédent vol le moins cher.

Notez que vous devez disposer d’un compte Plivo pour envoyer les notifications par SMS et d’un compte Mailgun pour envoyer les notifications par e-mail. Vous pouvez exécuter cet outil sans ces comptes, mais vous n’obtiendrez pas les notifications.

Vous pouvez vous connecter avec l’un ou l’autre :

La deuxième option est intéressante lorsque vous donnez l’accès à vos amis et à votre famille, car elle n’affichera que les alertes pour le nom d’utilisateur donné. Notez que le mot de passe est le même pour tous les comptes et que l’administrateur peut voir toutes les alertes.

Lorsque vous créez des alertes, notez que l’email et les numéros de téléphone sont facultatifs. Si ceux-ci sont tous deux laissés vides, l’utilisateur devra se connecter manuellement pour voir les baisses de prix.

Déploiement

  1. Cliquez sur ce bouton :
  2. Remplir les variables de configuration et cliquer sur Deploy
  3. Ouvrir la Heroku Scheduler depuis le tableau de bord de votre application
  4. Ajouter une tâche horaire qui exécute npm run task:check

Lorsque les mises à jour seront disponibles, vous devrez les déployer vous-même à l’aide de la CLI de Heroku. Cette application suit SemVer dans son versioning, donc assurez-vous de lire les notes de version lorsque vous déployez un changement de version majeur.

Note : Les versions déployées avant le 4/9/2018 en utilisant Mailgun devront vérifier les constantes : MAILGUN_DOMAIN et MAILGUN_EMAIL.

Note : Les versions déployées avant le 21/07/2018 (< 3.2.0) sur Heroku devront vérifier la PROXY constante si vous souhaitez utiliser un proxy pour effectuer les appels.

Captures d’écran

Protection des robots par Southwest

En ce moment, Southwest bloque avec succès les requêtes provenant de ce projet.

Southwest a mis en place des protections bot très fantaisistes.

  • Les IP d’Heroku, et d’autres fournisseurs d’hébergement, sont bloquées pour accéder à leur site. Les déploiements locaux devraient être autorisés à accéder à leur site, et certains autres fournisseurs de cloud peuvent également fonctionner. La solution de contournement la plus fiable consiste à utiliser un service proxy résidentiel.
  • Il y a aussi du Javascript délicat et obfusqué qui détecte les navigateurs sans tête et qui est mis à jour très fréquemment. Il y a une communauté de gens qui mettent en œuvre des évasions de détection de chrome sans tête, mais c’est un jeu de chat et de souris.
    • https//github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth/
  • Utiliser CHROME_DEBUG=true DEBUG="puppeteer:*" combiné avec node inspect pour déboguer les problèmes étranges de chrome.
    • L’interception des requêtes enregistrera toutes les tentatives de chargement d’URL et acceptera toutes les requêtes.
    • slowmo est activé et headless est désactivé
    • sera ouvert avant une URL du sud-ouest

Informations sur le proxy

Les instructions sur le déploiement d’un proxy sortent du cadre de ce projet. Cependant, voici quelques informations sur les proxys qui pourraient être utiles :

  • Un proxy hébergé (bon marché) qui fonctionne est https://luminati.io. Il est à moins d’un dollar par mois et semble fiable. La plupart des proxys publics ne semblent pas fonctionner, j’imagine qu’il existe une sorte de liste de blocage de proxy public en place.
  • Vous pourriez utiliser quelque chose comme Squid et le faire tourner en natif, dans un conteneur ou dans une VM. Évidemment, vous voudrez faire cela en dehors de Heroku
  • Si vous utilisez Squid, vous voudrez configurer la redirection de port ou l’exécution sur un port aléatoire élevé, et le verrouillage de squid.conf avec quelque chose comme ceci pour empêcher quelqu’un d’utiliser votre configuration comme un proxy ouvert :
acl swa dstdomain .southwest.comhttp_access allow swahttp_access deny all

Développement

Pour exécuter la suite de tests :

yarn test

Pour exécuter une console chargée d’objets Alert et Flight :

yarn console

Lorsqu’on débogue des problèmes de chrome/puppeteer, il est utile d’utiliser la commande suivante :

DEBUG="puppeteer:*" CHROME_DEBUG=true node tasks/check.js

Ceci enverra une sortie de débogage utile de chrome dans votre console, et activera certains débogages supplémentaires pour aider à déboguer ce qui pourrait ne pas fonctionner.

Historique des versions

– 2019-08-11

  • Mise à jour des dépendances, notamment yarn.lock
  • Mise à jour vers Node v12

– 2019-06-30

  • Modification de Redis vers MongoDB
  • Mise à jour de la logique de scraping
  • Amélioration du support des proxy
  • Ajout de quelques mesures de détection anti-bot
  • Merci à @iloveitaly pour ces changements !

– 2018-12-25

  • Ajout du support pour les vols primes (points)
  • Mise à jour des dépendances aux dernières versions

– 2018-7-23

  • Fusionner le PR de @GC-.Guy pour corriger le support du proxy dans les vérifications

– 2018-7-21

  • Merge PR from @GC-Guy to add support for a proxy

– 2018-7-14

  • Mise à jour du paquet.json
  • Fusionner le PR de @evliu pour cibler les éléments de la liste de prix de manière plus dynamique

– 2018-6-14

  • Données de vol chargées après le chargement de la page – ajout de l’attente pour .flight-stops selector
  • Changer l’URL au format actuel
  • Corriger le test pour gérer le cas d’aucun prix trouvé
  • Ajouter des tests pour les mauvaises entrées attendues

– 2018-5-24

  • Ajouter un test unitaire pour les alertes
  • Ajouter une journalisation et un traitement des erreurs supplémentaires
  • Tenter de réduire l’utilisation de la mémoire en appelant manuellement about :blank avant de fermer la page
  • Ajout d’un protocole au lien d’email

– 2018-5-4

  • Réparation d’un bug avec un crash lorsque l’email ou le numéro de téléphone n’est pas défini mais que le service respectif est activé
  • Ajout d’un sémaphore pour limiter le nombre de pages ouvertes à la fois – en espérant corriger l’erreur « Error : Page crashed ». Limité à 5 pages. Par défaut, 5 pages à la fois – définir ENV.MAX_PAGES pour changer.

– 2018-4-29

  • Ajouter des vérifications pour l’erreur invalide
  • Ajouter des barres de notification pour les paramètres invalides

– 2018-4-28

  • Éviter de multiples instances de navigateur pendant la tâche :check – réduire l’utilisation de la mémoire
  • Ajouter un buildpack nodejs pour le déploiement Heroku

– 2018-4-28

  • Refactor pour supporter la refonte du site Southwest mis à jour, remplacer osmosis par puppeteer

– 2018-4-14

  • Ajouter le support pour vérifier le vol le moins cher sur une journée

– 2018-4-9

  • Intégrer les changements amont de PetroccoCo (gestion des emails) et pmschartz (refonte)

– 2017-.12-2

  • Support de Mailgun et Plivo (email et sms)

– 2017-11-30

  • Support de Mailgun
  • Travaux antérieurs

Attribution

Ceci est un fork du fork de minamhere du fork de maverick915 du projet original de scott113341.

Des modifications en aval ont été intégrées à partir de :

  • PétroccoCo – Traitement des emails
  • pmschartz – Redesign

Merciements aux personnes suivantes pour leurs contributions :

  • @evliu – cibler les éléments de la liste de prix de manière plus dynamique
  • @GC-Guy – support proxy
  • @iloveitaly – MongoDB, mise à jour du support scraping/proxy, détection anti-bot
  • @ribordy – correction lodash

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *