2015-09-26 25 views
5

我已经编写了这个PhantomJS脚本来自动登录到Instagram。它可以成功填写表单域并按提交按钮,但它总是被重定向回到登录屏幕,并显示以下消息:疑难解答PhantomJS代码登录到Instagram

您的用户名或密码错误。

我100%肯定证书是正确的,我试了它与多个Instagram帐户。

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

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

注意--ssl-protocol=any选项。没有它,PhantomJS甚至无法打开登录页面,因为HTTPS。请参阅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. 显式发送auth头文件。请参阅this question
  3. 更改时区。不知道这是否有道理。见this question

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

回答

0

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

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

+1

谢谢!现在完美运作。我已经对脚本进行了必要的调整并将其发布到Github上 - [link here](https://github.com/eafreitas/autoig) – Euripedes

+0

@Euripedes很高兴为您提供帮助。我很难弄清楚每一个输入变化都应该放在单独的page.evaluate中。 –