51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2533|回复: 3
打印 上一主题 下一主题

Selenium+Tesseract破解登录验证码

[复制链接]
  • TA的每日心情
    无聊
    前天 09:05
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2020-8-3 11:18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言  我破解的登录验证码类型是数学公式的这种,即
      .......是不是看起来比较简单,但是Tesseract对这种图片的识别率也很低,后期要提升识别率的话,我觉得一是要对图片进行降噪和锐化等处理,二是要对Tesseract预先训练,训练的工具我推荐jTessBoxEditor,大家有兴趣的可以了解一下。
      1 安装Tesseract
      1.1 下载Tesseract。地址为:Windows Installer made with MinGW-w64,下载完直接安装即可,安装完成后配置一下环境变量。编辑一下系统变量里的path,添加如下环境变量。
    1. C:\Program Files(x86)\Tesseract-OCR
    复制代码
    安装完成后,在cmd命令行窗口输入
    1. tesseract -v
    复制代码

     出现如下内容证明安装成功。

    1.2 安装pytesseract
    1. pip install pytesseract
    复制代码
    2 识别代码  2.1 识别逻辑。首先使用selenium到浏览器找到验证码标签,然后截图保存下来,再用tesseract去识别这张图片。如果识别失败,再用selenium点击一下验证码图片,重新生成一张验证码,再重复之前的识别逻辑。如果识别成功,使用eval计算出算式的数值,填入后点击登录按钮。
      2.2 代码
    1. import time

    2.   import pytesseract

    3.   from selenium.webdriver import Chrome

    4.   from PIL import Image

    5.   driver = Chrome(executable_path=r'D:\Chrome Downloads\chromedriver.exe')  # chromedriver的存放路径

    6.   url = "http://60.210.111.130:8002/Login.aspx"

    7.   print("开始爬取,url为{}".format(url))

    8.   driver.get(url=url)

    9.   time.sleep(2)

    10.   # 找到username的input标签,填入用户名

    11.   username = driver.find_element_by_id('txtUserName')

    12.   username.clear()

    13.   username.send_keys('your username')

    14.   # 找到password的input标签,填入密码。如果再次点击验证码时密码被清空,那么这段代码要放到while循环内部

    15.   password = driver.find_element_by_id('pwd')

    16.   password.clear()

    17.   password.send_keys('your password')

    18.   # 进行20次尝试

    19.   times = 0

    20.   while True:

    21.   try:

    22.   element = driver.find_element_by_id('validimg')

    23.   element.click()

    24.   # 每次请求的验证码图片都不一样,所以只能截图,保存至本地。

    25.   driver.save_screenshot('validImage.png')

    26.   # windows系统要注意页面缩放比例,如果是150%,那么每项都*1.5。linux系统不需要

    27.   left = element.location['x']*1.5

    28.   top = element.location['y']*1.5

    29.   right = element.location['x']*1.5 + element.size['width']*1.5

    30.   bottom = element.location['y']*1.5 + element.size['height']*1.5

    31.   im = Image.open('validImage.png')

    32.   im = im.crop((left, top, right, bottom))  # 抠图

    33.   im.save('validImage.png')

    34.   data = pytesseract.image_to_string(Image.open('validImage.png'))

    35.   if len(data) < 3:  # 未识别

    36.   continue

    37.   if len(data) == 4:  # 识别的带=号,去掉=号

    38.   data = data[:3]

    39.   if data[1] == ".":  # -号经常别识别成.,替换为-号

    40.   data[1] = "-"

    41.   print("ocr识别结果", data)

    42.   valid_code = driver.find_element_by_id('validcode')

    43.   valid_code.clear()

    44.   valid_code.send_keys(eval(data))

    45.   time.sleep(1)

    46.   btnLogin = driver.find_element_by_id('btnLogin')

    47.   btnLogin.click()

    48.   # 获取cookie

    49.   login_cookie = driver.get_cookie('ASP.NET_SessionId')

    50.   total_cookie = 'ASP.NET_SessionId={}; autoLogin=null; user=null; pwd=null'.format(login_cookie['value'])

    51.   print("total_cookie,{}".format(total_cookie))

    52.   break

    53.   except Exception as e:

    54.   time.sleep(2)

    55.   times += 1

    56.   print("破解验证码失败,重试第{}次".format(times))

    57.   if times == 20:

    58.   raise RuntimeError

    59.   # linux系统要注意退出chromedriver。否则如果多次执行的话,会生成大量的chromedriver进程。

    60.   driver.quit()
    复制代码
    执行结果如下:


    其中比较坑的一点就是,windows系统显示有缩放比例。可以在桌面右键-显示设置-缩放与布局中看到。如果缩放比例是150%的话,那么截图部分,每项参数都要*1.5,否则截不到想要的验证码。



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 08:59 , Processed in 0.065960 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表