DrissionPage过某验滑块
本帖最后由 weiback 于 2024-7-22 22:53 编辑如果此文和其他作者发布有重复,或者有其他侵权问题,请留言,将会删除此文,谢谢。DrissionPage过滑块流程:
1.首先需要先打开滑块所在网站,这里用的是atob('aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s')
page = ChromiumPage()
page.get(atob('aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s'))
2.点击触发滑块按钮,获取滑块图片
这里需要注意的是,该网站的滑块图片不能在html页面获取,所以这里需要采用DrissionPage的监听功能来捕获返回的滑块数据信息
page.listen.start(atob('YXBpLmdlZXZpc2l0LmNvbQ=='))
page.ele('.geetest_radar_tip_content').click()
res = page.listen.wait(count=2, timeout=3)
3.由2获取得到的滑块图片是乱序的,需要进行还原,还原的代码已经有很多人分享过了,这里不再赘述。
4.获取到滑块原图之后即可对滑块所在位置进行定位,这里选用的是ddddocr来进行获取滑块距离
det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
slide = open('./img/slice_img.jpg', 'rb').read()
bg = open('./img/bg_img.jpg', 'rb').read()
distance = det.slide_match(slide, bg, simple_target=True)['target']
5.滑块距离得到后,要根据他的距离来设计出滑块的移动轨迹,js逆向的话会需要考虑x,y和时间的值;这里只需要考虑x(即水平方向)的移动速度即可
这里用的是在网上看到的一个缓动函数,用来模拟人的行为来进行生成轨迹。
缓动函数:
def ease_out_expo(sep)
if sep == 1:
return 1
else:
return 1 - pow(2, -10 * sep)
这里需要注意的是,缓动函数生成的轨迹是逐渐增大的,如果是js逆向的话直接使用即可,如果是自动化需要依次用后一个值减去前一个值,否则移动距离和实际滑块位置不符。
获取移动轨迹:
def get_tracks(distance):
plus = []
# 记录count次滑块位置信息
count = int(distance / 4)
for i in range(count):
s = round(__ease_out_expo(i / count) * distance)
plus.append(round(s))
return plus
6.获得滑块轨迹之后即可滑块进行移动
page.actions.hold('.geetest_slider_button')
# 获取轨迹
index = 0
for x in get_tracks(distance)[:-5]:
if index == 0:
page.actions.move(offset_x=x, duration=.1)
else:
page.actions.move(offset_x=x - get_tracks(distance), duration=.1)
index += 1
page.actions.release('.geetest_slider_button')
7.检查是否成功
result = page.listen.wait(count=1, timeout=3)
print(result.response.body)
如果返回类似geetest_1721656914244({"success": 1, "message": "success", "validate": "0fc57cff06c02cbfd9d5dead5acaa3c8", "score": "9"}),则代表成功。
注意:轨迹有待优化,测试的时候是可以成功的,但不同电脑上运行是否成功可能有一定的差别。
qinshushuaiqi 发表于 2024-7-23 16:04
算法过滑块跟这个是一样的吗?哪个的速度快一点啊
肯定算法,算法可以多线程 qinshushuaiqi 发表于 2024-7-23 16:04
算法过滑块跟这个是一样的吗?哪个的速度快一点啊
你这里的算法如果是指js逆向的话,肯定是js逆向速度更快。如果是自动化的算法速度,这里面就是用的缓动函数来生成的轨迹,但是生成的轨迹里面有很多重复的,可以删除一些来增加移动的速度,或者在使用dp时将移动滑块的速度设置为0,都是可以的。其他的可能也有方法,但我暂时还没了解到 很实用的过程,保存了 谢谢分享 正在找这个功能的代码呢 感谢
页:
[1]