2015-09-26 2 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. Установка печенья. Помимо добавления опции командной строки --cookies-file=cookies.txt, я также попробовал phantom.addCookie в коде. Кажется, не имеет никакого значения.
  2. Явно отправляю заголовки заголовков. См. this question.
  3. Изменение часового пояса. Не уверен, что это имеет смысл. См. this question.

По-видимому, у PhantomJS есть некоторые проблемы с SSL. Должен ли я просто отказаться от использования этого для этой цели?

ответ

0

Я думаю, что проблема с именем Instagram - ReactJs. Когда вы устанавливаете значение текстового поля, React не меняет состояние. Это означает, что логин и пароль отправляются пустым при отправке формы.

Я не пробовал, но я думаю, что вы должны заполнять текстовые входы событием нажатия клавиши, потому что внутреннее состояние (React) изменяется только при изменении текста ввода. Значение параметра в вашем пути не вызовет событие change.

+1

Спасибо! Прекрасно работает. Я внесла необходимые корректировки в скрипт и опубликовал его на Github - [ссылка здесь] (https://github.com/eafreitas/autoig) – Euripedes

+0

@Euripedes Очень рад помочь вам. Мне было трудно понять, что каждое изменение ввода должно быть размещено на отдельной странице. Оцените. –