javascript - 对 PhantomJS 代码进行故障排除以登录 Instagram

标签 javascript authentication https phantomjs

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

Your username or password was incorrect.

我 100% 肯定凭据是正确的,并且我尝试了多个 Instagram 帐户。

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

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

注意 --ssl-protocol=any 选项。没有它,由于 HTTPS,PhantomJS 甚至无法打开登录页面。参见 this question .

这是代码。我基于 this tutorial ,并更新了代码以说明 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);
    }
);

这是我到目前为止尝试过的:

  1. 设置 cookie。除了添加 --cookies-file=cookies.txt 命令行选项外,我还在代码中尝试了 phantom.addCookie。似乎没有任何区别。
  2. 明确发送身份验证 header 。参见 this question .
  3. 更改时区。不确定这是否有意义。参见 this question .

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

最佳答案

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

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

关于javascript - 对 PhantomJS 代码进行故障排除以登录 Instagram,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792683/

相关文章:

javascript - 使 Arc Canvas 响应

javascript - 在 html select 上设置选定值而不使用 runat=server

python - Django:ViewSets 不接受登录要求,导致 SessionAuthentication 无用

PHP登录-使用SQL语句检测用户类型

c# - 如果我的客户端程序是 Java 语言,为什么必须添加服务器 SSL 证书,而 C# 语言则不需要?

php - Android:使用 SSL/HTTPS 与 PHP 连接到数据库并使用 POST/GET

javascript - mailto 不适用于大正文内容

javascript - jQuery 可排序启用

powershell - 如何从 Azure 资源管理器 Runbook 登录?

git - Git Windows HTTPS远程连接