该功能主要运用到的模块有:re、cv2、影刀元素库
该代码基于影刀编辑器,再PyCharm以及VSCode无法运行
红色:滑块图片;黄色:缺口图片;绿色:滑块
dir_path = r'C:\img'
if os.path.exists(dir_path):shutil.rmtree(dir_path) # 删除文件夹
os.makedirs(dir_path) # 创建文件夹
def slider_treatment(web_page, slider_selector='滑块', mode='chrome'):#slider_selector可以不管
web_page = xbot.web.get_active(mode) #获取当前激活的网页对象
if not web_page.wait_appear('滑块', timeout=5):return True #判断是否有滑块按钮,存在滑块按钮则进行验证
back_img_url_html = web_page.find("滑块图片").get_html() #获取背景图片html
block_img_url_html = web_page.find("缺口图片").get_html() #获取缺口图片html
# 利用正则将图片链接从html中匹配出来
back_img_url, block_img_url = re.search(r'src="([^"]+)"', back_img_url_html).group(1), re.search(r'src="([^"]+)"', block_img_url_html).group(1)
print(back_img_url)
print(block_img_url)
# 由于是本地识别,所以需要将文件保存到本地
bj_img_path = download_image_new(back_img_url, dir_path)
time.sleep(1)
qk_img_path = download_image_new(block_img_url, dir_path)
bj_img_a = cv2.imread(bj_img_path)
qk_img = cv2.imread(qk_img_path)
size = bj_img_a.shape #获取图片尺寸
# print(size)
img_size = 340 / size[1] #获取图片缩放比,图片在网站的宽度和下载下载之后的宽度可能存在差异,计算缩放比便于后面处理
bj_img = cv2.Canny(bj_img_a, 100, 200)
qk_img = cv2.Canny(qk_img, 100, 200)
bg_pic = cv2.cvtColor(bj_img, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(qk_img, cv2.COLOR_GRAY2RGB)
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
X = max_loc[0]
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角点的坐标
br = (tl[0] + tw, tl[1] + th) # 右下角点的坐标
cv2.rectangle(bj_img_a, tl, br, (0, 0, 255), 2) # 绘制矩形
# plt_show(bj_img_a)
# print(X * img_size)
web_page.find('滑块').drag_to(left=round(X * img_size)) #滑动滑块按钮,计算出来的X坐标乘缩放比
if not web_page.wait_appear('滑块', timeout=5):return True #判断是否处理完成
return False
def download_image_new(url, save_path):
try:
save_path = os.path.join(save_path, f'{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}.png')
# Send a GET request to the URL
response = requests.get(url)
response.raise_for_status() # Raise an error for bad status codes
# Open a file in binary write mode and save the image
with open(save_path, 'wb') as file:
file.write(response.content)
print(save_path)
return save_path
except requests.exceptions.RequestException as e:
print(f"Error downloading image: {e}")
return False