Greasy Fork is available in English.

Drive2 Auto Subscriber

подписываюсь на всех

// ==UserScript==
// @name         Drive2 Auto Subscriber
// @namespace    drive2.ru
// @version      0.11
// @description  подписываюсь на всех
// @author       drive2 lover
// @license MIT
// @match        https://www.drive2.ru/*/followers/
// @grant        none

// ==/UserScript==

// находим секретный ключ для POST запросов
var FCTX = document.querySelectorAll("input")[0].value;
var pages = 1;

var ajax = {};
ajax.x = function () {
    if (typeof XMLHttpRequest !== 'undefined') {
        return new XMLHttpRequest();
    }
    var versions = [
        "MSXML2.XmlHttp.6.0",
        "MSXML2.XmlHttp.5.0",
        "MSXML2.XmlHttp.4.0",
        "MSXML2.XmlHttp.3.0",
        "MSXML2.XmlHttp.2.0",
        "Microsoft.XmlHttp"
    ];

    var xhr;
    for (var i = 0; i < versions.length; i++) {
        try {
            xhr = new ActiveXObject(versions[i]);
            break;
        } catch (e) {
        }
    }
    return xhr;
};

var ajax_status = 0;

ajax.send = function (url, callback, method, data, async) {
    if (async === undefined) {
        async = true;
    }
    var x = ajax.x();
    x.open(method, url, async);
    x.onreadystatechange = function () {
        if (x.readyState == 4) {
            callback(x.responseText)
        }
    };
    if (method == 'POST') {
        x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    }

    x.onload = function () {
        ajax_status = x.status;
    };

    x.send(data)
};

ajax.get = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    ajax.send(url + (query.length ? '?' + query.join('&') : ''), callback, 'GET', null, async)
};

ajax.post = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    sleep(3000);
    ajax.send(url, callback, 'POST', query.join('&'), async)
};

// изем кнопки "страниц" и открываем их все пока получается
function clickNext(){
    sleep(3000);
    var nextClicked = false;
    var nextbutton = document.querySelectorAll("button.c-block__more");
    if(nextbutton.length > 0){
        document.querySelectorAll("button.c-block__more")[0].click();
        nextClicked = true;
        pages++;
        console.log('found and open next page: ' + pages);
    } else {
        console.log('not found - next btn');
    }

    if (!nextClicked)
    {
        clearInterval(nIntervId);

        //var zNode = document.createElement ('div');
        //zNode.innerHTML = '<button id="myButton" type="button">Fuck IT</button>';
        //zNode.setAttribute ('id', 'myContainer');
        //document.body.appendChild (zNode);

        //document.getElementById ("myButton").addEventListener (
        //    "click", ButtonClickAction, false
        //);

        console.log('all pages opened');
        // ButtonClickAction(true);
    }

    ButtonClickAction();
}

function sleep(milliseconds) {
    let timeStart = new Date().getTime();
    while (true) {
        let elapsedTime = new Date().getTime() - timeStart;
        if (elapsedTime > milliseconds) {
            break;
        }
    }
}

var cars_subscribed = 0;
var request_in_process = false;
var car_ids = [];
var found_cars_count = 0;

// собираем все машинки на которые нужно подписаться в один список
function ButtonClickAction () {

    var users = document.getElementsByClassName("c-user-card__cars");

    if (users.length > 0)
    {
        for(var u = 0; u < users.length; u++){
            var cars = users[u].getElementsByClassName("c-car-title");

            if (cars.length > 0)
            {
                // берем только по одной машине у подписчика, не нужно подписываться на весь автопарк ))
                car_ids.push(cars[0].getAttribute('data-ihc-id'));

                // for(var c = 0; c < cars.length; c++){
                // var car_id = cars[c].getAttribute('data-ihc-id');
                //    if (car_id && car_id > 0)
                //    {
                //        car_ids.push(car_id);
                //    }
                //}

                // уменьшаем размер дом дерева
                // users[u].remove();
                cars[0].parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.remove();
            }
        }

        var rows = document.querySelectorAll(".o-grid");
        if (rows.length)
        {
            var with_cars;
            for(var r = 0; r < rows.length; r++){
                with_cars = rows[r].getElementsByClassName("c-car-title");
                if (with_cars.length == 0)
                {
                    rows[r].remove();
                }
            }
        }
    }
    found_cars_count = car_ids.length;
    console.log('found cars: ', found_cars_count);

    if (car_ids.length > 0 && sIntervId == false)
    {
        sIntervId = setInterval(subs, 1000);
    }

}

function subs()
{
    if (request_in_process)
    {
        console.log('waiting ...');
        return;
    }

    request_in_process = true;
    var car_id = car_ids.pop();
    if (car_id)
    {
        ajax.post('/ajax/subscription', {'_': "subscribe", 'type': "car", 'id': car_id, '.FCTX': FCTX}, function() {
            cars_subscribed++;
            console.log('cars subscribed: ' + cars_subscribed + ' / ' + found_cars_count);
            request_in_process = false;

            // переотправляем в очередь запрос который не прошел
            if (ajax_status == 403)
            {
                car_ids.push(car_id);
            }
        });
    } else {
        console.log('finish!');
        clearInterval(sIntervId);
    }
}


console.log('next btn search start');
var nIntervId = setInterval(clickNext, 3000);
var sIntervId = false;