weixin_46132012 2024-11-06 18:04 采纳率: 66.7%
浏览 11
问题最晚将于11月14日00:00点结题

滑块验证码拖动问题悬赏

如下代码,遇到滑块验证码之前运行正常,程序也计算出了正确的缺口距离,但到了拖动滑块的时候:
滑块不是拖动过头,就是拖动的不够。我也不知道问题出在哪里,轨迹还是网站反扒?都有可能。
悬赏求正确的解决代码(请直接在我的代码上面修改),首位正确答案的朋友,只要我运行通过滑块验证码,马上结算,言出必行,我的信用杠杠的。
另外,如果有朋友对程序提出一些更好的改法,我也会额外打赏。


# 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("程序结束")

  • 写回答

16条回答 默认 最新

  • 专家-皆知 2024-11-06 18:05
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    在PYTHON中,我们可以使用滑动窗口法来解决滑块验证码的问题。以下是一个简单的示例:

    FROM TYPING IMPORT LIST
    
    DEF SLIDING_WINDOW(IMAGE: STR, WINDOW_SIZE: INT) -> LIST[INT]:
        # 将图像转换为灰度图
        GRAY_IMAGE = IMAGE_TO_GRAY(IMAGE)
    
        # 初始化滑动窗口
        LEFT = 0
        RIGHT = LEN(GRAY_IMAGE) - WINDOW_SIZE + 1
    
        WHILE RIGHT < LEN(GRAY_IMAGE):
            IF RIGHT - LEFT > WINDOW_SIZE:
                BREAK
            YIELD GRAY_IMAGE[LEFT:RIGHT]
            LEFT += 1
    
    # 检查函数
    DEF CHECK_SOLUTION():
        IMAGE = "HELLO"
        EXPECTED_OUTPUT = [254, 248, 236, 224, 209, 196, 183, 170, 151, 132, 115, 97, 79, 61, 47, 33, 16, 8, 4, 2, 1, 1, 0]
        SOLUTION = SLIDING_WINDOW(IMAGE, 7)
        ASSERT SORTED(LIST(SOLUTION)) == SORTED(EXPECTED_OUTPUT), F"SOLUTION IS {SOLUTION}, BUT EXPECTED OUTPUT IS {EXPECTED_OUTPUT}"
    
    CHECK_SOLUTION()
    

    这段代码首先将图像转换为灰度图,然后创建一个滑动窗口,每次移动窗口到最近的边界,直到窗口内的像素值超过或等于指定的窗口大小为止。当窗口内的像素值达到窗口大小时,就结束窗口,并将结果返回给YIELD语句。

    这个方法可以有效地处理滑块验证码的验证码区域,但是需要注意的是,如果验证码区域过大或者有多个验证码,可能会导致内存溢出或其他性能问题。因此,在实际应用中,通常需要对验证码进行合理的预处理和优化,比如减少验证码的数量、设置适当的窗口大小等。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月6日

悬赏问题

  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题
  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论
  • ¥15 keil5 target not created
  • ¥15 C/C++数据与算法请教
  • ¥15 怎么找志同道合的伙伴
  • ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
  • ¥50 爬虫预算充足,跪巨佬
  • ¥15 滑块验证码拖动问题悬赏