1.接口调用通用形式

相关网址:https://ai.qq.com/doc/auth.shtml

如腾讯Ai给出的示例,其中app_id, time_stamp, nonce_str, sign为发起对腾讯Ai各种Api都需要加入到post请求的数据。而key1,key2则根据不同Api会有不同。如下面的OCR通用文字识别Api


图中唯一不同于示例的是把key1,key2换成了image,即待识别图片的base64编码数据。
实际上也是如此,对待不同的Api请求,只需要修改key1,key2成对应的键值对即可。

2.各字段数据生成

app_id

app_id为应用标识,到腾讯Ai平台申请项目就会得到app_id,和app_key。app_key在后续的鉴权生成时会用到。
申请项目获得密钥的接入文档https://ai.qq.com/doc/index.shtml

time_stamp

秒级时间戳
实际上就可以使用系统时间(毫秒)/1000得到需要的值。如:

String time_stamp = System.currentTimeMillis() / 1000 + "";
nonce_str

随机字符串

public static String getRandomString(int length) {String base = "abcdefghijklmnopqrstuvwxyz0123456789";     Random random = new Random();     StringBuffer sb = new StringBuffer();     for (int i = 0; i < length; i++) {     int number = random.nextInt(base.length());     sb.append(base.charAt(number));     }     return sb.toString();     }

利用随机数字去生成即可。

image的base64编码生成

base64的编码工具类在网上到处都能找得到,这里就不贴算法了,比较长
这个部分的流程主要是将图片以字节数据读入,然后再进行base64编码

byte[] imageData = FileUtil.readFileByBytes(file);
String img64 = Base64Util.encode(imageData);
sign

先看腾讯给出的说明文档:

1.字典升序排序而且还是键值对,可以想到使用java中的TreeMap去处理存储这些数据最为合适
具体签名部分代码如下:

private String generateAppSign() throws UnsupportedEncodingException {Set<String> keySet = mParams.keySet();StringBuilder sb = new StringBuilder();Iterator<String> iterator = keySet.iterator();while (iterator.hasNext()) {String key = iterator.next();String value = mParams.get(key);sb.append("&").append(key).append("=").append(URLEncoder.encode(value, "UTF-8"));}sb.deleteCharAt(0);sb.append("&app_key=").append(TencentAIConstants.APP_KEY_AI);String sign = MD5.getMD5(sb.toString());return sign;
}

代码中的mParams参数就是一个TreeMap对象,存储着除sign之外的其他键值对,利用这些键值对计算生成sign字段。

3.发起请求

发起请求这里使用okhttp,不使用HttpClient原因是安卓现在不支持使用HttpClient了,使用okhttp使用范围更广一点而且也很方便实现。主要代码:

MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);Iterator<String> iterator = mParams.keySet().iterator();while (iterator.hasNext()) {String key = iterator.next();String value = mParams.get(key);builder.addFormDataPart(key, value);}RequestBody requestBody = builder.build();Request request = new Request.Builder().header("Content-Type", "application/x-www-form-urlencoded").url(url).post(requestBody).build();OkHttpClient okHttpClient = new OkHttpClient();Response response = okHttpClient.newCall(request).execute();if (!response.isSuccessful()){return ERROR;}return response.body().string();

4.使用Builder模式写一个发起请求的类

对于这种部分参数一致,部分参数不同,且逻辑一致的需求使用Builder模式很合适。将上述列出的代码使用builder模式写一个通用的类用于各类请求再合适不过了。代码如下:

public class AiRequestBean {public static final String ERROR = "error";private TreeMap<String, String> mParams;private AiRequestBean() {mParams = new TreeMap<>();//时间戳String time_stamp = System.currentTimeMillis() / 1000 + "";//随机字符串String nonce_str = TencentAIParamsHelper.getRandomString(10);//appIdString app_id = String.valueOf(TencentAIConstants.APP_ID_AI);//将通用参数设置进map中mParams.put("app_id", app_id);mParams.put("nonce_str", nonce_str);mParams.put("time_stamp", time_stamp);}/*** TreeMap生成鉴权信息*/private String generateAppSign() throws UnsupportedEncodingException {Set<String> keySet = mParams.keySet();StringBuilder sb = new StringBuilder();Iterator<String> iterator = keySet.iterator();while (iterator.hasNext()) {String key = iterator.next();String value = mParams.get(key);sb.append("&").append(key).append("=").append(URLEncoder.encode(value, "UTF-8"));}sb.deleteCharAt(0);sb.append("&app_key=").append(TencentAIConstants.APP_KEY_AI);String sign = MD5.getMD5(sb.toString());return sign;}//发起请求public String request(String url) throws IOException {//生成签名加入到参数列表中String sign = generateAppSign();mParams.put("sign", sign);//使用okhttp发起请求MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);Iterator<String> iterator = mParams.keySet().iterator();while (iterator.hasNext()) {String key = iterator.next();String value = mParams.get(key);builder.addFormDataPart(key, value);}RequestBody requestBody = builder.build();Request request = new Request.Builder().header("Content-Type", "application/x-www-form-urlencoded").url(url).post(requestBody).build();OkHttpClient okHttpClient = new OkHttpClient();Response response = okHttpClient.newCall(request).execute();if (!response.isSuccessful()){return ERROR;}return response.body().string();}public static class Builder {private AiRequestBean targetBean;public Builder() {targetBean = new AiRequestBean();}public AiRequestBean build() {return targetBean;}public Builder addParam(String key, String value) {targetBean.mParams.put(key, value);return this;}}
}

使用方法也很简单,比如以通用ocr为例,通用ocr文字识别中不同的参数为image,对应的Api为”https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr”

    public static final String URL4GENERALOCR  = "https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr";
//通用ocr文字识别请求public String getGeneralOcrResult(File file) throws Exception {byte[] imageData = FileUtil.readFileByBytes(file);//准备好图片base64数据String img64 = Base64Util.encode(imageData);String jsonResult = new AiRequestBean.Builder().addParam("image", img64).build().request(TencentAIConstants.URL4GENERALOCR);return jsonResult;}

可以看到还是很方便使用的。

Demo代码链接:http://download.csdn.net/download/breeze048/10267182

腾讯Ai开放服务接入相关推荐

  1. 腾讯AI开放平台使用尝试:代理后的文本翻译API使用方式

    这篇文章介绍一下如何结合代理服务器使用腾讯AI开放平台提供的文本翻译API. 目录 事前准备 请求参数 返回格式 示例代码 使用示例 常见问题 结果确认 总结 参考内容 事前准备 实现需要申请申请账号 ...

  2. 腾讯AI开放平台的接口调用指南

    最近无意发现腾讯AI开放平台上提供了大量好玩的人工智能云服务,而且是完全免费的.只需要用QQ号登录即可.这么好的东西,作为一个程序员,当然要试试了! 从上图可以看出腾讯AI开放平台提供的人工智能服务主 ...

  3. 腾讯AI开放平台使用尝试:账号开通/应用创建/能力开通

    这篇文章记录一下使用腾讯AI开放平台的使用:如何进行账号开通.应用创建和能力开通. 目录 文档中心地址 注册成为开发者 步骤1:点击控制台 步骤2: 通过QQ账号关联 创建应用并开通能力 步骤1: 创 ...

  4. php图像识别api,使用腾讯AI开放平台api进行图片OCR文字识别

    重要:本文最后更新于2019-05-20 08:46:46,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗. 其实图片的文字识别其实还算简单,一般是根据特定字体制作出字码文件,然后分割 ...

  5. python3调用腾讯AI开放平台

    CSDN上偶遇一文说明如何调用腾讯AI开放平台API,因为喜欢python3,所以用python3实现了下. 用qq登录获取自己的id和key. 参考点击打开链接. 首先获取请求参数.新建了个文件md ...

  6. 腾讯ai开放平台 手册_创建手册以实现大规模开放

    腾讯ai开放平台 手册 "是的,但是你实际上是怎么做到的呢?" 在Opensource.com以及无数的会议和研讨会上,这是我们社区领域最常见的问题. 人们倾向于理解为什么在工作场 ...

  7. 腾讯AI开放平台的使用

    一.腾讯AI开放平台 https://ai.qq.com/ 二.腾讯AI平台支持的功能 三.签名机制 1.计算步骤 用于计算签名的参数在不同接口之间会有差异,但算法过程固定如下4个步骤.1.将< ...

  8. 腾讯开发平台php,腾讯AI开放平台 Tencent AI open platform

    腾讯AI开放平台 SDK Tencent AI open platform sdk Special thanks to the generous sponsorship by: Requirement ...

  9. 腾讯AI开放平台 SDK

    腾讯AI开放平台 SDK Tencent AI open platform sdk Special thanks to the generous sponsorship by: Requirement ...

最新文章

  1. Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python
  2. 《Abaqus GUI程序开发指南(Python语言)》——第一章 概述1.1 简单插件实例——创建带孔板有限元模型...
  3. 和虫师一起学python(7)
  4. SAP Fiori 应用无法根据contact搜索的原因分析
  5. Maven for Eclipse 第二章 ——安装 m2eclipse插件
  6. 安卓应用安全指南 4.6.2 处理文件 规则书
  7. 《Python程序设计基础》在亚马逊当当京东互动出版网淘宝等各大书店上架
  8. 【Mysql】利用Mybatis3连接mysql获取datetime类型数据错误
  9. R 包 `ezdf`的讲解
  10. 点击按钮返回上一个页面_零基础跟老陈一起学WordPress 《第四课》用WP半小时建一个商业网站...
  11. 十一、Oracle学习笔记:高级关联查询
  12. 有哪些好用且免费的安全测试工具?
  13. 【随手写】BAT脚本之获取N天前日期
  14. antony.net
  15. 系统安装部署系列教程(三):VHD方式安装系统
  16. 高德地图教程_poi搜索以及显示
  17. 荒岛新生_荒岛Excel文件
  18. 文件和文件夹操作——文件操作实列
  19. DeepFM理论与实践
  20. 知识付费直播间即时通讯

热门文章

  1. linux RAID卡检查命令,raid卡的常用命令
  2. table-call布局
  3. 企业数字治理软件如何帮助审计委员会?
  4. 【夜晚安静的享受】只想安静下来
  5. C# 项目的 nullable 检查
  6. 快手上市,投资人张斐说:多数人惊叹算法威力,少数人理解网络结构
  7. android12微信抓包https
  8. 两个相同放大镜叠加焦距计算
  9. cx-Freeze安装
  10. cx_Freeze 打包 PRNet 为exe