验证码目前最常见的有两种
一种是图片验证码
另一种是滑块验证码
本篇博客主要用来破解图片验证码
博主是大数据专业大二学生,如果有纰漏望各位大佬指正
本篇文章使用打码平台(超级鹰)对登陆验证码进行破解,
目的-使用自动化selenium框架输入 用户名 密码 验证码 之后点击登陆。
一、准备
1.下载pillow用来保存和处理图片
pip install pillow
2下载超级鹰网页源码(为之后的破解做解析使用)
超级鹰给的脚本代码有些小问题正确代码如下
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
if __name__ == '__main__':
chaojiying = Chaojiying_Client('username', 'password', '96001') #用户中心>>软件ID 生成一个替换 96001
im = open('D:/爬虫/chaojiying_Python/a.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print (chaojiying.PostPic(im, 1902)['pic_str']) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
二、思路
1、首先使用selenium框架打开登陆界面,截取页面屏幕并保存
2、将保存的图片通过选取像素左上右下的方式截取到验证码的照片并保存。
3、通过超级鹰破解源码对验证码图片进行破解并提取出图片中的数字或者字母
4.通过定位xpath的方式输入用户名 密码 验证码 最后点击登陆
5.selenium模拟登陆
三、截取图片中验证码的位置(通过像素方式截取)
(一、)首先通过selenium框架将超级鹰页面截取代码实现如下
from selenium import webdriver
screen = './screen.png'
node = './node.png'
def get_picture(driver):
driver.get('https://www.chaojiying.com/user/login')
driver.save_screenshot('./screen.png') #保存页面到''./screen.png''
if __name__ == '__main__':
#如果想自动化测试不打开网页可以使用如下代码
option = webdriver.ChromeOptions()
option.add_argument("headless")
driver = webdriver.Chrome(chrome_options=option)
get_picture(driver)
(二、)在根目录下获取到照片之后通过画图方式打开即可获取左上和右下的像素。
我获取的像素为
(1003,438,1271,511)
四、通过代码实现保存截取后的验证码图片
def cut_picture(src,noice,api): #api表示像素 src表示截取的整个界面的图片 noice表示将截取后的验证码图片的位置
#打开截取的页面
img = Image.open(src)
#打开后截取从左上到右下的图片
img_new = img.crop(api)
#保存验证码截图
img_new.save(noice)
五、解析验证码-对验证码的内容进行识别
def rectangle(noice):
chaojiying = Chaojiying_Client('user', 'password', '96001') # 用户中心>>软件ID 生成一个替换 96001
im = open(noice, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
return chaojiying.PostPic(im, 1902)['pic_str']
小编这里就不将超级鹰的账号和密码公开了 哈哈。大家做实验在官网充值一元钱即可。
六、通过xpath定位模拟登陆超级鹰
def login(driver,username,passwd,yzm):
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys(username)
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys(passwd)
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(yzm)
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()
time.sleep(2)
if driver.title=='登录超级鹰用户中心':
return False
else:
return True
一定要在登陆末尾加入 if–else判断欧 主要是为主函数退出循环做铺垫,不然谷歌浏览器会一直打开。
七、主代码实现
from PIL import Image
import time
from chaojiying_Python.chaojiying import Chaojiying_Client
from selenium import webdriver
screen = './screen.png'
node = './node.png'
def get_picture(driver):
driver.get('https://www.chaojiying.com/user/login')
driver.save_screenshot('./screen.png') #保存页面到''./screen.png''
#截取页面
# (1003,438,1271,511)
def cut_picture(src,noice,api): #api表示像素 src表示截取的整个界面的图片 noice表示将截取后的验证码图片的位置
#打开截取的页面
img = Image.open(src)
#打开后截取从左上到右下的图片
img_new = img.crop(api)
#保存验证码截图
img_new.save(noice)
# #开始识别
def rectangle(noice):
chaojiying = Chaojiying_Client('user', 'password', '96001') # 用户中心>>软件ID 生成一个替换 96001
im = open(noice, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
return chaojiying.PostPic(im, 1902)['pic_str']
def login(driver,username,passwd,yzm):
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys(username)
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys(passwd)
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(yzm)
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()
time.sleep(2)
if driver.title=='登录超级鹰用户中心':
return False
else:
return True
def main():
driver = webdriver.Chrome()
while True:
#保存全图图片
get_picture(driver)
#截取验证码图片
api = (1003,438,1271,511)
cut_picture(screen,node,api)
yzm = rectangle(node)
#登陆
ret=login(driver,'user','root',yzm)
if ret:
print('登陆成功')
print(driver.page_source)
break
else:
print("登陆失败")
if __name__ == '__main__':
#如果想自动化测试不打开网页可以使用如下代码
option = webdriver.ChromeOptions()
option.add_argument("headless")
driver = webdriver.Chrome(chrome_options=option)
get_picture(driver)
user和root一定要修改成自己的账号和密码。