小红书旋转验证码

小红书旋转验证码自动校验系统:实现与分析

仅为自己粗浅的理解,各位大佬求指正勿喷

简介

在现代的网页应用中,验证码作为一种有效的反爬虫手段被广泛应用。滑动以及旋转验证码是一种较为流行的验证码类型,本项目旨在通过构建一个自动化系统,利用卷积神经网络(CNN)来识别验证码图片的旋转角度,并使用 playwright 库模拟人类滑动行为,最终实现滑动验证码的自动校验。

项目主要模块

项目结构简洁明了,主要包含以下几个部分:

  1. 依赖文件
    • rotate_model.pth:训练好的旋转角度识别模型
    • stealth.min.js:防止被反爬虫检测的脚本
  2. 函数

    • get_angle 调用CNN模型预测角度
    • get_tracks 根据角度映射出的距离模拟人获取滑动轨迹
    • correct_angle 使用浏览器自动化工具测试验证码验证

项目主要思路与实现

1. 定义 CNN 模型

首先,项目定义了一个简单的卷积神经网络(CNN),用于识别验证码图片的旋转角度。模型包含三个卷积层和两个全连接层:

通过逐层卷积和池化,逐步提取图像的低级到高级特征,最后通过全连接层输出结果

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)
        self.conv3 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(64 * 5 * 5, 128)
        self.fc2 = nn.Linear(128, 360)  # 360 classes for 0-359 degrees rotation

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = self.pool(torch.relu(self.conv1(x)))
        x = self.pool(torch.relu(self.conv2(x)))
        x = self.pool(torch.relu(self.conv3(x)))
        x = x.view(-1, 64 * 5 * 5)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x
2. 获取图片旋转角度

接下来,通过 get_angle 函数加载并应用模型来预测图片的旋转角度:

def get_angle(image: Image) -> int:
    transform = transforms.Compose([
        transforms.Resize((40, 40)),
        transforms.ToTensor(),
    ])
    image = image.convert('RGB')
    image = transform(image).unsqueeze(0)

    model = CNN()
    model.load_state_dict(torch.load('libs/rotate_model.pth'))
    model.eval() # 设置为评估模式
    with torch.no_grad():
        output = model(image)
        _, predicted = torch.max(output, 1)
        return predicted.item()
3. 获取移动轨迹

为了 模拟人类滑动行为 以使得滑动行为更加自然,避免被识别为机器操作,get_tracks 函数根据给定的距离通,过随机加速度和分阶段的滑动距离计算,其中包含加速和减速阶段,生成的移动轨迹会更接近人类滑动的特性:

def get_tracks(distance: int) -> list[int]:
    tracks = []  
    current = 0  
    mid = distance * 4 / 5  
    t = 0.2  
    v = 0  

    while current < distance:
        if current < mid:
            a = random.randint(3, 5)  
        else:
            a = random.randint(-5, -3)  

        v0 = v  
        v = v0 + a * t  
        move = v0 * t + 1 / 2 * a * t * t  
        current += move
        tracks.append(round(current))

    return tracks
4. 验证码校验

核心功能 correct_angle 是一个异步函数,利用 playwright 库来进行网页交互,模拟滑动行为以完成验证码校验:

注: 最终实际测试的函数由于自己的项目需要采用了协程异步实现,可以自行改为同步进行实验

@retry(stop=stop_after_attempt(10), wait=wait_fixed(2), retry=retry_if_result(lambda value: value is False))
async def correct_angle(context_page: Page) -> bool:
    if await context_page.query_selector('//div[@class="red-captcha-slider"]') is None:
        return True

    await context_page.wait_for_selector('//div[@id="red-captcha-rotate"]/img')
    img_url = await context_page.get_attribute('//div[@id="red-captcha-rotate"]/img', 'src')
    response = httpx.get(img_url)
    img = Image.open(BytesIO(response.content))
    correction_angle = get_angle(img)
    await context_page.wait_for_selector('//div[@class="red-captcha-slider"]')
    slider = await context_page.query_selector('//div[@class="red-captcha-slider"]')
    slider_box = await slider.bounding_box()
    move_x = correction_angle * 0.79

    await context_page.mouse.move((slider_box['x'] + slider_box['width'] / 2), (slider_box['y'] + slider_box['height'] / 2))
    await context_page.mouse.down()
    tracks = get_tracks(move_x)
    for track in tracks:
        target_X = track + slider_box['x'] + slider_box['width'] / 2
        target_Y = slider_box['y'] + slider_box['height'] / 2
        await context_page.mouse.move(target_X, target_Y)
    await context_page.mouse.up()

    time.sleep(3)
    if await context_page.query_selector('//div[@class="red-captcha-slider"]') is None:
        utils.logger.info("[XiaoHongShuClient.correct_angle] verify success.")
        return True
    else:
        utils.logger.info("[XiaoHongShuClient.correct_angle] verify failed.")
        return False

总结

本项目通过深度学习模型和浏览器自动化技术,结合了 CNN 图像识别和 playwright 库的网页自动化技术。实现了滑动验证码的自动校验。项目只做一种验证思路仅供学习使用,严禁其他操作。

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
滑动拼图验证码小红书中的应用类似于其他网站。滑动拼图验证码是一种人机验证机制,通过用户拖动滑块将缺口对齐,以证明用户是真实的人类,而不是自动化程序或恶意机器人。 具体到小红书的实现,根据引用中提供的代码,可以看到它使用了一个名为`slideverify`的自定义组件。这个组件接受一些参数,如滑块宽度、滑块高度、滑块位置等,并提供了一些回调函数,如`onSuccess`、`onRefresh`等。 其中,`getImageVerifyCode`函数用于获取验证码图片,并将图片的地址赋值给`imgurl`和`miniimgurl`。`imgurl`存储原始大小的验证码图片地址,`miniimgurl`存储缩略图的验证码图片地址。 `onRefresh`函数用于刷新验证码,它会清空`imgurl`和`miniimgurl`的值,并重新调用`getImageVerifyCode`函数获取新的验证码图片。 `onSuccess`函数在滑动结束后,将滑动的距离作为参数传入,并调用`verifyImageCode`函数进行后台验证。根据后台返回的验证结果,如果通过则显示成功信息,否则显示错误信息,并调用`onRefresh`函数刷新验证码。 总的来说,滑动拼图验证码小红书中的实现是通过自定义组件和一些回调函数来完成的,它增加了用户与机器的交互,提高了系统的安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue实现滑动拼图验证码功能](https://download.csdn.net/download/weixin_38747917/14818686)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [3分钟使用Halcon识别网易滑块拼图验证码](https://blog.csdn.net/qq_29888333/article/details/84192678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java Vue uni-app 三端实现,滑动拼图验证码](https://blog.csdn.net/qq_32698323/article/details/118876646)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值