因为最近在玩拼多多视频,基本上每发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,好像没啥用,代码里面我就去掉了,目前实现的效果是滑块可以拖动,但是就是对不准位置
影刀自定义指令里面有个滑块验证的,但是用的时候捕获元素的时候都是提示,元素类型不匹配,请重新捕获