Greasy Fork

Greasy Fork is available in English.

HWM_CommitMultipleTransfers

Отправить несколько переводов золота за раз

当前为 2017-11-22 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         HWM_CommitMultipleTransfers
// @namespace    Небылица
// @version      1.21
// @description  Отправить несколько переводов золота за раз
// @author       Небылица
// @include      /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/transfer\.php.*/
// ==/UserScript==

(function() {
    'use strict';

    // Настройки – указание уникального значения sign и времени задержки
    var sign = ""; // вписать свой sign
    var delay = 1000; // время ожидания между запросами в мс

//============<Вспомогательные функции>============//
    function sendPOSTRequest(url, params){ // Универсалка для отправки POST-запроса
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.send(params);
        return true;
    }
    function encodeCP1251(text){ // Спасибо Граде за функцию, взял как есть:) Перекодирует русский текст так, чтобы при отправке запроса не выходили кракозябры
        var cp1251_to_utf8 = 
            {
                'А': '%C0', 
                'Б': '%C1',
                'В': '%C2',
                'Г': '%C3',
                'Д': '%C4',
                'Е': '%C5',
                'Ж': '%C6',
                'З': '%C7',
                'И': '%C8',
                'Й': '%C9',
                'К': '%CA',
                'Л': '%CB',
                'М': '%CC',
                'Н': '%CD',
                'О': '%CE',
                'П': '%CF',

                'Р': '%D0', 
                'С': '%D1',
                'Т': '%D2',
                'У': '%D3',
                'Ф': '%D4',
                'Х': '%D5',
                'Ц': '%D6',
                'Ч': '%D7',
                'Ш': '%D8',
                'Щ': '%D9',
                'Ъ': '%DA',
                'Ы': '%DB',
                'Ь': '%DC',
                'Э': '%DD',
                'Ю': '%DE',
                'Я': '%DF',

                'а': '%E0', 
                'б': '%E1',
                'в': '%E2',
                'г': '%E3',
                'д': '%E4',
                'е': '%E5',
                'ж': '%E6',
                'з': '%E7',
                'и': '%E8',
                'й': '%E9',
                'к': '%EA',
                'л': '%EB',
                'м': '%EC',
                'н': '%ED',
                'о': '%EE',
                'п': '%EF',

                'р': '%F0', 
                'с': '%F1',
                'т': '%F2',
                'у': '%F3',
                'ф': '%F4',
                'х': '%F5',
                'ц': '%F6',
                'ч': '%F7',
                'ш': '%F8',
                'щ': '%F9',
                'ъ': '%FA',
                'ы': '%FB',
                'ь': '%FC',
                'э': '%FD',
                'ю': '%FE',
                'я': '%FF',

                'Ё': '%A8',
                'ё': '%B8',

                ' ': '%20', 
                '!': '%21',
                '(': '%28',
                ')': '%29',
                '*': '%2A',
                '+': '%2B',
                ',': '%2C',
                '-': '%2D',
                '.': '%2E',
                '/': '%2F'              
            };
      
        var result = '';
        for(var i = 0; i < text.length; ++i)
        {
            var is_in_array = cp1251_to_utf8[text[i]] != undefined;

            if(is_in_array)                                
                result += cp1251_to_utf8[text[i]];
            else
                result += text[i];
        }    

        return result;
    }
    function isNaturalNumber(n) { // Проверка натуральности числа
        n = n.toString();
        var n1 = Math.abs(n),
            n2 = parseInt(n, 10);
        return !isNaN(n1) && n2 === n1 && n1.toString() === n && n1 !== 0;
    }
    function queryWrapper(nicknames, amounts, descriptions, i, sign, delay, urlAfter, e){ // Обёртка для цикличного отправщика запросов
        i++;
        if (i<nicknames.length){
            sendPOSTRequest("transfer.php",
                        "nick=" + encodeCP1251(nicknames[i]) + "&gold=" + amounts[i] + "&wood=0&ore=0&mercury=0&sulphur=0&crystal=0&gem=0&desc=" + encodeCP1251(descriptions[i]) + "&sign=" + sign);
            e.target.innerHTML = "Отправляем... " + (i+1).toString() + "/" + nicknames.length.toString();
            window.setTimeout(function(){queryWrapper(nicknames, amounts, descriptions, i, sign, delay, urlAfter, e);}, delay);
        } else { // закончили отправку, открываем страницу urlAfter
            window.setTimeout(function(){var newWindow = window.open(urlAfter, "_self");}, delay);
        }
    }
//============</Вспомогательные функции>============//


//============<Вывод формы>============//
    var form = document.getElementsByName("f")[0].parentNode;
    form.innerHTML = "<br><textarea id=nicknames cols=20 rows=10 placeholder=Ники></textarea><textarea id=amounts cols=8 rows=10 placeholder=Суммы></textarea><textarea id=descriptions cols=50 rows=10 placeholder=Подписи></textarea><br><form id=mode><input type=radio name=mode value=fromtop checked>Сверху вниз</input><br><input type=radio name=mode value=frombottom>Снизу вверх</input></form><button type=button id=submit>Отправить</button>";
    form.style = "text-align:center;";
//============</Вывод формы>============//


//============<Обработка данных формы>============//
    var button = document.getElementById("submit");
    button.onclick = function(e){
            try{
                console.log(e);
                e.preventDefault();
                e.target.innerHTML = "Отправляем...";
                e.target.disabled = true;

                // Вытаскиваем из страницы заполненные поля формы
                var nicknames = document.getElementById("nicknames").value.split(/\r?\n/);
                var amounts = document.getElementById("amounts").value.split(/\r?\n/);
                var descriptions = document.getElementById("descriptions").value.split(/\r?\n/);
                var mode = document.querySelector('input[name = "mode"]:checked').value;

                var idHref = document.querySelector("a[href^=\"pl_hunter_stat.php\"]").getAttribute("href");
                var urlAfter = "http://" + location.hostname + "/pl_transfers.php?id=" + idHref.split("=")[1];

//============<Обёртка с проверкой корректности введённых данных>============//
                // Проверка одинаковости количества строк в полях
                if (nicknames.length == amounts.length && amounts.length == descriptions.length){
                    // Проверка того, что все указанные суммы золота – натуральные числа
                    var amountsCorrect = 1;
                    for (var i=0; i<amounts.length; i++){
                        if (!isNaturalNumber(parseInt(amounts[i],10))){
                            alert("Суммы золота для переводов должны быть натуральными числами!");
                            e.target.innerHTML = "Отправить";
                            e.target.disabled = false;
                            amountsCorrect = 0;
                            break;
                         }
                    }
                    // Если всё норм, идём дальше
                    if (amountsCorrect){
                        // Переворачиваем массивы, если выбран вариант "снизу вверх"
                        if (mode === "frombottom") {
                            nicknames.reverse();
                            amounts.reverse();
                            descriptions.reverse();
                        }

                        // Делаем POST-запросы по количеству строк в полях и переходим на заданную страницу после
                        queryWrapper(nicknames, amounts, descriptions, -1, sign, delay, urlAfter, e);
                    }

                } else {
                    alert("Не совпадает количество строк в полях!");
                    e.target.innerHTML = "Отправить";
                    e.target.disabled = false;
                }
//============</Обёртка с проверкой корректности введённых данных>============//

            } catch (e){
                console.log(e);
            }
    };
//============</Обработка данных формы>============// 
})();