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
Sie haben Kopfzeilen und Anmeldedaten richtig setzen? und das wichtigste - sind alle diese Abfrage-Selektoren im Kontext einer Webseite? – marmeladze
Was Sie tun, ist richtig, das Problem liegt außerhalb des Bereichs des bereitgestellten Codes. – superhero
Haben Sie die Lösung für dieses Problem gefunden? Ich habe das gleiche Problem gesehen, konnte aber keine Lösung finden. –