通过上一篇文章基于yolov5滑块识别破解(一)-CSDN博客,我们已经完成了yolov5的部署和训练,接下来我们将对源码进行改动,来实现滑块的自动滑动破解。
1.获取坐标
修改detect中for循环的内容,获取目标的左上角的x位置,可以理解为阴影快的位置。之后的代码都可以删除掉了。
修改末尾函数,返回x_location
2.浏览器登陆
这里以豆瓣登陆为例,使用DrissionPage操作浏览器,自动输入账号密码来到登陆界面的滑块确认操作:
代码如下:
page = ChromiumPage()
# 跳转到登录页面
page.get('https://accounts.douban.com/passport/login')
# 点击账号密码登陆
page.ele('xpath://*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
# 输入账号和密码
page.ele('xpath://*[@id="username"]').input('17263498234')
page.ele('xpath://*[@id="password"]').input('17263498234')
# 点击登陆
page.ele('xpath://*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
3.滑块图片获取
DrissionPage自带了页面截图的效果,我们只需要截取滑块部分即可。坐标获取的办法有很多种,我用的是直接截取整个网页图片,然后在windows画板中去查看坐标。(由于显示器大小的原因,不同的电脑可能滑块页面的像素位置会不同,建议自己截图测量一下)
代码如下:
page.get_screenshot(left_top=(754,294),right_bottom=(1114,664),name='blok.jpg')
left_top=(754,294):滑块部分左上角在整个页面的坐标
right_bottom=(1114,664):滑块部分右下角在整个页面的坐标
运行结果如下:
4.阴影快水平位置获取
再得到图片以后我们就可以调用yolov5去检测阴影快,得到距离目标的水平距离。
5.获取滑块元素
因为滑块元素是在原来的html页面里面又嵌套了一个html结构,直接获取滑块元素是获取不到的,我们需要切换到对应的iframe下,代码如下:
# 切换iframe
iframe = page.get_frame('tcaptcha_iframe_dy')
# 获取iframe中的滑块元素
iframe.ele('xpath://*[@id="tcOperation"]/div[6]')
6.滑动滑块
在拿到距离目标的水平位置之后,我们可以滑动滑块去解锁了。由于yolov5返回的目标位置是从图片最左边开始算的,而且滑块的起始位置并不在最左边,所以我们还要减掉滑块的起始位置。
完整代码
import shutil
import time
import os
from detect import get_location
from DrissionPage import ChromiumPage
# 用 d 模式创建页面对象(默认模式)
page = ChromiumPage()
def delete_folder(folder_path):
if os.path.exists(folder_path):
shutil.rmtree(folder_path) # 删除文件夹及其内容
print(f"文件夹 '{folder_path}' 已删除")
else:
print(f"文件夹 '{folder_path}' 不存在")
def delete_files_in_directory(directory):
# 遍历目录中的所有文件
for filename in os.listdir(directory):
file_path = os.path.join(directory, filename)
try:
# 检查是否是文件,避免删除子文件夹
if os.path.isfile(file_path):
os.remove(file_path)
print(f'已删除文件: {file_path}')
except Exception as e:
print(f'删除文件时出错: {file_path}, 错误: {e}')
def action(target):
# 切换iframe
iframe = page.get_frame('tcaptcha_iframe_dy')
print('开始滑动')
iframe.ele('xpath://*[@id="tcOperation"]/div[6]').drag(target,0,1)
print('滑动结束')
def login_page():
# 跳转到登录页面
page.get('https://accounts.douban.com/passport/login')
# 点击账号密码登陆
page.ele('xpath://*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
# 输入账号和密码
page.ele('xpath://*[@id="username"]').input('17263498234')
page.ele('xpath://*[@id="password"]').input('17263498234')
# 点击登陆
page.ele('xpath://*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
# 等待让滑块加载出来
time.sleep(2)
# 删除之前的图片
delete_files_in_directory('./data/images')
delete_folder('./runs/detect/')
# 对整页截图并保存
page.get_screenshot(left_top=(754,294),right_bottom=(1114,664),name='blok.jpg',path='./data/images')
# 获取当前位置
location = get_location()
# 滑动滑块,位置为目标距离减去滑块起始距离
action(location-40)
if __name__ == '__main__':
login_page()