[CaptchaImageClick] - модуль для решения капчи кликами по изображениям через сервис cap.guru

Делитесь модулями
  • Новая версия 7.83

    • Добавлен новый режим Real для настроек скорости мыши. Модуль используя метод BAS _get_browser_screen_settings определит тип дисплея (8K, 4K, 2K, Full HD и т.д.), затем рассчитает оптимальное значение DPI мыши и сгенерирует соответствующие параметры скорости. Каждому типу монитора доступен набор из 6-9 пресетов DPI, модуль выберет один случайно. Всего вариантов пресетов более 80.

    • По умолчанию в BAS DPI мыши равен примерно 800-1000, что не подходит для всех случаев. Новый режим имитирует реальное поведение: на 27 дюйме мониторе 4K мышь будет двигаться значительно быстрее (как игровая мышь с высоким DPI), чем на 13 дюймов ноутбуке (как офисная мышь с низким DPI). Это воспроизводит естественное поведение человека, использующего различные устройства.

    • Зачем это нужно? Эта опция улучшает проходимость капч, которые анализируют поведение мыши. Проверено на сайте с GeeTest v4 icon hand капчей: дефолтные настройки мыши BAS не проходили валидацию (JS сайта отклонял ответ) даже если выбрать 3 похожих изображения правильно, с новой опцией число ошибочных решений минимально. Также улучшает проходимость токенов для Enterprise типов капч (hCaptcha Enterprise, ReCaptcha Enterprise). И небольшой бонус, улучшено скорость решения каптч, поскольку движения мыши теперь могут быть быстрее оригинала даже на небольших мониторах.

    • hCaptcha: Никаких изменений нет. Проверены все типы каптч (3x3, канвас с перетягиванием и канвас клики). Все работает удовлетворительно (на 3+). Хотя перед новым годом в 25 числах запускал модуль и ловил тонну багов. Видимо изменения откатили и хорошо :)

    P.S ситуацию с мышкой я хоть и улучшил, но используемая библиотека в BAS для мыши - полное говно. В идеале надо ее полностью поменять, а не использовать костыль.

  • Новая версия 7.84

    • Обновлением 7.83 были сломаны мобильные отпечатки - починил.
    • Немного снизил скорость мыши на некоторых видах мониторов, могло встретиться бредовое высокое значение.
    • Для geetest v4 slider снижено минимальное требование к картинке капчи с 10000 байт до 6000 байт. На мобильных отпечатках грузиться картинка меньше чем 10000 байт.
  • Новая версия 7.85

    • Фиксы Geetest для мобильной версии.
    • Добавлен белоруский домен кое-куда в модуль.
  • Новая версия 7.86

    • Важный фикс тикток каптчи
  • Почему-то не решает капчу на сайте grailed.com
    Зависает на этапе --> Нашли открытое окно ReCaptcha 2 c изображениями и заданием. Текущая позиция (номер фрейма) на странице: 1

  • @lucinemajor said in [CaptchaImageClick] - модуль для решения капчи кликами по изображениям через сервис cap.guru:

    Почему-то не решает капчу на сайте grailed.com
    Зависает на этапе --> Нашли открытое окно ReCaptcha 2 c изображениями и заданием. Текущая позиция (номер фрейма) на странице: 1

    Все работает если прочитать документацию, на сайте невидимая капча, селектор выбрать надо от нее.

  • This post is deleted!
  • @FastSpace Javascript ES3 Decrypt / v edata response from Captcha Tiktok write by Gemini:

    function stringToUtf8Array(str) {
        var utf8 = [];
        for (var i = 0; i < str.length; i++) {
            var charcode = str.charCodeAt(i);
            if (charcode < 0x80) utf8.push(charcode);
            else if (charcode < 0x800) {
                utf8.push(0xc0 | (charcode >> 6),
                    0x80 | (charcode & 0x3f));
            } else if (charcode < 0xd800 || charcode >= 0xe000) {
                utf8.push(0xe0 | (charcode >> 12),
                    0x80 | ((charcode >> 6) & 0x3f),
                    0x80 | (charcode & 0x3f));
            } else {
                i++;
                charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));
                utf8.push(0xf0 | (charcode >> 18),
                    0x80 | ((charcode >> 12) & 0x3f),
                    0x80 | ((charcode >> 6) & 0x3f),
                    0x80 | (charcode & 0x3f));
            }
        }
        return utf8;
    }
    function utf8ArrayToString(array) {
        var out = "";
        var i = 0;
        var len = array.length;
        var c, char2, char3;
        while (i < len) {
            c = array[i++];
            switch (c >> 4) {
                case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                    out += String.fromCharCode(c);
                    break;
                case 12: case 13:
                    char2 = array[i++];
                    out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                    break;
                case 14:
                    char2 = array[i++];
                    char3 = array[i++];
                    out += String.fromCharCode(((c & 0x0F) << 12) |
                        ((char2 & 0x3F) << 6) |
                        ((char3 & 0x3F) << 0));
                    break;
                default: // Simple fallback for complex chars or errors
                    out += String.fromCharCode(0xFFFD); // Replacement char
            }
        }
        return out;
    }
    var B64_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    function base64Encode(byteArray) {
        var output = "";
        var i = 0;
        var len = byteArray.length;
        while (i < len) {
            var chr1 = byteArray[i++];
            var chr2 = byteArray[i++];
            var chr3 = byteArray[i++];
            var enc1 = chr1 >> 2;
            var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            var enc4 = chr3 & 63;
            if (isNaN(chr2)) enc3 = enc4 = 64;
            else if (isNaN(chr3)) enc4 = 64;
            output = output + B64_STR.charAt(enc1) + B64_STR.charAt(enc2) +
                B64_STR.charAt(enc3) + B64_STR.charAt(enc4);
        }
        return output;
    }
    function base64Decode(input) {
        var output = [];
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
        while (i < input.length) {
            enc1 = B64_STR.indexOf(input.charAt(i++));
            enc2 = B64_STR.indexOf(input.charAt(i++));
            enc3 = B64_STR.indexOf(input.charAt(i++));
            enc4 = B64_STR.indexOf(input.charAt(i++));
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
            output.push(chr1);
            if (enc3 != 64) output.push(chr2);
            if (enc4 != 64) output.push(chr3);
        }
        return output;
    }
    function getRandomBytes(len) {
        var arr = [];
        for (var i = 0; i < len; i++) {
            arr.push(Math.floor(Math.random() * 256));
        }
        return arr;
    }
    var Cha = function (key, nonce, counter) {
        if (key.length !== 32 || nonce.length !== 12) {
            throw new Error("Invalid key or nonce length");
        }
        this.k = key;
        this.n = nonce;
        this.c = counter || 0;
    };
    Cha._r = function (v, n) {
        return ((v << n) | (v >>> (32 - n))) >>> 0;
    };
    Cha._qr = function (s, a, b, c, d) {
        s[a] = (s[a] + s[b]) >>> 0;
        s[d] ^= s[a];
        s[d] = Cha._r(s[d], 16);
    
        s[c] = (s[c] + s[d]) >>> 0;
        s[b] ^= s[c];
        s[b] = Cha._r(s[b], 12);
    
        s[a] = (s[a] + s[b]) >>> 0;
        s[d] ^= s[a];
        s[d] = Cha._r(s[d], 8);
    
        s[c] = (s[c] + s[d]) >>> 0;
        s[b] ^= s[c];
        s[b] = Cha._r(s[b], 7);
    };
    Cha.prototype._bytesToInt = function (arr, offset) {
        return (arr[offset] |
            (arr[offset + 1] << 8) |
            (arr[offset + 2] << 16) |
            (arr[offset + 3] << 24)) >>> 0;
    };
    Cha.prototype._intToBytesPush = function (val, targetArray) {
        targetArray.push(val & 0xff);
        targetArray.push((val >>> 8) & 0xff);
        targetArray.push((val >>> 16) & 0xff);
        targetArray.push((val >>> 24) & 0xff);
    };
    Cha.prototype._block = function (ctr) {
        var s = [0x61707865, 0x3320646e, 0x79622d32, 0x6b206574];
        for (var i = 0; i < 8; i++) s.push(this._bytesToInt(this.k, i * 4));
        s.push(ctr >>> 0);
        for (var i = 0; i < 3; i++) s.push(this._bytesToInt(this.n, i * 4));
        var w = s.slice(0);
        for (var i = 0; i < 10; i++) {
            Cha._qr(w, 0, 4, 8, 12); Cha._qr(w, 1, 5, 9, 13);
            Cha._qr(w, 2, 6, 10, 14); Cha._qr(w, 3, 7, 11, 15);
            Cha._qr(w, 0, 5, 10, 15); Cha._qr(w, 1, 6, 11, 12);
            Cha._qr(w, 2, 7, 8, 13); Cha._qr(w, 3, 4, 9, 14);
        }
        var blockBytes = [];
        for (var i = 0; i < 16; i++) {
            this._intToBytesPush((w[i] + s[i]) >>> 0, blockBytes);
        }
        return blockBytes;
    };
    Cha.prototype._p = function (data) {
        var result = [];
        var dataLen = data.length;
        var currentCtr = this.c;
        var dataIdx = 0;
        while (dataIdx < dataLen) {
            var block = this._block(currentCtr);
            currentCtr = (currentCtr + 1) >>> 0;
            for (var i = 0; i < block.length; i++) {
                if (dataIdx >= dataLen) break;
                result.push(data[dataIdx] ^ block[i]);
                dataIdx++;
            }
        }
        this.c = currentCtr;
        return result;
    };
    var edata = {
        FLAG: [0x01], // b'\x01'
    
        encrypt: function (txt) {
            var d = stringToUtf8Array(txt);
            var k = getRandomBytes(32);
            var n = getRandomBytes(12);
            var c = new Cha(k, n, 0);
            var ct = c._p(d);
            var raw = this.FLAG.concat(k, n, ct);
            return base64Encode(raw);
        },
        decrypt: function (txt) {
            var raw = base64Decode(txt);
            if (raw.length < 45) {
                throw new Error("Invalid edata");
            }
            var k = raw.slice(1, 33);
            var n = raw.slice(33, 45);
            var ct = raw.slice(45);
            var c = new Cha(k, n, 0);
            var plain = c._p(ct);
            return utf8ArrayToString(plain);
        }
    };
    // Decrypt
    var cipherText = "Ae8Tm93oj9vmIbi/Z22dYrzR1ji3hm+63dxGUMydXhF4...."
    var decryptedText = edata.decrypt(cipherText);
    log(decryptedText)
    
    // Encrypt
    var originalText = "...."
    var cipherText = edata.encrypt(originalText);
    log(cipherText)
    
    
  • @radb0310 В модуле уже есть декриптор тиктока, его сделал @Q_Q по моей просьбе.

  • Кто решает слайдер, обязательно обновитесь до 7.88

  • Здравствуйте, подскажите пожалуйста ваш модуль может пройти эту капчу ? https://community.bablosoft.com/topic/32020/капча-от-яндекса-как-пройти

  • @xregem said in [CaptchaImageClick] - модуль для решения капчи кликами по изображениям через сервис cap.guru:

    Здравствуйте, подскажите пожалуйста ваш модуль может пройти эту капчу ? https://community.bablosoft.com/topic/32020/капча-от-яндекса-как-пройти

    Версия от 7.88

  • 1 Votes
    13 Posts
    2591 Views
  • 7 Votes
    21 Posts
    5233 Views
  • 5 Votes
    21 Posts
    5370 Views
  • 4 Votes
    27 Posts
    7084 Views
  • 0 Votes
    11 Posts
    1885 Views