Javascript 登录Instagram的PhantomJS代码疑难解答

Javascript 登录Instagram的PhantomJS代码疑难解答,javascript,authentication,login,https,phantomjs,Javascript,Authentication,Login,Https,Phantomjs,我编写了这个PhantomJS脚本来自动登录Instagram。它可以成功地填写表单字段并按下提交按钮,但它总是被重定向回登录屏幕,并显示以下消息: 您的用户名或密码不正确 我100%肯定这些凭证是正确的,我尝试了多个Instagram帐户 我正在从终端在Mac上运行脚本: $ phantomjs --ssl-protocol=any --cookies-file=cookies.txt script.js username password 注意--ssl protocol=any选项。没有

我编写了这个PhantomJS脚本来自动登录Instagram。它可以成功地填写表单字段并按下提交按钮,但它总是被重定向回登录屏幕,并显示以下消息:

您的用户名或密码不正确

我100%肯定这些凭证是正确的,我尝试了多个Instagram帐户

我正在从终端在Mac上运行脚本:

$ phantomjs --ssl-protocol=any --cookies-file=cookies.txt script.js username password
注意
--ssl protocol=any
选项。没有它,PhantomJS甚至无法打开登录页面,因为HTTPS。看

这是密码。我根据它更新了代码,以说明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);
    }
);
以下是我迄今为止所做的尝试:

  • 设置cookies。除了添加
    --cookies file=cookies.txt
    命令行选项外,我还在代码中尝试了
    phantom.addCookie
    。似乎没什么区别
  • 显式发送身份验证头。看
  • 改变时区。不确定这是否有意义。看

  • 显然,PhantomJS在SSL方面存在一些问题。我应该为此放弃使用它吗?

    我认为Instagram登录的问题在于。设置文本字段的值时,React不会更改状态。这意味着,当您提交表单时,登录名和密码发送为空


    我没有尝试,但我认为应该用按键事件填充文本输入,因为内部组件(React)状态只有在输入文本更改时才会更改。以您的方式设置值不会触发
    更改
    事件。

    谢谢!现在效果很好。我已经对脚本进行了必要的调整,并将其发布在Github-@Euripedes上,非常高兴能够帮助您。对我来说,很难理解每个输入更改都应该放在单独的page.evaluate中。