欢迎光临
我们一直在努力

极验滑块验证码(1)_反拼_JS和Python代码

反拼JS代码:

function $e(e, t) {
    // e为待还原的背景图对象
    e = e["lKRC"];
    // t为canvas图形容器对象
    t = t["lKRC"];
    // 将原图的宽度赋值给r,312
    var r = e["width"];
    // 将原图的高度赋值给n,160
    var n = e["height"];
    // h为document对象,i为canvas图形容器对象
    var i = h["createElement"]("canvas");
    // 定义canvas图形容器i的宽度为312
    i["width"] = r;
    // 定义canvas图形容器i的高度为160
    i["height"] = n;
    // o为图形容器i的二维绘图环境
    var o = i["getContext"]("2d");
    // 画布o上定位图像e
    o["drawImage"](e, 0, 0);
    // a为图形容器t的二维绘图环境
    var a = t["getContext"]("2d");
    // 定义canvas图形容器t的高度为160
    t["height"] = n;
    // 定义canvas图形容器t的宽度为260
    t["width"] = Ne;
    // s = 80
    var s = n / 2;
    var u = 10;
    // Ge为数组对象,定值,其中为原图的还原顺序,共52个值,为0-51的整数。因此原图被切割成52块拼图,每块拼图大小为12*80。
    // Ge = [39, 38, 48, 49, 41, 40, 46, 47, 35, 34, 50, 51, 33, 32, 28, 29, 27, 26, 36, 37, 31, 30, 44, 45, 43, 42, 12, 13, 23, 22, 14, 15, 21, 20, 8, 9, 25, 24, 6, 7, 3, 2, 0, 1, 11, 10, 4, 5, 19, 18, 16, 17]
    for (var c = 0; c < 52; c = c + 1) {
        // 每个小块在原图宽度上的相对位置, 注意每个小块的间隔是12
        var _ = Ge[c] % 26 * 12 + 1;
        // 每个小块在原图高度上的相对位置
        var f = Ge[c] > 25 ? s : 0;
        // 从原图中裁剪出对应的小块, 注意裁剪图片的宽度是10
        var l = o["getImageData"](_, f, u, s);
        // 将裁剪的小块l, 画入二维绘图环境a
        a["putImageData"](l, c % 26 * 10, c > 25 ? s : 0);
    }
    // 注意原图为312*160的图片分割成52个大小为12*80的小块,最后由52个10*80的小块拼接成260*160完整图  
}

 

反拼PY代码

# -*- coding: utf-8 -*-
import io
from pathlib import Path

from PIL import Image


def parse_bg_captcha(img, im_show=False, save_path=None):
    """
    滑块乱序背景图还原
    :param img: 图片路径str/图片路径Path对象/图片二进制
        eg: 'assets/bg.webp'
            Path('assets/bg.webp')
    :param im_show: 是否显示还原结果, <type 'bool'>; default: False
    :param save_path: 保存路径, <type 'str'>/<type 'Path'>; default: None
    :return: 还原后背景图 RGB图片格式
    """
    if isinstance(img, (str, Path)):
        _img = Image.open(img)
    elif isinstance(img, bytes):
        _img = Image.open(io.BytesIO(img))
    else:
        raise ValueError(f'输入图片类型错误, 必须是<type str>/<type Path>/<type bytes>: {type(img)}')
    # 图片还原顺序, 定值
    _Ge = [39, 38, 48, 49, 41, 40, 46, 47, 35, 34, 50, 51, 33, 32, 28, 29, 27, 26, 36, 37, 31, 30, 44, 45, 43,
           42, 12, 13, 23, 22, 14, 15, 21, 20, 8, 9, 25, 24, 6, 7, 3, 2, 0, 1, 11, 10, 4, 5, 19, 18, 16, 17]
    w_sep, h_sep = 10, 80

    # 还原后的背景图
    new_img = Image.new('RGB', (260, 160))

    for idx in range(len(_Ge)):
        x = _Ge[idx] % 26 * 12 + 1
        y = h_sep if _Ge[idx] > 25 else 0
        # 从背景图中裁剪出对应位置的小块
        img_cut = _img.crop((x, y, x + w_sep, y + h_sep))
        # 将小块拼接到新图中
        new_x = idx % 26 * 10
        new_y = h_sep if idx > 25 else 0
        new_img.paste(img_cut, (new_x, new_y))

    if im_show:
        new_img.show()
    if save_path is not None:
        save_path = Path(save_path).resolve().__str__()
        new_img.save(save_path)
    return new_img


if __name__ == '__main__':
    parse_bg_captcha("bg.webp", im_show=True, save_path='bg.jpg')

 

赞(0) 打赏
未经允许不得转载:Sangco – 程序员之家 » 极验滑块验证码(1)_反拼_JS和Python代码

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫