算式验证码处理示例
要解决的是这种验证码.
解决方案就是,通过代码对验证码所在标签进行截图,然后对截图进行图像识别得到结果,然后将结果再填充到验证码栏就行了.
来个示例,网站可以参考:
示例中的图像识别,我采用的是云码这个平台,链接:https://www.jfbym.com/ ,你需要自己提前了解下这个平台.
python
# -*- coding = utf-8 -*-
import json
import time
import requests
import base64
from DrissionPage import ChromiumPage, ChromiumOptions
class YdmVerify(object):
# 不动
_custom_url = "http://api.jfbym.com/api/YmServer/customApi"
# 这个需要在云码的个人中心获取你自己的token
_token = "你自己的token"
# 不动
_headers = {
'Content-Type': 'application/json'
}
def common_verify(self, image, verify_type="50100"):
"""
:param image: bytes类型的图片内容
:param verify_type: 验证码类型,根据云码平台规则,算式类型的图片识别就是50100
:return: 将识别结果返回
"""
payload = {
"image": base64.b64encode(image).decode(),
"token": self._token,
"type": verify_type
}
# print(payload)
resp = requests.post(self._custom_url, headers=self._headers, data=json.dumps(payload))
# print(resp.text)
return resp.json()['data']['data']
def get_img(self):
""" 获取本地图片 """
return open('code.jpg', 'rb').read()
class Main(object):
def __init__(self, name, pwd):
self.url = 'https://zhxx.chinamine-safety.gov.cn/mj/a/login#'
self.name = name
self.pwd = pwd
self.token = ''
self.ydm = YdmVerify()
self.page = ChromiumPage()
def sleep(self, n=1):
time.sleep(n)
def get_img_bytes(self):
# 拿到图片标签然后截图,然后返回bytes类型的结果
return self.page.ele('xpath:/html/body/div[1]/div[2]/div[2]/div[2]/form[1]/ul/li[3]/div/img').get_screenshot(
name='code.jpg',
as_bytes=True
)
def send_key(self, ele, key):
self.page.ele(ele).input(key)
def main(self):
# 加载页面
self.page.get(self.url)
self.sleep()
# 输入用户名和密码
self.send_key('xpath:/html/body/div[1]/div[2]/div[2]/div[2]/form[1]/ul/li[1]/input', self.name)
self.send_key('xpath:/html/body/div[1]/div[2]/div[2]/div[2]/form[1]/ul/li[2]/div/input[1]', self.pwd)
# 进行图片识别处理
img_bytes = self.get_img_bytes()
# print(img_bytes)
result = self.ydm.common_verify(img_bytes)
self.send_key('xpath:/html/body/div[1]/div[2]/div[2]/div[2]/form[1]/ul/li[3]/input', result)
# 点击登录按钮
self.sleep()
self.page.ele('xpath:/html/body/div[1]/div[2]/div[2]/div[2]/form[1]/span[1]').click()
if __name__ == '__main__':
main = Main('我没有账号', '更没有密码')
main.main()