当前位置:   article > 正文

超级鹰,字符,点触,滑块验证码识别_超级鹰验证码识别

超级鹰验证码识别

目录

字符验证码

导入 pip install pillow

导入:pip install Pytesseract

点触验证

超级鹰接口代码

测试代码

滑块验证


字符验证码

导入 ;pip install pillow

导入:pip install Pytesseract

PIL库

常用阈值选择的方法是:
灰度平均值值法: 取 127 0~255 的中数, ( 0+255 /2 = 127
平均值法:
计算像素点矩阵中的所有像素点的灰度值的平均值 avg
迭代法:
选择一个近似阈值作为估计值的初始值(比如全图像的平均灰度),
然后进行分割图像,产生两组像素,一组大于初始灰度值,另一组小于
初始灰度值,根据产生的子图像的特征来选取新的阈值,在利用新的阈
值分割图像,经过多次循环,使得错误分割的图像像素点降到最小。

Windows下安装
https://digi.bib.uni-mannheim.de/tesseract/可自行下载,点击下一步即可;

  1. # -*- coding: utf-8 -*-
  2. from PIL import Image
  3. im = Image.open('1.png') #从文件中加载图像
  4. img_gray = im.convert('L') # 对图片进行灰度化
  5. # ig.save('2.png') 保存灰度化的
  6. '''对图片进行2值化'''
  7. def binarization(ig):
  8. w, h = img_gray.size
  9. tmp = 0
  10. for i in range(w):
  11. for j in range(h):
  12. tmp += ig.getpixel((i, j))
  13. avg_pixel = tmp / w / h
  14. # 二值化处理
  15. for i in range(w):
  16. for j in range(h):
  17. p = ig.getpixel((i, j))
  18. if p > avg_pixel:
  19. ig.putpixel((i, j), 255)
  20. else:
  21. ig.putpixel((i, j), 0)
  22. return ig
  23. # img_bz = binarization(img_gray)
  24. # img_bz.save('3.png')
  25. '''找到噪点范围'''
  26. def point_list(i, j, prange):
  27. for x in range(i-prange, i+prange):
  28. for y in range(j - prange, j + prange):
  29. if x ==i and y==j:
  30. continue
  31. yield (x,y)
  32. '''传入需要降噪的二值化图片'''
  33. def reduce_noise(ig):
  34. w,h = ig.size
  35. board_rate = 0.06
  36. prange = 9 #可以改的范围自己调主要是看周围多少黑点
  37. for i in range(w):
  38. for j in range(h):
  39. if i < w * board_rate or i > w * (1 - board_rate) or j < h * board_rate or j > h * (1 - board_rate):
  40. ig.putpixel((i, j), 255)
  41. continue
  42. p = ig.getpixel((i, j))
  43. if p < 100:
  44. count = 0
  45. for x, y in point_list(i, j, prange):
  46. if ig.getpixel((x, y)) > 100:
  47. count += 1
  48. if count > 0.5 * ((prange * 2 + 1) ** 2 - 1):
  49. ig.putpixel((i, j), 255)
  50. return ig
  51. # ig_nz = reduce_noise(img_bz)
  52. # ig_nz.save('img_nz.png') #生成完整的图片方便识别
  53. '''识别图片'''
  54. import pytesseract
  55. pytesseract.pytesseract.tesseract_cmd=r'J:\Tesseract\tesseract.exe'
  56. zhi=pytesseract.image_to_string('img_nz.png')
  57. print(zhi)

Tesseract识别

OCR 识别概念
OCR Optical Character Recognition )光学字符识别, 指的是对文本资
料的图像文件进行分析识别处理,获取文集及版面信息的过程
Tesseract-OCR
一个开源的字符识别引擎,我们可以用他来识别一些简单的验证码。
Windows 下安装
https://digi.bib.uni-mannheim.de/tesseract/ 可自行下载 , 点击下一步即
;
Pytesseract 认识:
Pytesseract 识别效果不佳,如果想提高识别率,可以使用 jTessBoxEditor
Tesseract 进行简单的训练。
OCR 是一个专门的图像处理的领域
高精度的识别需要依靠深度学习、神经网络等技术
本章重点是对图片文件的理解

点触验证

超级鹰的使用

https://www.chaojiying.com/
超级鹰平台配置
1. 注册超级鹰账号密码
2. 在个人中心注册一个软件,相当于做开发新建一个工程

超级鹰接口代码

 3. 下载开发文档

4. 创建类的第三个参数是第2步创建的软件的ID

5. PostPic 方法的第二个参数是,验证码的类型,不同的验证码,识别价
格不一样 https://www.chaojiying.com/price.html
超级鹰接口代码
  1. #!/usr/bin/env python
  2. # coding:utf-8
  3. import requests
  4. from hashlib import md5
  5. class Chaojiying_Client(object):
  6. def __init__(self, username, password, soft_id):
  7. self.username = username
  8. password = password.encode('utf8')
  9. self.password = md5(password).hexdigest()
  10. self.soft_id = soft_id
  11. self.base_params = {
  12. 'user': self.username,
  13. 'pass2': self.password,
  14. 'softid': self.soft_id,
  15. }
  16. self.headers = {
  17. 'Connection': 'Keep-Alive',
  18. 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
  19. }
  20. def PostPic(self, im, codetype):
  21. """
  22. im: 图片字节
  23. codetype: 题目类型 参考 http://www.chaojiying.com/price.html
  24. """
  25. params = {
  26. 'codetype': codetype,
  27. }
  28. params.update(self.base_params)
  29. files = {'userfile': ('ccc.jpg', im)}
  30. r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
  31. return r.json()
  32. def PostPic_base64(self, base64_str, codetype):
  33. """
  34. im: 图片字节
  35. codetype: 题目类型 参考 http://www.chaojiying.com/price.html
  36. """
  37. params = {
  38. 'codetype': codetype,
  39. 'file_base64':base64_str
  40. }
  41. params.update(self.base_params)
  42. r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, headers=self.headers)
  43. return r.json()
  44. def ReportError(self, im_id):
  45. """
  46. im_id:报错题目的图片ID
  47. """
  48. params = {
  49. 'id': im_id,
  50. }
  51. params.update(self.base_params)
  52. r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
  53. return r.json()
  54. if __name__ == '__main__':
  55. chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001
  56. im = open('a.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
  57. print(chaojiying.PostPic(im, 1902)) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
  58. #print chaojiying.PostPic(base64_str, 1902) #此处为传入 base64代码
测试代码
  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.common.action_chains import ActionChains
  5. from chaojiying_Python.chaojiying import Chaojiying_Client
  6. user=''
  7. password=''
  8. wb = webdriver.Chrome()
  9. wb.get("https://aq.yy.com/")
  10. # 选择iframe
  11. fr = wb.find_element(by=By.XPATH,value='//iframe[@frameborder="0"]')
  12. wb.switch_to.frame(fr)
  13. # 选择登录注册
  14. wb.find_element(by=By.XPATH,value='//a[@class="lnRegister"]').click()
  15. # 切换焦点
  16. wb.switch_to.window(wb.window_handles[1])
  17. print(wb.title)
  18. # 选择iframe
  19. ifr = wb.find_element(by=By.XPATH,value='//iframe[@frameborder="no"]')
  20. wb.switch_to.frame(ifr)
  21. # 数据输入框进行输入
  22. wb.find_element(by=By.XPATH, value='//input[@placeholder="输入你的手机号"]').send_keys("17688888888")
  23. wb.find_element(by=By.XPATH, value='//input[@placeholder="设置你帐号的登录密码"]').send_keys("qwe123456")
  24. wb.find_element(by=By.XPATH, value='//input[@placeholder="再次输入密码"]').send_keys("qwe123456")
  25. time.sleep(2)
  26. #-----------------------------------------------------------
  27. def get_code():
  28. code_img = 'yy_register.png'
  29. wb.find_element(by=By.ID, value="interActiveWrap").screenshot(code_img)
  30. return code_img
  31. get_code()
  32. time.sleep(2)
  33. # 超级鹰识别
  34. def img_identify(img_path):
  35. chaojiying = Chaojiying_Client(username=user, password=password,
  36. soft_id='931146') # 用户中心>>软件ID 生成一个替换 96001
  37. im = open(img_path, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
  38. resp = chaojiying.PostPic(im, 9103)
  39. # {'err_no': 0, 'err_str': 'OK', 'pic_id': '2219320570832210076', 'pic_str': '80,110|146,95|222,109', 'md5': '6896edf2ee6d75a59c81b24ce73967f6'}
  40. # '80,110|146,95|222,109'
  41. pic_str = resp.get('pic_str') # '80,110|146,95|222,109'
  42. pic_list = pic_str.split("|") # ['80,110','146,95','222,109']
  43. return pic_list
  44. img_list = img_identify('yy_register.png')
  45. # 点击图片
  46. def img_click(my_list):
  47. img_element = wb.find_element(by=By.ID, value="interActiveWrap")
  48. for i in my_list:
  49. data = i.split(',') #['80','110']
  50. x = int(data[0]) # 80
  51. y = int(data[1]) # 110
  52. # 将鼠标移动到距某个元素多少距离的位置
  53. ActionChains(wb).move_to_element_with_offset(img_element, xoffset=x, yoffset=y).click().perform()
  54. time.sleep(2)
  55. wb.find_element(by=By.XPATH, value='//span[@class="pw_submit"]').click()
  56. img_click(img_list)
  57. wb.find_element(by=By.XPATH, value='//span[@node-name="JCheck"]').click()
  58. wb.find_element(by=By.XPATH, value='//a[@class="btn_blue_v3"]').click()

滑块验证

  1. """
  2. 1.打开 https://captcha1.scrape.center/
  3. 2.点击登录出现滑块验证
  4. 3.计算滑块需要移动的距离
  5. 1、知道他们颜色的色差
  6. a.如果能够得到完整的图片
  7. b.再得到缺口图片
  8. 就可以找到移动的结束位置
  9. c.能够得到滑块图片
  10. 就可以找到移动的开始位置
  11. 4.使用selenium的动作链进行操作
  12. """
  13. import time
  14. from PIL import Image
  15. from selenium import webdriver
  16. from selenium.webdriver import ActionChains
  17. from selenium.webdriver.common.by import By
  18. def get_captcha():
  19. # (1)隐藏滑块 得到缺口图
  20. js_hide_slice ='document.getElementsByClassName("geetest_canvas_slice")[0].style.display="none"'
  21. driver.execute_script(js_hide_slice)
  22. # 截取缺口图
  23. part_imgpath = "./part.png"
  24. driver.find_element_by_class_name("geetest_canvas_bg").screenshot(part_imgpath)
  25. # (2)显示滑块 隐藏缺口图 得到滑块图
  26. js_show_slice = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.display="block"'
  27. js_hide_part= 'document.getElementsByClassName("geetest_canvas_bg")[0].style.display="none"'
  28. driver.execute_script(js_show_slice + ";" + js_hide_part)
  29. # 截取滑块图
  30. slice_imgpath = "./slice.png"
  31. driver.find_element_by_class_name("geetest_canvas_slice").screenshot(slice_imgpath)
  32. # (3)显示完整图
  33. js_show_full1 = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="block"'
  34. js_show_full2 = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.opacity="1"'
  35. driver.execute_script(js_show_full1+";"+js_show_full2)
  36. # 截取完整图
  37. full_imgpath = "./full.png"
  38. driver.find_element_by_class_name("geetest_canvas_fullbg").screenshot(full_imgpath)
  39. #还原 目的 还原成原来的模样 包含缺口图与滑块
  40. js_hide_full1 = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="none"'
  41. js_hide_full2 = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.opacity="0"'
  42. js_show_part = 'document.getElementsByClassName("geetest_canvas_bg")[0].style.display="block"'
  43. driver.execute_script(js_hide_full1 + ";" + js_hide_full2+ ";" +js_show_part)
  44. return part_imgpath,slice_imgpath,full_imgpath
  45. # 1.计算滑块的x轴坐标
  46. def get_slice_x(img_sclice):
  47. img = Image.open(img_sclice)
  48. w, h = img.size
  49. for x in range(w):
  50. for y in range(h):
  51. rgb = img.getpixel((x,y)) # (255,255,255)
  52. if rgb[0] + rgb[1] + rgb[2] < 600:
  53. print("滑块的坐标", x)
  54. return x
  55. # 2.计算缺口图的x轴坐标
  56. def get_bg_x(img_bg, img_full):
  57. bg = Image.open(img_bg)
  58. full = Image.open(img_full)
  59. w, h = bg.size
  60. for x in range(w):
  61. for y in range(h):
  62. bg_point = bg.getpixel((x,y))
  63. full_point = full.getpixel((x, y))
  64. r = bg_point[0] - full_point[0]
  65. g = bg_point[1] - full_point[1]
  66. b = bg_point[2] - full_point[2]
  67. abs_value = abs(r) + abs(g) + abs(b) # 33
  68. if abs_value > 180:
  69. print("缺口的坐标", x)
  70. return x
  71. # 计算滑动的距离
  72. def get_distance(img_slice, img_bg, img_full):
  73. slice_x = get_slice_x(img_slice)
  74. bg_x = get_bg_x(img_bg, img_full)
  75. data = abs(slice_x - bg_x)
  76. print('计算距离',data)
  77. return data
  78. # 模拟滑动
  79. def move_silder(tracks):# 100
  80. # 确定滑块对象
  81. element = driver.find_element(by=By.CLASS_NAME, value='geetest_slider_button')
  82. action_chains = ActionChains(driver)
  83. # 执行滑块的动作
  84. action_chains.click_and_hold(element).perform()
  85. action_chains.pause(0.2)
  86. action_chains.move_by_offset(tracks-10, 0) #
  87. action_chains.pause(0.6)
  88. action_chains.move_by_offset(10, 0) #
  89. action_chains.pause(0.6)
  90. action_chains.release().perform()
  91. if __name__ == '__main__':
  92. driver = webdriver.Chrome()
  93. url = 'https://captcha1.scrape.center/'
  94. driver.get(url)
  95. time.sleep(5) # 这里需要有一个停顿
  96. driver.find_element(by=By.CLASS_NAME, value='el-button--primary').click()
  97. time.sleep(2)
  98. # 解决问题3的截图操作(a,b,c)
  99. img_bg, img_slice, img_full = get_captcha()
  100. # 计算距离
  101. # 1.计算滑块的x轴坐标
  102. # get_slice_x('slice.png')
  103. # 2.计算缺口图的x轴坐标
  104. # get_bg_x('part.png', 'full.png')
  105. distance = get_distance(img_slice, img_bg, img_full)
  106. move_silder(distance)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/287238
推荐阅读
相关标签
  

闽ICP备14008679号