如下代码,遇到滑块验证码之前运行正常,程序也计算出了正确的缺口距离,但到了拖动滑块的时候:
滑块不是拖动过头,就是拖动的不够。我也不知道问题出在哪里,轨迹还是网站反扒?都有可能。
悬赏求正确的解决代码(请直接在我的代码上面修改),首位正确答案的朋友,只要我运行通过滑块验证码,马上结算,言出必行,我的信用杠杠的。
另外,如果有朋友对程序提出一些更好的改法,我也会额外打赏。
# CSDN求助
import cv2
from DrissionPage import ChromiumPage, ChromiumOptions
import pyautogui
import time
co = ChromiumOptions()
co.incognito() # 匿名模式
co.headless() # 无头模式
co.set_argument('--no-sandbox') # 无沙盒模式
def find_slider_and_gap(image_path):
# 函数功能:opencv计算滑块和缺口图片的距离,坐标
# 读取图片
image = cv2.imread(image_path)
if image is None:
raise ValueError("Image not found or unable to read")
# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用高斯模糊减少噪声
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 使用Canny边缘检测
edges = cv2.Canny(blurred, 50, 150)
# 使用轮廓检测找到滑块和缺口
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 找到最大的两个轮廓(假设滑块和缺口是最明显的两个轮廓)
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:2]
if len(contours) < 2:
raise ValueError("Not enough contours found")
# 计算轮廓的边界框
slider_box = cv2.boundingRect(contours[0])
gap_box = cv2.boundingRect(contours[1])
# 计算滑块和缺口的中心点
slider_center = (slider_box[0] + slider_box[2] // 2, slider_box[1] + slider_box[3] // 2)
gap_center = (gap_box[0] + gap_box[2] // 2, gap_box[1] + gap_box[3] // 2)
# 计算滑块和缺口在X轴上的距离
distance_x = abs(slider_center[0] - gap_center[0])
# 绘制边界框和中心点
cv2.rectangle(image, slider_box, (0, 255, 0), 2)
cv2.rectangle(image, gap_box, (0, 0, 255), 2)
cv2.circle(image, slider_center, 5, (0, 255, 0), -1)
cv2.circle(image, gap_center, 5, (0, 0, 255), -1)
return slider_center, gap_center, distance_x
# page = WebPage()
page = ChromiumPage()
page.get('https://auth.orangebank.com.cn/cimp-ccs-pc/#/p/ebank-login')
# 输入用户名
page('#ADM').input("2000878439@03")
time.sleep(0.5)
print("此处先手工输入密码,任意键后5秒,继续", input())
time.sleep(5)
page.ele('xpath://*[@id="app"]/div/div[2]/div[3]/div[1]/div[2]/div[2]/form/div[3]/div/div/span/button').click()
# 获取滑块
huakuai = page.ele('xpath://*[@id="dx_captcha_basic_slider-img-normal_1"]')
print(huakuai)
time.sleep(1)
# 对当前元素截图,背景图
page.ele('xpath://*[@id="dx_captcha_basic_bg_1"]/canvas', timeout=2).get_screenshot(name='ping_an.png')
# 示例使用
image_path = 'ping_an.png'
slider_center, gap_center, distance_x = find_slider_and_gap(image_path)
print(f"滑块中心坐标: {slider_center}")
print(f"缺口中心坐标: {gap_center}")
print(f"滑块和缺口在X轴上的距离: {distance_x}")
pyautogui.sleep(1)
# 以下是滑块拖动部分,暂时没写循环,但调试多次,拖动的距离,均和上述函数计算出来的不一致。函数计算出来的距离,我量过都是对的。但拖动不是短,就是长。
pyautogui.moveTo(x=1128, y=1128)
pyautogui.sleep(1)
pyautogui.mouseDown()
time.sleep(1)
pyautogui.dragRel(distance_x, 0, duration=2, button='left')
time.sleep(1)
pyautogui.mouseUp
print("程序结束")