首页 > 其他分享 >给定距离与轨迹使用dp过滑块并截图识别结果

给定距离与轨迹使用dp过滑块并截图识别结果

时间:2024-11-29 14:33:47浏览次数:8  
标签:distance 截图 img 滑块 self ele captcha page dp

import time
import ddddocr
import random
from DrissionPage import ChromiumPage
import os
import shutil


class SlideCaptchaSolver:
    def __init__(self):
        self.page = ChromiumPage()

    @staticmethod
    def delete_img_folder():
        """删除img文件夹"""
        folder_name = 'img'
        # 获取当前工作目录
        current_directory = os.getcwd()
        # 构造要删除的文件夹的完整路径
        folder_path = os.path.join(current_directory, folder_name)
        try:
            # 删除文件夹及其内容
            shutil.rmtree(folder_path)
            # print(f"成功删除文件夹: {folder_path}")
        except FileNotFoundError:
            # print(f"文件夹 '{folder_path}' 不存在")
            pass
        except Exception as e:
            print(f"发生错误: {e}")

    @staticmethod
    def get_distance_by_ddddocr():
        """使用ddddocr计算缺口距离"""
        det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
        with open('./img/target.png', 'rb') as f:
            target_bytes = f.read()
        with open('./img/background.png', 'rb') as f:
            background_bytes = f.read()
        res = det.slide_match(target_bytes, background_bytes)
        x_distance = res["target"][0]
        return x_distance

    @staticmethod
    def get_tracks(distance):
        """滑块的运动轨迹"""
        value = round(random.uniform(0.55, 0.75), 2)
        v, t, sum = 0, 0.3, 0
        plus = []
        mid = distance * value
        while sum < distance:
            if sum < mid:
                a = round(random.uniform(2.5, 3.5), 1)
            else:
                a = -round(random.uniform(2.0, 3.0), 1)
            s = v * t + 0.5 * a * (t ** 2)
            v = v + a * t
            sum += s
            plus.append(round(s))

        reduce = [-6, -4, -6, -4]
        return {'plus': plus, 'reduce': reduce}

    def move_to_gap(self, slide_ele, tracks):
        """模拟滑块滑动 https://g1879.gitee.io/drissionpagedocs/ChromiumPage/actions/#-%E4%BD%BF%E7%94%A8%E5%86%85%E7%BD%AEactions%E5%B1%9E%E6%80%A7"""
        self.page.actions.hold(f"{slide_ele}")  # 此方法用于按住鼠标左键不放,按住前可先移动到元素上
        # 使鼠标相对当前位置移动若干距离
        for track in tracks['plus']:
            self.page.actions.move(
                offset_x=track,
                offset_y=round(random.uniform(1.0, 3.0), 0),
                duration=.1
            )
        time.sleep(0.5)
        self.page.actions.release(f"{slide_ele}")  # 此方法用于释放鼠标左键,释放前可先移动到元素上。

    def solve_captcha1(self):
        """嵌入式滑块"""
        self.delete_img_folder()
        self.page.get("https://castatic.fengkongcloud.cn/pr/v1.0.4/demo.html")
        self.page.ele("@text()=嵌入式(embed)").click()
        self.page.ele('@name=account').input("test")
        self.page.ele('@name=password').input("test")
        # 下载滑块和背景图,target.png 指的是滑块的图片。background.png指的是带有缺口的背景图
        self.page.ele('.shumei_captcha_loaded_img_fg').save(path="./img/", name='target.png')
        self.page.ele('.shumei_captcha_loaded_img_bg').save(path="./img/", name='background.png')
        x_distance = self.get_distance_by_ddddocr()
        # 该网址缺口的计算得除2,因为下载的图片为600 × 300 px ,而在网页上的图片大小为300 × 150 px
        x_distance = x_distance / 2
        # 计算出的轨迹
        trajectory = self.get_tracks(x_distance)
        # 进行移动
        self.move_to_gap(slide_ele=".shumei_captcha_slide_btn_icon sm-iconfont", tracks=trajectory)
        time.sleep(0.2)
        # 对验证码页面进行截图。
        captcha1 = self.page.ele('#shumei_form_captcha_wrapper')
        if captcha1:
            captcha1.get_screenshot(path="./img/captcha1.png")

    def solve_captcha2(self):
        """浮动式(float)"""
        self.delete_img_folder()
        self.page.get("https://castatic.fengkongcloud.cn/pr/v1.0.4/demo.html")
        self.page.ele("@text()=浮动式(float)").click()
        time.sleep(1)
        # 必须先输入密码再输入账号,要不然不会弹窗
        self.page.ele('@name=password').input("test")
        self.page.ele('@name=account').input("test")
        # 下载滑块和背景图,target.png 指的是滑块的图片。background.png指的是带有缺口的背景图
        self.page.ele('.shumei_captcha_loaded_img_fg').save(path="./img/", name='target.png')
        self.page.ele('.shumei_captcha_loaded_img_bg').save(path="./img/", name='background.png')
        x_distance = self.get_distance_by_ddddocr()
        # 该网址缺口的计算得除2,因为下载的图片为600 × 300 px ,而在网页上的图片大小为300 × 150 px
        x_distance = x_distance / 2
        # 计算出的轨迹
        trajectory = self.get_tracks(x_distance)
        # 进行移动
        self.move_to_gap(slide_ele=".shumei_captcha_slide_btn_icon sm-iconfont", tracks=trajectory)
        time.sleep(0.2)
        # 对验证码页面进行截图。
        captcha2 = self.page.ele('#shumei_form_captcha_wrapper')
        if captcha2:
            captcha2.get_screenshot(path="./img/captcha2.png")

    def solve_captcha3(self):
        """弹出式(popup)"""
        self.delete_img_folder()
        self.page.get("https://castatic.fengkongcloud.cn/pr/v1.0.4/demo.html")
        self.page.ele("@text()=弹出式(popup)").click()
        self.page.ele('@name=account').input("test")
        self.page.ele('@name=password').input("test")
        # 点击登录,弹出验证码
        time.sleep(1)
        self.page.ele('.shumei_login_btn').click()
        # 下载滑块和背景图,target.png 指的是滑块的图片。background.png指的是带有缺口的背景图
        self.page.ele('.shumei_captcha_loaded_img_fg').save(path="./img/", name='target.png')
        self.page.ele('.shumei_captcha_loaded_img_bg').save(path="./img/", name='background.png')
        x_distance = self.get_distance_by_ddddocr()
        # 该网址缺口的计算得除2,因为下载的图片为600 × 300 px ,而在网页上的图片大小为300 × 150 px
        x_distance = x_distance / 2
        # 计算出的轨迹
        trajectory = self.get_tracks(x_distance)
        # 进行移动
        self.move_to_gap(slide_ele=".shumei_captcha_slide_btn_icon sm-iconfont", tracks=trajectory)
        time.sleep(0.2)
        # 对验证码页面进行截图。
        captcha3 = self.page.ele('#shumei_form_captcha_wrapper')
        if captcha3:
            captcha3.get_screenshot(path="./img/captcha3.png")

    def solve_captcha4(self):
        """无图直接滑动"""
        self.delete_img_folder()
        self.page.get("https://castatic.fengkongcloud.cn/pr/v1.0.4/demo.html")
        self.page.ele("@text()=无图直接滑动").click()
        self.page.ele('@name=account').input("test")
        self.page.ele('@name=password').input("test")
        # 点击登录,弹出验证码
        self.page.ele('.shumei_login_btn').click()
        x_distance = (300 - 40)
        # 计算出的轨迹
        trajectory = self.get_tracks(x_distance)
        # 进行移动
        self.move_to_gap(slide_ele=".shumei_captcha_slide_btn_icon sm-iconfont", tracks=trajectory)
        time.sleep(0.2)
        # 对验证码页面进行截图。
        captcha4 = self.page.ele('#shumei_form_captcha_wrapper', timeout=0.5)
        if captcha4:
            captcha4.get_screenshot(path="./img/captcha4.png")

    def solve_captcha5(self):
        """使用bytes传参,不下载验证码图片"""
        self.delete_img_folder()
        self.page.get("https://castatic.fengkongcloud.cn/pr/v1.0.4/demo.html")
        self.page.ele("@text()=嵌入式(embed)").click()
        self.page.ele('@name=account').input("test")
        self.page.ele('@name=password').input("test")
        # 点击登录,弹出验证码
        self.page.ele('.shumei_login_btn').click()
        # 直接获取到验证码滑块和背景图的bytes
        target_bytes = self.page.ele('.shumei_captcha_loaded_img_fg').src()
        background_bytes = self.page.ele('.shumei_captcha_loaded_img_bg').src()

        det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
        res = det.slide_match(target_bytes, background_bytes)

        x_distance = res["target"][0] / 2
        trajectory = self.get_tracks(x_distance)
        self.move_to_gap(slide_ele=".shumei_captcha_slide_btn_icon sm-iconfont", tracks=trajectory)
        time.sleep(0.2)
        captcha5 = self.page.ele('#shumei_form_captcha_wrapper')
        if captcha5:
            captcha5.get_screenshot(path="./img/captcha5.png")


captcha_solver = SlideCaptchaSolver()
captcha_solver.solve_captcha1()
# captcha_solver.solve_captcha2()
# captcha_solver.solve_captcha3()
# captcha_solver.solve_captcha4()
# captcha_solver.solve_captcha5()

  

 

标签:distance,截图,img,滑块,self,ele,captcha,page,dp
From: https://www.cnblogs.com/yoyo1216/p/18576687

相关文章

  • 单调队列优化dp
    前置知识:单调队列不会的话可以去看我这一篇单调队列空讲太不清楚了,还是举个栗子可以发现,这很明显要用dp,看起来似乎跟单调队列有点关系,不过有一点区别,单调队列维护的是一段滑动窗口(就是一段连续长度,为\(k\)的子段),而这一题却是要求连续选择数不能超过\(k\)先直接给出暴力dp的......
  • 记一次 .NET某hdp智能柜系统 卡死分析
    一:背景1.讲故事停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下:被狗咬了也不知道是不是出门没看黄历,在小区门口店里买烟,被店老板家狗来了个猝不及防,天降横祸。让店老板赔了个疫苗钱,人生第一次被狗咬,第一次打......
  • 6CCS3AIN  Pacman MDP-solver
    6CCS3AIN Coursework1IntroductionThiscourseworkexerciseasksyoutowritecodetocreateanMDP-solvertoworkinthePacmanenvironmentthatweusedforthepracticalexercises.Readalltheseinstructionsbeforestarting.Thisexercisewillbeasses......
  • Day49 | 动态规划 :线性DP 判断子序列&&两个字符串的删除操作
    Day49|动态规划:线性DP判断子序列&&两个字符串的删除操作动态规划应该如何学习?-CSDN博客动态规划学习:1.思考回溯法(深度优先遍历)怎么写注意要画树形结构图2.转成记忆化搜索看哪些地方是重复计算的,怎么用记忆化搜索给顶替掉这些重复计算3.把记忆化搜索翻译成动态规......
  • 不会贪心和 dp 啊(utpc2021 E)
    luogu/pjudge题意:\(n\)个点,权值\(x,y,c\),选\(m\)个,\(S\)为选出的集合。最大化\(\maxp_x-\minp_x+\maxp_y-\minp_y+\sump_c(p\inS)\)\(n,m\le2e5\)这是蓝。这是蓝。这是蓝。如此水平,令人汗颜!有一个重要的性质:当\(m\gt4\)时,按c排序后前\(m-4\)大的一定会......
  • Python 使用shapely、geopandas、matplotlib绘制全国各个省份2023年GDP热力图,鼠标点击
    以下是一个示例代码,用于在使用matplotlib和geopandas绘制地图并设置区域后,当鼠标点击地图上的某个区域时,返回该区域的名称。首先,确保你已经安装了matplotlib、geopandas和descartes库(descartes库用于在matplotlib中绘制地理空间数据)。如果没有安装,可以通过pipinstallmatplot......
  • P10974 换根 dp 解题报告
    题目传送门题目大意:给定一颗无根树,有一个节点是源点,度数为\(1\)的点是汇点,树上的边有最大流量。除源点和汇点外,其它点不储存水,即流入该点的水量之和等于从该点流出的水量之和。整个水系的流量定义为原点单位时间内能发出的水量。现在需要求出:在流量不超过最大流量的前提下,选......
  • DP 套 DP 与 游园会
    DP套DP听名字猜不到它是个什么东西。接下来用一道例题P459TJOI2018游园会来解释DP套DP。游园会参考资料。题目描述小豆参加了NOI的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是\(\texttt{N}\)、\(\texttt{O}\)、\(\texttt{I}\)的字样。在会场上他......
  • NOIP 冲刺之——dp
    \(\texttt{0x00}\)前言本篇文章主要记录笔者NOIP冲刺阶段复习的各种dp题型及tricksanstips,同时也用于及时复习与巩固。那么,开始吧。\(\texttt{0x01}\)线性dp线性dp对我来说是一类很捉摸不定的题型:她太综合了,可以和任何知识点合起来考,这里就先抛开“数据结构优化”......
  • 动态规划 区间dp 基础题
    题目19182石子合并(基础版)时间限制:1000MS代码长度限制:10KB提交次数:0通过次数:0题型:编程题语言:不限定Description设有N(N≤300)堆石子排成一排,其编号为1,2,3,⋯,N。每堆石子有一定的质量mi(mi≤1000)。现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,......