[Javascript] Устранение неполадок с кодом PhantomJS для входа в Instagram



Answers

Question

Я написал этот скрипт 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);
    }
);

И вот что я пробовал до сих пор:

  1. Настройка файлов cookie. Помимо добавления --cookies-file=cookies.txt командной строки --cookies-file=cookies.txt , я также попытался использовать phantom.addCookie в коде. Кажется, не имеет никакого значения.
  2. Явная отправка заголовков заголовков. См. Этот вопрос .
  3. Изменение часового пояса. Не уверен, что это имеет смысл. См. Этот вопрос .

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




Links