1、背景

a、搜狗也发布了自己的人工智能 api,包括身份证ocr、名片ocr、文本翻译等API,初试感觉准确率一般般。

b、基于python3。

c、也有自己的签名生成这块,有了鹅厂的底子,相对写起来比较简单。

d、不过Sougou明显在接口标准化这块明显不如鹅厂,不同api应答包的主体结构竟然不一致,所以实施也只做了简单的结构化……

2、实现代码

直接放代码吧,github上也有: https://github.com/jdstkxx/PySougouAI ……

1、sogouai-example.py

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

'''
create by : joshua zou
create date : 2018.4.9
Purpose: check sougou ai api
''' import glob,os
from SougouAPIMsg import * #改成你自己搜狗AI的APPID、APPKEY、SecretKey
AppID = ''
ApiKey = '*********'
SecretKey= '0PLvS-AHShmq**************' if __name__ == "__main__":
sg = SougouAPIMsg(AppID,ApiKey,SecretKey)
for file in glob.glob('D:\python\*.jpg'):
filename=os.path.split(file)[1].split('.')[0]
#调用ocr识别
apiname = 'ocr'
rest =sg.apiSougouOcr(apiname,file)
#调用身份证识别
#rest =sg.apiSougouOcr('idcard',file) js= rest.json()
retext =""
if apiname=='ocr':
#文字识别,rest应答包,字符串
#成功 {"result":[{"content":"01245177\n","frame":["0,0","207,0","207,59","0,59"]}],"success":1}
#失败 {"success":0}
if js['success']==1 :
retext = js['result'][0]['content'].strip()
elif apiname == 'idcard':
#身份证识别应答包,逼死强迫症啊,请求结构,应答结构都不一样
'''
{
"result": {
"住址": "xxxxxx",
"公民身份号码": "11001xxx30",
"出生": "19900101",
"姓名": "xxXX",
"性别": "X",
"民族": "xxx"
},
"status": 0,
"statusText": "Success"
}
'''
if js['status']==0 :
retext = js['result']['公民身份号码'].strip()
print(filename,retext)

2、SougouAPI.py

# -*- coding: utf-8 -*-
# 搜狗API字典 SougouAPI={
#基本文本分析API
"ocr": {
'APINAME':'图像识别', #API中文简称
'APIDESC': '识别图像中的文字', #API描述
'APIURL': 'http://api.ai.sogou.com/pub/ocr' #API请求URL
},
"idcard":{
'APINAME':'身份证识别', #API中文简称
'APIDESC': '身份证识别', #API描述
'APIURL': 'http://api.ai.sogou.com/pub/ocr/idcard' #API请求URL
}, }

3、SougouAPIMsg.py

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

'''
create by : joshua zou
create date : 2018.4.9
Purpose: check sougou ai api
''' import requests
import base64
import hashlib
import hmac
import time
from urllib import parse
import json
from SougouAPI import * class SougouAPIMsg(object):
def __init__(self,AppID=None,ApiKey=None,SecretKey=None):
if not AppID: AppID = ''
if not ApiKey: ApiKey = '5ADwS88888888Dtr6QG2'
if not SecretKey: SecretKey= '0PLvS-AH8888888889n6NF6fVVTt7m'
self.__app_id= AppID
self.__app_key= ApiKey
self.__app_secret= SecretKey def get_time_stamp(self):
return str(int(time.time())) '''
1、应用相关前缀 {AuthPrefix}
{AuthPrefix}=sac-auth-v1/{accessKey}/{secondsSinceEpoch}/{expirationPeriodInSeconds}
2、请求相关数据 {Data}
{Data}={REQUEST_METHOD} + "\n" + {HOST} + "\n" + {URI} + "\n" + {SORTED_QUERY_STRING}
其中,REQUEST_METHOD 为请求使用的 HTTP 方法, 如: GET|POST|PUT|DELETE
HOST 为服务使用的域名, 如: api.ai.sogou.com
URI 为请求的服务路径, 如: /speech/asr
SORTED_QUERY_STRING 把 URL 中的 Query String(即 URL 中 “?” 后面的 “k1=v1&k2=v2” 字符串)进行编码后的结果。
编码方法为:
将 Query String 根据 & 拆开成若干项,对每一项转换为 UriEncode(key) + "=" + UriEncode(value) 的形式, 其中 value 可以是空字符串
将上面转换后的所有字符串按照字典顺序排序。
将排序后的字符串按顺序用 & 符号链接起来。
3、生成签名 {Signature}
{Signature}=HMAC-SHA256-BASE64({secretKey}, {AuthPrefix} + "\n" + {Data})
4、生成认证信息, 通过 Authorization header 传递
Authorization: {AuthPrefix}/{Signature}
Example:
1\应用 accessKey/secretKey 分别为 bTkALtTB9x6GAxmFi9wetAGH / PMROwlieALT36qfdGClVz2iH4Sv8xZxe
POST 方式访问 http://api.ai.sogou.com/speech/asr 接口
GET 参数为 type=gbk&idx=1&starttime=1491810516
当前系统时间为 1491810516
2\计算过程
{AuthPrefix}="sac-auth-v1/bTkALtTB9x6GAxmFi9wetAGH/1491810516/3600"
{Data}="POST\napi.ai.sogou.com\n/speech/asr\nidx=1&starttime=1491810516&type=gbk"
{Signature}=HMAC-SHA256-BASE64("PMROwlieALT36qfdGClVz2iH4Sv8xZxe", {AuthPrefix} + "\n" + {Data})="vuVEkzcnUeFv8FxeWS50c7S0HaYH1QKgtIV5xrxDY/s="
3\最终生成的 header 为
Authorization: sac-auth-v1/bTkALtTB9x6GAxmFi9wetAGH/1491810516/3600/vuVEkzcnUeFv8FxeWS50c7S0HaYH1QKgtIV5xrxDY/s=
'''
def get_auth_sign_str(self,url,method):
res= parse.urlparse(url)
host= res.netloc
uri = res.path
query= res.query #1生成前置字符串
authprefix= 'sac-auth-v1/%s/%s/%s' %(self.__app_key,self.get_time_stamp(),3600)
#2生成data
query=dict( (k, v if len(v)>1 else v[0] )
for k, v in parse.parse_qs(res.query).items() )
sort_dict= sorted(query.items(), key=lambda item:item[0], reverse = False)
sortquerystr= parse.urlencode(sort_dict)
data= '%s\n%s\n%s\n%s' %(method,host,uri,sortquerystr)
#3生成signstr
signstr ='%s\n%s' %(authprefix,data)
#调用hamc.sha256
shastr =hmac.new(self.__app_secret.encode(), signstr.encode(), digestmod=hashlib.sha256).digest()
#base64编码,还原成字符串
signature = base64.b64encode(shastr).decode() #4组合成最终的授权码
authstr= '%s/%s' %(authprefix,signature)
return authstr '''
$file = "OCR-test03.jpg";
$url = "http://api.ai.sogou.com/pub/ocr"; $hdr = array(
"Content-Type: multipart/form-data",
"Authorization: ".sign($ak, $sk, $url, "POST")
); // cURL headers for file uploading $postfields = array(
"pic" => curl_file_create($file,'image/jpeg','a_b_c.jpg'),
); $ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => false,
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => $hdr,
CURLOPT_POSTFIELDS => $postfields,
CURLOPT_RETURNTRANSFER => true
);
'''
def apiSougouOcr(self,apiname,picfilename):
url = SougouAPI[apiname]['APIURL']
name = SougouAPI[apiname]['APINAME']
desc= SougouAPI[apiname]['APIDESC'] authstr=self.get_auth_sign_str(url, method='POST')
header={ "Authorization": authstr } picfile= {'pic':open(picfilename,'rb')} resp = requests.post(url,headers=header,files=picfile)
#print (resp.text)

-- 以上--

python3下搜狗AI API实现的更多相关文章

  1. Python3 下实现 Tencent AI 调用

    1.背景 a.鹅厂近期发布了自己的AI api,包括身份证ocr.名片ocr.文本分析等一堆API,因为前期项目用到图形OCR,遂实现试用了一下,发现准确率还不错,放出来给大家共享一下. b.基于py ...

  2. Python3 下实现 腾讯人工智能API 调用

    1.背景 a.鹅厂近期发布了自己的人工智能 api,包括身份证ocr.名片ocr.文本分析等一堆API,因为前期项目用到图形OCR,遂实现试用了一下,发现准确率还不错,放出来给大家共享一下. b.基于 ...

  3. flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台(总结感悟篇)

    前言: 在前进中去发现自己的不足,在学习中去丰富自己的能力,在放弃时想想自己最初的目的,在困难面前想想怎么踏过去.在不断成长中去磨炼自己. 正文: 时间轴 flask + Python3 实现的的AP ...

  4. Python3调用Hadoop的API

    前言: 上一篇文章 我学习使用pandas进行简单的数据分析,但是各位...... Pandas处理.分析不了TB级别数据的大数据,于是再看看Hadoop. 另附上人心不足蛇吞象 对故事一的感悟:   ...

  5. python3下安装aiohttp遇到过的那些坑

    python3下安装aiohttp遇到过的那些坑 最近需要用到aiohttp这个库,在安装过程中遇到很多坑.google.baidu后,依然没有找到合适的解决方案. 后来通过去python官方的PyP ...

  6. Python3下map函数的显示问题

    map函数是Python里面比较重要的函数,设计灵感来自于函数式编程.Python官方文档中是这样解释map函数的: map(function, iterable, ...) Return an it ...

  7. 汇编Ring 3下实现 HOOK API

    [文章标题]汇编ring3下实现HOOK API [文章作者]nohacks(非安全,hacker0058) [作者主页]hacker0058.ys168.com [文章出处]看雪论坛(bbs.ped ...

  8. 论python3下“多态”与“继承”中坑

    1.背景: 近日切换到python3后,发现python3在多态处理上,有一些比较有意思的情况,特别记载,供大家参考... 以廖老师的python3教程中的animal 和dog的继承一节的代码做例子 ...

  9. python3下调用系统massagebox对话框

    #python3下调用系统massagebox对话框#先安装pwin32插件https://github.com/mhammond/pywin32/releases import win32apiim ...

随机推荐

  1. 【Unity3D与23种设计模式】模板方法模式(Template Method)

    GoF中定义: "在一个操作方法中定义算法的流程,其中某些步骤由子类完成. 模板方法模式让子类在不变更原有算法流程的情况下,还能够重新定义其中的步骤" 每一次武器攻击目标时,都要按 ...

  2. 使用Angular CLI从蓝本生成代码

    第一篇文章是: "使用angular cli生成angular5项目" : http://www.cnblogs.com/cgzl/p/8594571.html 这篇文章主要是讲生 ...

  3. 基于docer搭建私有gitlab服务器

    今天闲着无聊,于是乎想用最近很流行的docker容器搭建一个自己的gitlab的服务器,关于docker和gitlab就不多介绍了,网上查了很多资料,貌似没有一个统一的方法,很乱很杂,而且很容易误导人 ...

  4. Harris Corner

    Harris Corner网上已经有很多的资料了,但它也是我读研究生后读的第一篇论文,对我有一种特别的意义. 这篇文章我想从几个方面来讲解Harris Corner,一是Harris Corner的思 ...

  5. javascript里的循环语句

    前序:我一直对于for跟for..in存在一种误解,我觉得for都能把事情都做了,为啥还要for...in...这玩意了,有啥用,所以今天就说说JavaScript里的循环语句. 循环 要计算1+2+ ...

  6. [poj3984]迷宫问题_bfs

    迷宫问题 题目大意:给你一个5*5的矩阵,求左上角到左下角的最短路径. 注释:0或1的矩阵,1表示不能走,0表示能走,保证有唯一最短路径. 想法:bfs爆搜练习题.通过其实点,定义方向数组,然后进行b ...

  7. python 函数基础 定义

    一.函数介绍 1.为什么要有函数? 没有函数的代码组织结构不清晰,可读性差. 代码冗余 管理维护难度大,扩展性 2.什么是函数? 具备某一个功能的工具就是程序中的函数. 事先准备工具的过程就是:函数的 ...

  8. 移动端H5地图矢量SHP网格切分打包方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 与离线瓦片方案一样,同样是为了解决移动端网速和流量问题,但是却 ...

  9. Hibernate学习(4)- Hibernate对象的生命周期

    1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联:2.持久化状态(Pa ...

  10. Beta版本展示博客

    1 团队介绍 团队组成: 齐爽爽(258)个人博客:http://www.cnblogs.com/shuangshuangblog/ 马帅(248)个人博客:http://www.cnblogs.co ...