ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

验证码的识别

2022-07-01 09:33:54  阅读:214  来源: 互联网

标签:resp verify image 验证码 headers 识别 type self


验证码的识别

验证码和爬虫之间的爱恨情仇?
反爬机制:验证码.识别验证码图片中的数据,用于模拟登陆操作。

识别验证码的操作:

  • 人工肉眼识别。(不推荐)

  • 第三方自动识别(推荐)

  • 可以使用机器学习算法或者gitee上的一些开源项目进行识别,但是效果比较单一。

1.云打码的使用

说明:云打码平台多种多样,不一定局限与某一个。本次使用的云打码平台请点击详情查看;

相关 Python 文档如下图。

平台已经转换好了相关的base64转换等工作,只需将图片的路径传入下面的运行部分即可。

import json
import requests
import base64


class YdmVerify(object):
    _nom_url = "https://www.jfbym.com/api/YmServer/verifyapi"
    _fun_url = "https://www.jfbym.com/api/YmServer/funnelapi"

    _token = "" //填用户中心秘钥
    _headers = {
        'Content-Type': 'application/json'
    }

    def common_verify(self, image_content, verify_type="10101"):
        # 英文数字,中文汉字,纯英文,纯数字,任意特殊字符
        # 请保证购买相应服务后请求对应 verify_type
        # verify_type="10101" 单次积分
        print(base64.b64encode(image_content).decode())
        payload = {
            "image": base64.b64encode(image_content).decode(),
            "token": self._token,
            "type": verify_type
        }
        resp = requests.post(self._nom_url, headers=self._headers, data=json.dumps(payload))
        print(resp.text)
        return resp.json()['data']['data']

    def slide_verify(self, slide_image, background_image, verify_type="20101"):
         # 通用滑块
        # 请保证购买相应服务后请求对应 verify_type
        # verify_type="20101" 单次积分
        # slide_image 需要识别图片的小图片的base64字符串
        # background_image 需要识别图片的背景图片的base64字符串(背景图需还原)
        payload = {
            "slide_image": base64.b64encode(slide_image).decode(),
            "background_image": base64.b64encode(background_image).decode(),
            "token": self._token,
            "type": verify_type
        }
        resp = requests.post(self._nom_url, headers=self._headers, data=json.dumps(payload))
        print(resp.text)
        return resp.json()['data']['data']

    def click_verify(self, image, extra=None, verify_type=30001):
        # 点选,点选+额外参数
        # 请保证购买相应服务后请求对应 verify_type
        # verify_type="30001" 单次积分 点选
        # verify_type="30002" 单次积分 点选+需要按某种语义点选

        # 注意:
        # 例如 :extra="请_点击_与小体积黄色物品有相同形状的大号物体。"
        # 例如 :extra="请点击正向的大写V。"
        # 例如 请依次点击 "鹤" "独" "剩" 这种 转换成:extra="鹤,独,剩"
        # 例如 拖动交换2个图块复原图片 这种 转换成:extra="拖动交换2个图块复原图片"
        # 如有其他未知类型,请联系我们

        payload = {
            "image": base64.b64encode(image).decode(),
            "token": self._token,
            "type": verify_type
        }
        print(base64.b64encode(image).decode())
        if extra:
            payload['extra'] = extra
            payload['type'] = str(int(payload['type'])+1)
        resp = requests.post(self._nom_url, headers=self._headers, data=json.dumps(payload))
        print(resp.text)
        return resp.json()['data']['data']


    def hcaptcha_verify(self, site_key, site_url, verify_type="50001"):
        # Hcaptcha
        # 请保证购买相应服务后请求对应 verify_type
        # verify_type="50001"
        payload = {
            "site_key": site_key,
            "site_url": site_url,
            "token": self._token,
            "type": verify_type
        }
        resp = requests.post(self._fun_url, headers=self._headers, data=json.dumps(payload))
        print(resp.text)
        return resp.json()['data']['data']


if __name__ == '__main__':
    Y = YdmVerify()
    with open("../1.png", 'rb') as f:
        img_content = f.read()
    Y.common_verify(img_content)               

2.古诗文网的验证码识别

# -*- coding: utf-8 -*-

import requests
from lxml import etree
from code_result import YdmVerify


url = "https://so.gushiwen.cn/user/login.aspx"
# UA 伪装
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
# 请求界面
response = requests.get(url=url,headers=headers).text
tree = etree.HTML(response) # 实例化xpath解析对象

# 使用XPath 表达式进行数据解析,获取相关的数据
img_code = "https://so.gushiwen.cn"+tree.xpath('//*[@id="imgCode"]/@src')[0]
# 请求图片保存到本地(二进制)
image_byte = requests.get(url=img_code,headers=headers).content
# 写入文件
with open('code.png','wb') as fp:
    fp.write(image_byte)
# 使用打码平台进行打码
Y = YdmVerify()
with open("code.png", 'rb') as f:
    img_content = f.read()
resp = Y.common_verify(img_content)
print(resp)

image-20220701091244877

其他类型的验证码可以参考平台对应的打码接口。

image-20220701091410914

标签:resp,verify,image,验证码,headers,识别,type,self
来源: https://www.cnblogs.com/Blogwj123/p/16433387.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有