2017-01-04 4 views
7

Ich versuche mit phantom.js Login in Instagram Website. Mein erster Ansatz war:Phantom.js Login Instagram Seite

document.querySelector("input[name='username']").value = "Username"; 
document.querySelector("input[name='password']").value = "Pass"; 

Aber dieser Code ändert sich nicht da DOM.

Mein zweiter Ansatz:

document.getElementsByClassName("_kp5f7 _qy55y")[0].setAttribute("value", "Username"); 
document.getElementsByClassName("_kp5f7 _qy55y")[0].value = "Pass"; 

Aber wenn ich die Netzwerkpakete Felder Benutzername und Pass inspizieren sind leer.

Instagram Login-Seite: https://www.instagram.com/accounts/login/

+0

Sie haben Kopfzeilen und Anmeldedaten richtig setzen? und das wichtigste - sind alle diese Abfrage-Selektoren im Kontext einer Webseite? – marmeladze

+0

Was Sie tun, ist richtig, das Problem liegt außerhalb des Bereichs des bereitgestellten Codes. – superhero

+2

Haben Sie die Lösung für dieses Problem gefunden? Ich habe das gleiche Problem gesehen, konnte aber keine Lösung finden. –

Antwort

5

Update: Bitte lesen Sie bearbeiten unterhalb der Antwort

ich wirklich nicht glauben, dass

PhantomJS nicht die Seite

verarbeiten kann

Es ist wahrscheinlich, dass wir nicht gut genug tun, um eine Person zu verfälschen echter Browser.

Eine schnelle Suche nach „instagram Login PhantomJS“ fand diese saubere Lösung, die funktioniert: https://github.com/awener/instagram-login-phantomjs/blob/master/phan.js

Es nutzt PhantomJS Mechanismus der „echte“ Drücken von Tasten und Klicks zu simulieren.

Hier ist eine Kopie des Skripts nur für den Fall.

var page = require('webpage').create(); 
var username = "myusername"; 
var password = "password"; 
page.viewportSize = { width: 1024 , height: 600 }; 
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'; 

page.open('https:/instagram.com/accounts/login/', function() { 

    var ig = page.evaluate(function() { 
     function getCoords(box) { 
      return { 
       x: box.left, 
       y: box.top 
      }; 
     } 

     function getPosition(type, name) { 
      // find fields to fill 
      var input = document.getElementsByTagName(type); 
      for(var i = 0; i < input.length; i++) { 
       if(name && input[i].name == name) return getCoords(input[i].getBoundingClientRect()); 
       else if(!name && input[i].className) return getCoords(input[i].getBoundingClientRect()); // this is for login button 
      } 
     } 
     return { 
      user: getPosition('input', 'username'), 
      pass: getPosition('input', 'password'), 
      login: getPosition('button') 
     }; 

    }); 

    // fill in data and press login 
    page.sendEvent('click',ig.user.x, ig.user.y); 
    page.sendEvent('keypress', username); 

    page.sendEvent('click',ig.pass.x, ig.pass.y); 
    page.sendEvent('keypress', password); 
    page.sendEvent('click', ig.login.x, ig.login.y); 

    // wait for response 
    setTimeout(function() { 
     page.render('/path/to/screenshot.png'); 
     phantom.exit(); 
    }, 5000); 

}); 

Bearbeiten mit Erklärung, wie das Skript auf Linux

Der Grund laufen diese nicht auf Debian/Ubuntu nicht funktioniert ist SSL-Zertifikat Fragen.

Es gibt einen ausführlichen Modus, der darüber informiert, was PhantomJS macht, wenn Sie es mit der Option --debug = true CLI ausführen. Mit, dass ich die Ursache des Problems gefunden haben:

[DEBUG] Network - SSL Error: "The issuer certificate of a locally looked up certificate could not be found" 
[DEBUG] Network - SSL Error: "The root CA certificate is not trusted for this purpose" 
[DEBUG] Network - Resource request error: QNetworkReply::NetworkError(SslHandshakeFailedError) ("SSL handshake failed") URL: "https://instagramstatic-a.akamaihd.net/h1/scripts/polyfills/es5-sham.min.js/fc3c22cf2d67.js" 
... 

Um diese Art von Problemen zu vermeiden Sie müssen nur PhantomJS mit einem anderen CLI Argument laufen sagen es SSL-Fehler zu ignorieren:

/pth/to/phantomjs --ignore-ssl-errors=true /path/to/script.js 
+0

Ich habe es getestet, aber leider funktioniert das Skript nicht: '( –

+0

Bitte, sei genauer gesagt, wie es funktioniert. Ich habe auf Win 7 x64 mit PhantomJS 2.1.1 und dem daraus resultierenden 'instagram getestet .png' enthält, was ich nach der Anmeldung in Chrome sehe. – Vaviloff

+0

'./phantomjs ins.js>/dev/stdout' - auf Debian 8 (64 bit) funktioniert nicht. phantomjs' 2.1.1' –