Сбой входа в систему и перенаправления пользователя без ошибок и без перенаправления? - PullRequest
0 голосов
/ 07 мая 2018

Попытка создать сценарий Greasemonkey для автоматического заполнения некоторых форм, и я хочу, чтобы сценарий переходил на другой URL-адрес после отправки формы.

// ==UserScript==
// @name     usersaime
// @description fills data form for user and pass 
// @include https://tramites.saime.gob.ve/*
// @version  1.1
// @grant    none
// ==/UserScript==
document.getElementById('LoginForm_username').value = "user";
document.getElementById('LoginForm_password').value = "1234";

setTimeout(function() {
    document.getElementById('login_button').click();
}, 2000);

window.addEventListener('load', function(event) {
    // all resources finished loading
    window.location = 'https://tramites.saime.gob.ve/index/example/example';
});

window.location вообще не работает. Я также попробовал window.location.href и window.location.replace и функцию setTimeout для window.location. Ничего не работает.

На консоли нет ошибок.

Пробовал:

  • Firefox 59 + Greasemonkey 4,3
  • Chrome 66 + Tampermonkey 4.5

Страница / форма входа https://tramites.saime.gob.ve/index.php?r=site/login.
И при успешном входе в систему он переходит на https://tramites.saime.gob.ve/index.php?r=tramite/tramite/ - который я хочу перенаправить.

1 Ответ

0 голосов
/ 07 мая 2018

Простой, немедленный ответ:
Причина, по которой window.location не работает для вас, заключается в том, что:

  1. Вызов window.location выполняется внутри окна load обработчик событий.
  2. Эта целевая страница является одной из тех, где load событие срабатывает почти сразу после события DOMContentLoaded.
  3. По умолчанию пользовательские сценарии срабатывают на DOMContentLoaded, но в этом случае событие загрузки уже сработало к моменту запуска сценария.

Реальный ответ:
Есть много проблем с этим кодом вопроса:

  1. Это не отслеживание и учет состояния процесса. Сценарий запускается на многих (видах) страницах и должен вести себя по-разному в зависимости от состояния.
  2. Страница (ы) в основном AJAX. Код неправильно учитывает это.
  3. Событие загрузки не особенно полезно в этом сценарии.
  4. Вышеупомянутое, сценарий стрельбы против нагрузки, состояние гонки.
  5. Жесткое кодирование учетных данных для входа в подобный скрипт означает, что вы получите pwned, вопрос только в том, когда и сколько урона.

Необходимо отслеживать и различать как минимум 3 различных состояния, используя комбинацию URL-адресов страниц и / или ключевых узлов на страницах и / или переменных состояния, которые сценарий сохраняет / передает.

Следующий сценарий пользователя иллюстрирует этот процесс, хотя я не могу проверить его на сайте, и рекомендуемая структура аутентификации для простоты опущена. :

// ==UserScript==
// @name     _Login and then redirect an AJAX-driven page
// @include  https://tramites.saime.gob.ve/*
// @require  https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// @grant    GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.

//--- Different pages require different actions
if (location.search.includes ("site/login") ) {  // initial login page

    //-- Wait for page to initialize
    waitForKeyElements ("#login_button:visible", loginWhenReady);
}
else if (location.search.includes ("tramite/tramite") ) {  // successful login page
    //-- Just redirect
    location.assign ("https://tramites.saime.gob.ve/index/example/example");
}
else {
    //-- All other pages, no action needed.
}

function loginWhenReady (jNode) {
    //-- Demo purposes only!  Use framework or password manager instead!
    $("#LoginForm_username").val ("user");
    $("#LoginForm_password").val ("1234");

    clickNode (jNode);  //  Login button passed in by WFKE
}
function clickNode (jNode) {
    var clickEvent  = document.createEvent ('MouseEvents');
    clickEvent.initEvent ('click', true, true);
    jNode[0].dispatchEvent (clickEvent);
}


Возможное быстрое и простое решение:

  1. If-and-only-if (IIF) страница входа в систему всегда
    https://tramites.saime.gob.ve/index.php?r=tramite/tramite/.
  2. И если эта страница используется ни для чего другого, что вас волнует ...

Тогда для ваших нужд может быть достаточно следующего пользовательского сценария:

// ==UserScript==
// @name     _Quick and dirty post login redirect
// @include  https://tramites.saime.gob.ve/index.php?r=tramite/tramite*
// @grant    none
// @run-at   document-start
// ==/UserScript==

location.replace ("https://tramites.saime.gob.ve/index/example/example");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...