[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

  • Ребят, подскажите в чем дело со смарт яндексом? Один раз кликает и останавливается. Последняя версия баса и модуля.
    bandicam 2026-03-10 18-19-28-704.mp4

    [4975082] [18:37:50] Поток №1 : Десктоп обнаружен - настройки мыши включены
    [4975082] [18:37:50] Поток №1 : Real режим мыши включен. Видимая область браузера: 1024x599, Оценка типа дисплея: XGA, DPI: 1000, Настройки мыши: SPEED=93, GRAVITY=6.12, DEVIATION=2.51
    [4975082] [18:37:50] Поток №1 : Успешно прошли все проверки. Начали решать капчу: YandexSmartCaptcha. Версия BAS: 29.7.0. Версия модуля: 7.88
    [4975082] [18:37:50] Поток №1 : Ожидаем YandexSmartCaptcha: кнопку чекбокса 'Я не робот', слайдер 'Потяните вправо' или селектор уже открытого задания капчи
    [4975082] [18:37:50] Поток №1 : Не найден ни один из стандартных типов селектора, кликаем на селектор переданный пользователем!
    [4975082] [18:37:51] Поток №1 : Ждем когда откроются картинки капчи или ждем успешное решение капчи. Текущая попытка: 1
    [4975082] [18:37:51] Поток №1 : Попыток решить каптчу: 1
    [4975082] [18:37:51] Поток №1 : Капча решена

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

    Ребят, подскажите в чем дело со смарт яндексом? Один раз кликает и останавливается. Последняя версия баса и модуля.
    bandicam 2026-03-10 18-19-28-704.mp4

    [4975082] [18:37:50] Поток №1 : Десктоп обнаружен - настройки мыши включены
    [4975082] [18:37:50] Поток №1 : Real режим мыши включен. Видимая область браузера: 1024x599, Оценка типа дисплея: XGA, DPI: 1000, Настройки мыши: SPEED=93, GRAVITY=6.12, DEVIATION=2.51
    [4975082] [18:37:50] Поток №1 : Успешно прошли все проверки. Начали решать капчу: YandexSmartCaptcha. Версия BAS: 29.7.0. Версия модуля: 7.88
    [4975082] [18:37:50] Поток №1 : Ожидаем YandexSmartCaptcha: кнопку чекбокса 'Я не робот', слайдер 'Потяните вправо' или селектор уже открытого задания капчи
    [4975082] [18:37:50] Поток №1 : Не найден ни один из стандартных типов селектора, кликаем на селектор переданный пользователем!
    [4975082] [18:37:51] Поток №1 : Ждем когда откроются картинки капчи или ждем успешное решение капчи. Текущая попытка: 1
    [4975082] [18:37:51] Поток №1 : Попыток решить каптчу: 1
    [4975082] [18:37:51] Поток №1 : Капча решена

    Это просто похожая капча, если вам нужно ее решение напишите в поддержку.

  • Ждем когда откроеться Geetest капча. Попытка номер ..
    Что я мог не так сделать?
    image.png

  • @FastSpace Опа. Я чет был уверен. А что это и как решать? Сайт drive2.ru

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

    @FastSpace Опа. Я чет был уверен. А что это и как решать? Сайт drive2.ru

    Раньше там была яндекс капча, они поменяли на кастом свой. Решать шас самостоятельно нужно ее.

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

    Ждем когда откроеться Geetest капча. Попытка номер ..

    На этом сайте капча во фрейме. Гитест в модуле не работает для айфраме.

  • @FastSpace Спасибо!

  • Иногда бывает,что капчу решает, но очень надолго зависает потом как будто капча ещё на странице. Нельзя как то ограничить по времени выполнения или чтоб элемент указывал при котором решение будет успешно считаться?