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中的floor()方法
May 15 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
Python微信库:itchat的用法详解
Aug 14 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
浅谈Python 递归算法指归
Aug 22 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
calendar在python3时间中常用函数举例详解
Nov 18 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 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
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
PHP中list方法用法示例
2016/12/01 PHP
js 分栏效果实现代码
2009/08/29 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
用js编写留言板
2020/03/17 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
python绘制汉诺塔
2021/03/01 Python
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
2014年基层党组织公开承诺书
2014/03/29 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
超市工作总结范文2014
2014/12/19 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL