Android 腾讯AI 鉴权+闲聊功能实现
闲聊接口文档 : https://ai.qq.com/doc/nlpchat.shtml
鉴权接口文档 : https://ai.qq.com/doc/auth.shtml
步骤 :
-
通过闲聊接口参数鉴权获取签名(sign)
-
调用闲聊接口
鉴权 :
....具体看官方文档
现在埋坑
1. 将<key, value>请求参数对按key进行字典升序排序,得到有序的参数对列表N
先组合参数,然后按照字典顺序排序key
Map<String, Object> params = new HashMap<>();
int APP_ID = 2111114017;
params.put("app_id", APP_ID);
params.put("time_stamp", currTime);
params.put("nonce_str", randomStr);
params.put("session", randomSession);
params.put("question", ques);
Map<String, Object> resultMap = sortMapByKey(params);
/**
* 使用 Map按key进行排序
*
* @param map x
* @return x
*/
public Map<String, Object> sortMapByKey(Map<String, Object> map) {
if (map == null || map.isEmpty()) {
return null;
}
Map<String, Object> sortMap = new TreeMap<>(
new MapKeyComparator());
sortMap.putAll(map);
return sortMap;
}
2和3其实是一个操作,就是拼接URL
2. 列表N中的参数对按URL键值对的格式拼接成字符串,得到字符串T(如:key1=value1&key2=value2),
3. 将应用**以app_key为键名,组成URL键值拼接到字符串T末尾,得到字符串S(如:key1=value1&key2=value2&app_key=**)
Set<String> keySet = resultMap.keySet();
StringBuilder sb = new StringBuilder();
for (String key : keySet) {
Object value = resultMap.get(key);
sb.append("&").append(key).append("=").append(URLEncoder.encode(value + "", "UTF-8"));
}
sb.deleteCharAt(0);
String APP_KEY = "A2m9UfqFv30JnM2W";
sb.append("&app_key=").append(APP_KEY);
LogUtils.iTag("RedWolf md5运算之前", sb);
4. MD5运算
String md5Sign = EncryptUtils.encryptMD5ToString(sb.toString());
最后拿所有的参数做一个HTTPS请求就罢了
OkGo.<String>get(URL)
.tag(this)
.params("app_id", APP_ID)
.params("nonce_str", randomStr)
.params("question", ques)
.params("session", randomSession)
.params("time_stamp", currTime)
.params("sign", md5Sign)
.execute(new StringCallback() {
@Override
public void onSuccess(final Response<String> response) {
LogUtils.iTag("RedWolfR", response.body());
runOnUiThread(new Runnable() {
@Override
public void run() {
FUCK fuck = new Gson().fromJson(response.body(), FUCK.class);
mTv.append("ans : " + fuck.getData().getAnswer());
mTv.append("session : " + fuck.getData().getSession() + "\n");
}
});
}
@Override
public void onError(Response<String> response) {
super.onError(response);
LogUtils.iTag("RedWolfR", response.body());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
源代码地址 : https://github.com/RedWolfChao/QQAIDemo