拼多多手机多双阴影滑块验证码求教
回答
收藏

拼多多手机多双阴影滑块验证码求教

t
thomas4654
2023-12-16 22:33·浏览量:2074
t
thomas4654
发布于 2023-12-16 22:332074浏览

因为最近在玩拼多多视频,基本上每发15-17个视频,就会出来一次安全验证

想破一下这个验证的问题,站内外的帖子看遍了,最靠谱的可能是华南组的帖子

https://beta-www.yingdao.com/community/detaildiscuss?id=72c3a755-2bb9-41f4-98a2-346452aee289

我也基本上用的是他这个帖子的思路

但是华南组的帖子是网页版的,还是可以识别元素,但是手机自动化里面没有办法实现

所以我换了一个思路,用图像来解决,先让影刀找到拖拽的模块图片,鼠标先悬浮到图像位置

因为拼多多滑块在拖动以后会重新变一下缺口的位置,所以需要先轻微拖动

然后再截图计算滑块与缺口的距离

不过我目前没有实现想要的结果

图一为验证图样,图二为拖动以后到达的位置

每次基本上都对不准,不知道怎么解决了

我把代码也放上来,求大神帮我看一下



# 裁剪背景图片
from PIL import Image
import cv2
import os
import time

from xbot importprint

from
typing import *

defcutbg(path):  
"""
   title: 裁剪背景图片
   description: 根据指定的路径,裁剪背景图片的一部分
   inputs:
       - path (file): 图片的路径,eg: "path/to/image.jpg"
   outputs:
       - image1 (image): 裁剪后的图片对象
   """


    img = Image.open(path)

    lp = int(float(img.size[0]) * 0.0681818)  # 左边距

    rp = int(float(img.size[0]) * 0.9301346)  # 右边距

    top = int(float(img.size[1]) * 0.0581395)  # 上边距

    button = int(float(img.size[1]) * 0.6523255)  # 下边距

    box1 = (lp, top, rp, button)

    image1 = img.crop(box1)
return image1  

defcut_ab(img, save_path_a, save_path_b):  
"""
   title: 分割背景图片
   description: 将背景图片分割成缺块部分和缺口部分,分别保存到指定的路径
   inputs:
       - img (image): 背景图片对象
       - save_path_a (file): 缺块部分保存路径,eg: "path/to/image_a.jpg"
       - save_path_b (file): 缺口部分保存路径,eg: "path/to/image_b.jpg"
   """


    img_a = img.copy()

    lp = int(float(img.size[0]) * 0.03125)  # 左边距

    rp = int(float(img.size[0]) * 0.1953125)  # 右边距

    box1 = (lp, 0, rp, int(img.size[1]))

    image_a = img_a.crop(box1)

    image_a.save(save_path_a)

    lp = int(float(img.size[0]) * 0.1953125)  # 左边距

    rp = int(img.size[0])  # 右边距

    box1 = (lp, 0, rp, int(img.size[1]))

    image_b = img.crop(box1)

    image_b.save(save_path_b)

defget_x(path_a, path_b):

    bg_img = cv2.imread(path_b)  # 读取背景图片

    tp_img = cv2.imread(path_a)  # 读取滑块图片

    bg_edge = cv2.Canny(bg_img, 100, 200)  # 检测背景图片的边缘

    tp_edge = cv2.Canny(tp_img, 100, 200)  # 检测滑块图片的边缘

    bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)  # 将背景图片转换为RGB格式

    tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)  # 将滑块图片转换为RGB格式


    res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)  # 使用模板匹配找到缺口

    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配


    slider_width = tp_img.shape[1]  # 滑块图片的宽度

    gap_position = max_loc[0]  # 缺口位置

# 从左边缘计算距离

    x = gap_position

return x


defmain(path_img, repeat_times):  
"""
   title: 主函数
   description: 主要流程控制
   inputs:
       - path_img (file): 截图的大块元素的图片路径,eg: "path/to/image.jpg"
       - repeat_times (int): 重复次数,eg: 3
   outputs:
       - X (int): 缺口距离滑块的距离
       - half_width (float): path_a一半的宽度
   """


    desk_path = os.path.join(os.path.expanduser('~'),"Desktop")  # 这里调用了os模块获取桌面路径

    path_a = os.path.join(desk_path, "yanzhengmaA.png")

    path_b = os.path.join(desk_path, "yanzhengmaB.png")

    img = cutbg(path_img)
cut_ab(img, path_a, path_b)

for i inrange(repeat_times):

        X = get_x(path_a, path_b)

        half_width = img.size[0] / 2
if i < repeat_times - 1:

            time.sleep(0.5)

return X, half_width  

尝试过的方案

有些教程里面会讲要获取一下屏幕分辨率,那个代码我也有,不过我用了以后发现每次分辨率都是1.0,好像没啥用,代码里面我就去掉了,目前实现的效果是滑块可以拖动,但是就是对不准位置

影刀自定义指令里面有个滑块验证的,但是用的时候捕获元素的时候都是提示,元素类型不匹配,请重新捕获

收藏1
全部回答1
最新
发布回答
回答