python3下实现搜狗AI API的代码示例


Posted in Python onApril 10, 2018

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 = '0000'
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 = '88888'
    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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python导出DBF文件到Excel的方法
Jul 25 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
对Python中的@classmethod用法详解
Apr 21 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
详解python做UI界面的方法
Feb 27 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
Python 爬虫的原理
Jul 30 Python
Python学习之os包使用教程详解
Mar 21 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 #Python
浅谈Pandas中map, applymap and apply的区别
Apr 10 #Python
对pandas中apply函数的用法详解
Apr 10 #Python
Python 25行代码实现的RSA算法详解
Apr 10 #Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 #Python
Python基于socket模块实现UDP通信功能示例
Apr 10 #Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 #Python
You might like
php第一次无法获取cookie问题处理
2014/12/15 PHP
简单谈谈favicon
2015/06/10 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
Yii全局函数用法示例
2017/01/22 PHP
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
Javascript验证方法大全
2015/09/21 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
express express-session的使用小结
2018/12/12 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
python批量赋值操作实例
2018/10/22 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
解决python 找不到module的问题
2020/02/12 Python
python识别验证码图片实例详解
2020/02/17 Python
python如何运行js语句
2020/09/09 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
会计与审计毕业生自荐信范文
2013/12/30 职场文书
单位授权委托书范文
2014/08/02 职场文书
暑期培训班招生方案
2014/08/26 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
英语导游词
2015/02/13 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书