Skip to content

算式验证码处理示例

要解决的是这种验证码.

1832670616092672000.png

解决方案就是,通过代码对验证码所在标签进行截图,然后对截图进行图像识别得到结果,然后将结果再填充到验证码栏就行了.

来个示例,网站可以参考:

示例中的图像识别,我采用的是云码这个平台,链接: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()