2015-09-26 9 views
5

Ho scritto questo script PhantomJS per automatizzare l'accesso a Instagram. Può riempire correttamente i campi del modulo e premere il pulsante di invio, ma viene sempre reindirizzato alla schermata di accesso con il seguente messaggio:Risolvi il codice PhantomJS per accedere a Instagram

Il nome utente o la password non erano corretti.

Sono 100% positivo che le credenziali siano corrette e l'ho provato con più account Instagram.

che sto eseguendo lo script su un Mac da terminale:

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

Nota l'opzione --ssl-protocol=any. Senza di esso PhantomJS non può nemmeno aprire la pagina di accesso a causa di HTTPS. Vedi this question.

Ecco il codice. L'ho basato su this tutorial e ho aggiornato il codice per tenere conto delle recenti modifiche nel codice sorgente della pagina di accesso di 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); 
    } 
); 

E qui è quello che ho provato finora:

  1. Impostazione cookie. Oltre all'aggiunta dell'opzione da riga di comando --cookies-file=cookies.txt, ho anche provato phantom.addCookie nel codice. Non sembra fare alcuna differenza.
  2. Invio di intestazioni auth in modo esplicito. Vedi this question.
  3. Modifica del fuso orario. Non sono sicuro se questo ha un senso. Vedi this question.

A quanto pare PhantomJS presenta alcuni problemi con SSL. Dovrei semplicemente smettere di usarlo per questo scopo?

risposta

0

Penso che il problema con l'accesso Instagram sia ReactJs. Quando si imposta il valore del campo di testo, React non cambia stato. Significa che l'accesso e la password vengono inviati vuoti quando si invia il modulo.

Non l'ho provato, ma penso che dovresti riempire gli input di testo con l'evento keypress, perché lo stato del componente interno (React) cambia solo quando cambia il testo degli input. L'impostazione del valore nel modo desiderato non attiverà l'evento change.

+1

Grazie! Funziona perfettamente ora. Ho apportato le modifiche necessarie alla sceneggiatura e l'ho pubblicata su Github - [collegamento qui] (https://github.com/eafreitas/autoig) – Euripedes

+0

@Euripedes Molto felice di aiutarti. È stato difficile per me capire che ogni modifica di input dovrebbe essere collocata in una pagina separata. Valutare. –