Python 利用OCR 识别图形验证码

利用的API 首先查看下接口文档

Python 利用OCR 识别图形验证码_第1张图片Python 利用OCR 识别图形验证码_第2张图片

 

一、首先是python2.7版本代码

#encoding=utf-8
import requests
import  time
import  string
import random
import base64
import hashlib
import  urllib
from urllib import urlencode
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)




CommonUrl="https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr"
app_id="填自己的"
AppKey="填自己的"
time_stamp=int(time.time())
nonce_str=''.join(random.sample(string.ascii_letters + string.digits, 15))


def MakeSign():
    Dict ={'app_id': app_id, 'time_stamp': time_stamp, 'nonce_str': nonce_str, 'image': ImageBase64()}
    T_str1 = ""
    for key in sorted(Dict.keys()):
        if key == 'app_key':
            continue
        T_str1 = T_str1 + "%s=%s&" % (key, urllib.quote(str(Dict[key]), safe=''))
    T_sgin = T_str1 + 'app_key=' + AppKey
    signraw=T_sgin.encode("utf-8")
    hash_md5 = hashlib.md5()
    hash_md5.update(signraw)
    sign=hash_md5.hexdigest().upper()
    return sign



def ImageBase64():
    imagebase64=None
    try:
        with open("C:\\Users\\Administrator\\Desktop\\xiejiangpeng.pn1g", "rb") as f:
            imagebase64 = base64.b64encode(f.read())
    except Exception as ex:
        print(ex)
        exit()
    return imagebase64




sign=MakeSign()#签名
image=ImageBase64()#图片


#调用OCR图片识别接口
TengXunAiCommonBody={'app_id':app_id,'time_stamp':time_stamp,'nonce_str':nonce_str,'sign':sign,'image':image}
TengXunAiCommon=requests.post(CommonUrl,TengXunAiCommonBody,verify=False)
try:
    temp=TengXunAiCommon.json()["data"]["item_list"][0]["itemstring"]#标志符。用于判断异常
    print("识别出来的文字如下:")
    for i in  range(0,len(TengXunAiCommon.json()["data"]["item_list"])):
        print(TengXunAiCommon.json()["data"]["item_list"][i]["itemstring"])
except Exception:
    print("程序异常.....")
    print(TengXunAiCommon.json()["msg"])

运行结果 :

图片信息

Python 利用OCR 识别图形验证码_第3张图片

接口抓包记录

Python 利用OCR 识别图形验证码_第4张图片

程序控制台输出:

Python 利用OCR 识别图形验证码_第5张图片

 

二、python3.6代码

相对于python2.7   此版本区别有以下几个点  

1.对字符串进行url编码的时候 

在 Python2.x 中的用法是:
urllib.quote(text)
Python3.x 中是

urllib.parse import urlencode
from urllib import parse

urllib.parse.quote(text)

2.python3.x对image进行base64编码之后 是byte的类型 需要decode转化成str 否则参加拼接字符串会多一个b' 导致签名错误

3.注意url编码后 只会将特殊符号的变成大写 比如B%27     其他的不需要变成大写字符串

4. 字节转化到str需要decode  而str到byte需要encode    在python3.6的时候 md5加密 如果输入str类型的会报错  只能填byte格式的   也就是需要encode()的原因  

5.另外可以直接对dict进行url编码 (默认情况下 就是对value进行url编码 符合此次的情况)使用Urlencode(Dict).encode()

urlencode(Dict).encode()首先urlencode 得到一个str  之后在encode转化成byte 从而进行md5加密  这种方式比较简单  而python2.7中 使用的是对单个str进行url编码  这里是对dict直接进行urlencode
#encoding=utf-8
import requests
import  time
import  string
import random
import base64
import hashlib

#这些是urlencode
from urllib.parse import urlencode
from urllib import parse

from requests.packages.urllib3.exceptions import InsecureRequestWarning
import  urllib
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)




CommonUrl="https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr"
app_id="填自己的"
AppKey="填自己的"
time_stamp=int(time.time())
nonce_str=''.join(random.sample(string.ascii_letters + string.digits, 15))
T_str1=""

def MakeSign():
    Dict={'app_id':app_id,'time_stamp':time_stamp,'nonce_str':nonce_str,'image':ImageBase64()}
    #global T_str1
    # for key in sorted(Dict.keys()):#其中sorted是按照key的升序进行循环
    #     if key == 'app_key':
    #         continue
    #     #累加除了app_key之外的键与值拼接成url 格式)
    #     T_str1 = T_str1+ "%s=%s&" % (key, urllib.parse.quote(str(Dict[key]), safe=''))
    # signStr=T_str1+'app_key'+"="+AppKey
    # signraw=signStr.encode("utf-8")
    # Md5 = hashlib.md5()
    # Md5.update(signraw)
    # sign = Md5.hexdigest().upper()
    # print(sign)
    """方法二 python3.x(imagebase64之后生成的是byte而不是str) 同时直接对dict进行url中value进行编码 """
    Dict = sorted(Dict.items(), key=lambda item: item[0], reverse=False)
    Dict.append(('app_key', AppKey))
    sha = hashlib.md5()
    rawtext = urlencode(Dict).encode("utf-8")
    sha.update(rawtext)
    sign = sha.hexdigest().upper()
    return sign

def ImageBase64():
    imagebase64=None
    try:
        with open("C:\\Users\\xjp\\Desktop\\xiejiangpeng.png", "rb") as f:
                imagebase64 = base64.b64encode(f.read()).decode("utf-8")#需要decode否则是byte的类型
    except Exception as ex:
        print(ex)
        exit()
    return imagebase64






sign=MakeSign()
image=ImageBase64()

TengXunAiCommonBody={'app_id':app_id,'time_stamp':time_stamp,'nonce_str':nonce_str,'sign':sign,'image':image}
TengXunAiCommon=requests.post(CommonUrl,TengXunAiCommonBody,verify=False)
try:
    temp=TengXunAiCommon.json()["data"]["item_list"][0]["itemstring"]#标志符。用于判断异常
    print("识别出来的文字如下:")
    for i in  range(0,len(TengXunAiCommon.json()["data"]["item_list"])):
        print(TengXunAiCommon.json()["data"]["item_list"][i]["itemstring"])
except Exception:
    print("程序异常.....")
    print(TengXunAiCommon.json()["msg"])

识别的图片和运行的结果如下

Python 利用OCR 识别图形验证码_第6张图片

 

 

Python 利用OCR 识别图形验证码_第7张图片

 

好了介绍了那么多,上面的只是如何创建接口,接下下面是我引用的一个小例子  识别图形验证码

思想如下

1.获取图形验证码接口,得到返回的Image,之后获取到图片的src地址

2.保存到本地

3.调用腾讯Api进行识别。

4.识别的结果 复制给一个参数,之后这个参数就是我们发送验证码的请求参数了

代码如下(python3.6)

#encoding=utf-8
import  requests
import  urllib
import  string
import random
import base64
import hashlib
import  time

#这些是urlencode
from urllib.parse import urlencode
from urllib import parse

from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

def GetCode(Address):
    print("正在调取APi开始识别图片验证码...")
    CommonUrl = "https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr"
    app_id = "填自己的"
    AppKey = "填自己的"
    time_stamp = int(time.time())
    nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 15))
    T_str1 = ""
    Code=""
    def MakeSign():
        Dict = {'app_id': app_id, 'time_stamp': time_stamp, 'nonce_str': nonce_str, 'image': ImageBase64()}
        """python3.x(imagebase64之后生成的是byte而不是str) 同时直接对dict进行url中value进行编码 """
        Dict = sorted(Dict.items(), key=lambda item: item[0], reverse=False)
        Dict.append(('app_key', AppKey))
        sha = hashlib.md5()
        rawtext = urlencode(Dict).encode("utf-8")
        sha.update(rawtext)
        sign = sha.hexdigest().upper()
        return sign

    def ImageBase64():
        imagebase64 = None
        try:
            with open(Address, "rb") as f:
                imagebase64 = base64.b64encode(f.read()).decode("utf-8")  # 需要decode否则是byte的类型
        except Exception as ex:
            print(ex)
            exit()
        return imagebase64

    sign = MakeSign()
    image = ImageBase64()

    TengXunAiCommonBody = {'app_id': app_id, 'time_stamp': time_stamp, 'nonce_str': nonce_str, 'sign': sign,
                           'image': image}
    TengXunAiCommon = requests.post(CommonUrl, TengXunAiCommonBody, verify=False)
    try:
        temp = TengXunAiCommon.json()["data"]["item_list"][0]["itemstring"]  # 标志符。用于判断异常
        for i in range(0, len(TengXunAiCommon.json()["data"]["item_list"])):
            Code=Code + TengXunAiCommon.json()["data"]["item_list"][i]["itemstring"]

        if(len(Code)!=4):
            print("图片模糊识别出错,程序已退出,保存后的图片地址为:",Address)
            exit()
        else:
            print("识别出来的验证码为:", Code)
            return Code


    except Exception as AA:
        print("程序异常.....")
        print(TengXunAiCommon.json()["msg"])
        print(AA)
        exit()



#config
host="https://xxxx.xxxx.com/"

#1.图形验证码更换接口
Cookie={'grwng_uid': '4b395a4c-cf01-4606-97e0-dc0ad02a7251', 'BS00002_gr_last_sent_cs1': 'BS00002-160', 'BS00002_gr_cs1': 'BS00002-160', 'gr_user_id': '354ca742-c823-4ec4-b449-25e30d6916c9', 'PHPSEGSUPER': '9r0ehinkshmto53hngm0flvp73'}
RGetUrl=requests.get(host+"wapv3/view/captcha?refresh=1",cookies=Cookie,verify=False)
ImageRoute=RGetUrl.json()["url"]
ImageSrc=host+ImageRoute#得到图片地址
#python3中使用方式如果是Python2则urllib.urlretrieve,如果同名默认会将源文件替换
urllib.request.urlretrieve(ImageSrc,'C:/Users/xjp/Desktop/xiejiangpeng.jpg')#将图片保存到本地
ImageCode=GetCode("C:/Users/xjp/Desktop/xiejiangpeng.jpg")#调用API识别验证码

 

好了最后我们得到的ImageCode也就是图形验证码值了,之后你就可以引用了

附带程序运行结果图一张

Python 利用OCR 识别图形验证码_第8张图片

你可能感兴趣的:(python,接口自动化)