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

Делитесь модулями
  • Новая версия 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 Спасибо!

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

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

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

    Нет данных в ответе от запроса проверки капчи https?://(?:captcha-api|smartcaptcha).[a-z0-9.-]+/check?host= (запрос пуст)
    Поток №1 : Ждем когда откроются картинки капчи или ждем успешное решение капчи. Текущая попытка: 45
    НУ и так вечно идёт и ничего не происходит

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

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

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

    Нет данных в ответе от запроса проверки капчи https?://(?:captcha-api|smartcaptcha).[a-z0-9.-]+/check?host= (запрос пуст)
    Поток №1 : Ждем когда откроются картинки капчи или ждем успешное решение капчи. Текущая попытка: 45
    НУ и так вечно идёт и ничего не происходит

    Вечного цикла там нет, просто много попыток, в версии 7.79 я его уменьшил. Чтобы это пофиксить надо улучшить регулярное выражение. Напишите в поддержку cap.guru. Приложите все данные которые там попросят.

    Ну или забить хер, там повисит минуты 1.5 и выйдет как успешное решение.