Dépanner le code PhantomJS pour vous connecter à Instagram

J'ai écrit ce script PhantomJS pour automatiser la connexion à Instagram. Il peut remplir avec succès les champs de formulaire et appuyer sur le bouton de soumission, mais il est toujours redirigé vers l'écran d'ouverture de session avec le message suivant:

Votre nom d'utilisateur ou mot de passe était incorrect.

Je suis 100% positif que les informations d'identification sont correctes, et je l'ai essayé avec plusieurs comptes Instagram.

Je gère le script sur un Mac depuis le terminal:

$ phantomjs --ssl-protocol=any --cookies-file=cookies.txt script.js username password 

Notez le --ssl-protocol=any option. Sans elle, PhantomJS ne peut même pas ouvrir la page de connexion à cause de HTTPS. Voir cette question .

Voici le code. Je l'ai basé sur ce tutoriel et mis à jour le code pour tenir compte des modifications récentes du code source de la page de connexion d'Instagram.

 var system = require('system'); var username = system.args[1]; var password = system.args[2]; var page = require('webpage').create(); page.open('https://instagram.com/accounts/login/', function (status) { if (status === "success") { page.evaluate(function (uid, pwd) { var username_field = document.getElementById('lfFieldInputUsername'); username_field.value = uid; var password_field = document.getElementById('lfFieldInputPassword'); password_field.value = pwd; }, username, password); var point = page.evaluate(function () { var element = document.getElementsByTagName('button')[0]; var rect = element.getBoundingClientRect(); return { x: rect.left + Math.floor(rect.width / 2), y: rect.top + Math.floor(rect.height / 2) }; }); page.render('before-submit.png'); page.sendEvent('click', point.x, point.y); } setTimeout(function () { var error = page.evaluate(function () { var element = document.getElementById('errorAlert'); var error_message = false; if (element !== null) { error_message = element.innerText.trim(); } return error_message; }); page.render('after-submit.png'); if (!error) { console.log('Login Successful: ' + page.url); } else { console.log('Login Failed: ' + error); } phantom.exit(0); }, 5000); } ); 

Et voici ce que j'ai essayé jusqu'à présent:

  1. Définir des cookies. En plus d'ajouter l'option de ligne de commande --cookies-file=cookies.txt , j'ai également essayé phantom.addCookie dans le code. Je ne semblais pas faire de différence.
  2. Explicitement envoi des en-têtes auth. Voir cette question .
  3. Modification du fuseau horaire. Je ne sais pas si cela a du sens. Voir cette question .

Apparemment, PhantomJS a des problèmes avec SSL. Devrais-je renoncer à l'utiliser à cette fin?

Je pense que le problème avec la connexion Instagram est ReactJs. Lorsque vous définissez la valeur du champ de texte, React ne change pas d'état. Cela signifie que l'envoi de connexion et de mot de passe est vide lorsque vous soumettez un formulaire.

Je n'ai pas essayé, mais je pense que vous devez remplir les entrées de texte avec l'événement de la pression de touche, car l'état du composant interne (React) ne change que lorsque les entrées changent de texte. La valeur de réglage en vous ne déclenchera pas d'événement de change .