我编写了这个 PhantomJS 脚本来自动登录 Instagram。它可以成功填写表单字段并按提交按钮,但它总是被重定向回登录屏幕并显示以下消息:
你的用户名或密码不正确。
我 100% 确信凭据是正确的,并且我用多个 Instagram 帐户进行了尝试。
我在 Mac 上从终端运行脚本:
$ phantomjs --ssl-protocol=any --cookies-file=cookies.txt script.js username password
请注意--ssl-protocol=any
选项。如果没有它,PhantomJS 甚至无法打开登录页面,因为 HTTPS。看这个问题 https://stackoverflow.com/questions/12021578/phantomjs-failing-to-open-https-site.
这是代码。我根据它本教程 https://www.safaribooksonline.com/library/view/getting-started-with/9781782164227/ch02s04.html,并更新了代码以适应 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);
}
);
到目前为止,这是我尝试过的:
- 设置cookie。除了添加
--cookies-file=cookies.txt
命令行选项,我也尝试过phantom.addCookie
在代码中。似乎没有什么区别。
- 显式发送 auth 标头。看这个问题 https://stackoverflow.com/questions/10114925/phantomjs-doesnt-send-authentication-header.
- 更改时区。不确定这是否有意义。看这个问题 https://stackoverflow.com/questions/21702903/phantomjs-set-browser-timezone-setting.
显然 PhantomJS 在 SSL 方面存在一些问题。我应该放弃将其用于此目的吗?