验证码破解初体验
2020-05-20 本文已影响0人
今天也是努力的小张
一、验证码
1. 验证码出现的地方
- 登录界面
登录界面一般情况下是没有验证码的,但是在输错很多的情况下会出现 - 查询数据的时候,点击查询按钮前要输入
- 爬取一个网站时,出现验证码(滑动验证码居多)
尽量自己先尝试,积累经验
2. 验证码分类
任何验证码都可以使用selenium手动输入
- 图片验证码
知网图片验证码:http://my.cnki.net/Register/CheckCode.aspx
解决:图片验证码可以使用OCR库-Tesseract解决,但是他只适用于处理简单图片,正确率不高,推荐使用打码平台 - 滑动验证码(验证码高级)
解决:参考 滑动验证码破解 - 反人类验证码(十分不好识别的验证码)
解决:推荐selenium手动输入
二、Selenium手动打码
1. 原理
结合selenium配合可视化浏览器来完成
2. 学习一个新组合:selenuim+IE浏览器
配置参考:https://www.cnblogs.com/misswjr/p/9453566.html
3. 学习案例-发票真伪验证
import time
from selenium.webdriver.common.keys import Keys
def verify_fp():
from selenium import webdriver
# 创建浏览器驱动
driver = webdriver.Ie()
# 请求url
driver.get('https://inv-veri.chinatax.gov.cn/')
# 等待
# driver.implicitly_wait(20)
time.sleep(5)
# 添加发票代码
driver.find_element_by_xpath('//*[@id="fpdm"]').send_keys('044031900211')
driver.find_element_by_xpath('//*[@id="fphm"]').send_keys('28780009')
driver.find_element_by_xpath('//*[@id="kprq"]').send_keys('20200417')
driver.find_element_by_xpath('//*[@id="kjje"]').send_keys('227437')
# driver.find_element_by_xpath('//*[@id="yzm_img"]').click()
while True:
# 清空输入款
driver.find_element_by_xpath('//*[@id="yzm"]').send_keys(Keys.CONTROL, 'a')
driver.find_element_by_xpath('//*[@id="yzm"]').send_keys(Keys.CONTROL, 'x')
code = input('输入验证码:')
driver.find_element_by_xpath('//*[@id="yzm"]').send_keys(code)
time.sleep(5)
driver.find_element_by_xpath('//*[@id="checkfp"]').click()
time.sleep(5)
if '3999.0' in driver.page_source:
print('发票为真!')
break
print('验证码错误,重新输入!')
if __name__ == '__main__':
verify_fp()
driver就是一个浏览器对象,不管自动做操作,还是人为手动做操作,都可以影响driver。如果要设置人为操作,一定要注意等待的问题
三、打码平台
1. 介绍
打码平台有很多:云打码,斐斐打码,超级鹰。打码平台的作用就是发送请求到指定端口,等待返回数据。
2. 学习案例-超级鹰为例
(1)网址:http://www.chaojiying.com/
(2)注册账号和密码
(3)查看开发文档 -> 选择python语言 -> 左侧选择扩平台HTTP标准WEB接口
(4)从开发文档中,找到:接口地址、请求方式、参数设置等信息。
(5)请求url,得到response,response里面就是验证码识别的内容。
import requests
import base64
def verify_code(imge_filename, code_type='1004'):
'''
:param imge_filename: 验证码图片文件路径
:code_type='1004':验证码的类型,1004:1-4为英文数字,详细请查看:http://www.chaojiying.com/price.html
:return: 验证码图片的内容
'''
base_url = 'http://upload.chaojiying.net/Upload/Processing.php'
fp = open(imge_filename, 'rb')
imag_str = base64.b64encode(fp.read())
# 0
data = {
'user': '13016031459',
'pass2': 'ad946e260f74e67a48092d735c75e1c4',
'softid': '903750',
'codetype': code_type, # 验证码的类型
'file_base64': imag_str,
}
response = requests.post(base_url, data=data)
# print(response.json())
if response.json()['err_no']=='0':
return response.json()['pic_str']
if __name__ == '__main__':
# fp = open('CheckCode.png','rb')
filename = 'code.png'
code_str = verify_code(filename)
按超级鹰提供的步骤做
四、综合学习案例-RPA财务机器人之发票真伪验证
1. RPA是什么
- RPA并不是一个真实的、肉眼可见的机器人,而是
流程自动化服务,RPA 的 全称为机器人流程自动化(Robotic Process Automation),是一款软件产品,可模拟人在电 脑上的不同系统之间操作行为,替代人在电脑前执行具有规律与重复性高的办公流程。 - 对于 RPA,也有人将它称为数字劳动力(Digital Labor),因为它擅长把工作流程中的重复操作进行自动化。繁琐流程自动化是企业数字化转型的重要环节。RPA 能够有效优化传统办公流程,提升工作效率,间接优化企业劳动资源配置,助力企业数字化升级。
2. RPA的价值
(1)降低人力资源花费,人力成本节省 30%;
(2)解决了繁杂的运行和业务逻辑,可以合理地回应单位专业知识基本建设的必须,解决 工作人员变化的风险性。
(3)让职工从繁杂、低价值的劳动者中摆脱出去,从业高些价值、创造力的工作中。
(4)RPA 机器人可以二十四小时工作,提升单位的服务能力。
3. 项目需求
- RPA 财务机器人可以对收付款、审批、纳税申报、对账等多个环节实现 RPA 作业,该项目主要实现
发票真伪验证这个子功能的实现。 - 该功能主要调用
百度 AI 财务机器人接口实现对发票信息的提取,再使用 selenium 进入发票真伪检验的网站对发票真伪进行验证。
4. 技术学习要点
(1)结合第三方平台(百度 AI)进行发票内容识别。
(2)使用 selenium 进入发票真伪检验的网站对发票真伪进行验证。
(3)使用打码平台进行发票真伪验证码的识别。
5. 实现
import requests, time
from selenium.webdriver.common.keys import Keys
def get_token():
'''
获取:Access Token
:return:
'''
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=N6hI5qgy5VSGmhg78pEfCcNb&client_secret=ZOjCFgEZjHYBYK14frNBQi3uCqTXX8S9'
response = requests.get(host)
if response:
# print(response.json())
return response.json()['access_token']
def shibie_fp(access_token,filename):
import base64
'''
增值税发票识别
'''
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"
# 二进制方式打开图片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = {"image": img}
access_token = access_token
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
# requests模块对于你输入url,自动回进行url编码
response = requests.post(request_url, data=params, headers=headers)
if response:
# print(response.json())
# InvoiceNum:发票号码
# InvoiceDate:发票日期
# InvoiceCode:发票代码
# CheckCode:发票的校验码
# TotalAmount:发票金额
item = {}
InvoiceDate = response.json()['words_result']['InvoiceDate']
item['InvoiceNum'] = response.json()['words_result']['InvoiceNum']
item['InvoiceDate'] = InvoiceDate.replace('年','').replace('月','').replace('日','')
item['InvoiceCode'] = response.json()['words_result']['InvoiceCode']
item['CheckCode'] = response.json()['words_result']['CheckCode'][-6:]
item['TotalAmount'] = response.json()['words_result']['TotalAmount']
print(item)
return item
def verify_fp(item):
from selenium import webdriver
# 创建浏览器驱动
driver = webdriver.Ie()
# 请求url
driver.get('https://inv-veri.chinatax.gov.cn/')
# 等待
# driver.implicitly_wait(20)
time.sleep(5)
# 添加发票代码
driver.find_element_by_xpath('//*[@id="fpdm"]').send_keys(item['InvoiceCode'])
driver.find_element_by_xpath('//*[@id="fphm"]').send_keys(item['InvoiceNum'])
driver.find_element_by_xpath('//*[@id="kprq"]').send_keys(item['InvoiceDate'])
driver.find_element_by_xpath('//*[@id="kjje"]').send_keys(item['CheckCode'])
# driver.find_element_by_xpath('//*[@id="yzm_img"]').click()
while True:
#清空输入款
driver.find_element_by_xpath('//*[@id="yzm"]').send_keys(Keys.CONTROL,'a')
driver.find_element_by_xpath('//*[@id="yzm"]').send_keys(Keys.CONTROL,'x')
code = input('输入验证码:') # 阻塞方法
driver.find_element_by_xpath('//*[@id="yzm"]').send_keys(code)
time.sleep(5)
driver.find_element_by_xpath('//*[@id="checkfp"]').click()
time.sleep(5)
if '3999.0' in driver.page_source:
print('发票为真!')
break
print('验证码错误,重新输入!')
if __name__ == '__main__':
# 获取token
access_token = get_token()
filename = 'fapiao2.png'
# 识别增值税发票
item = shibie_fp(access_token,filename)
# print(item)
# 通过财务网站验证发票真伪
verify_fp(item)