小萌伴最初版本只是一個機器人陪聊軟件搜吧,所以其最初的核心功能就是聊天機器人,這一功能做得很早杨凑,代碼也寫得很簡單滤奈。
聊天機器人用的是第三方Api,最初是聚合數(shù)據(jù)撩满,剛開始免費無限次數(shù)調(diào)用蜒程,半年后收費開了一年鉆石會員繼續(xù)無限次數(shù)調(diào)用,用了一年伺帘,會員價翻了幾倍昭躺;因為聚合數(shù)據(jù)居然用的是圖靈機器人,所以用了圖靈機器人的sdk伪嫁,再后來因為調(diào)用限制太低(5000降為了100次/天)领炫;于是又用到showApi和haoService,并且開了多個號张咳,加起來夠幾萬次調(diào)用帝洪,能夠滿足了幾千用戶的正常使用。
以下分別是聚合脚猾、showApi和haoService的接口調(diào)用代碼:
/**
* 聚合數(shù)據(jù)葱峡,聊天機器人數(shù)據(jù)接口
*/
public void robotAsk(NetCallback callback, String info, String userid) {
String url = "http://op.juhe.cn/robot/index";// 請求接口地址
Map params = new HashMap();// 請求參數(shù)
params.put("key", APPKEY_ROBOT_JUHE);// 您申請到的本接口專用的APPKEY
params.put("info", info);// 要發(fā)送給機器人的內(nèi)容,不要超過30個字符
params.put("dtype", "json");// 返回的數(shù)據(jù)的格式婚陪,json或xml族沃,默認為json
params.put("loc", "");// 地點,如北京中關(guān)村
params.put("lon", "");// 經(jīng)度泌参,東經(jīng)116.234632(小數(shù)點后保留6位)脆淹,需要寫為116234632
params.put("lat", "");// 緯度,北緯40.234632(小數(shù)點后保留6位)沽一,需要寫為40234632
params.put("userid", userid);// 1~32位盖溺,此userid針對您自己的每一個用戶,用于上下文的關(guān)聯(lián)
doNet(callback, url, params);
}
/**
* showapi铣缠,聊天機器人數(shù)據(jù)接口
*/
public void robotAsk(NetCallback callback, String info, String userid) {
String url = "http://route.showapi.com/60-27";// 請求接口地址
Map params = new HashMap();// 請求參數(shù)
params.put("info", info);// 要發(fā)送給機器人的內(nèi)容烘嘱,不要超過30個字符
params.put("userid", userid);// 1~32位,此userid針對您自己的每一個用戶蝗蛙,用于上下文的關(guān)聯(lián)
params.put("showapi_appid", APPKEY_ROBOT_SHOWAPI);
params.put("showapi_sign", APPKEY_SIGN_SHOWAPI);
params.put("showapi_timestamp", System.currentTimeMillis());
params.put("showapi_sign_method", "md5");
params.put("showapi_res_gzip", "0");
doNet(callback, url, params);
}
/**
* haoservice蝇庭,聊天機器人數(shù)據(jù)接口
*/
public void robotAsk(NetCallback callback, String info, String userid) {
String url = "http://apis.haoservice.com/efficient/robot";
Map params = new HashMap();// 請求參數(shù)
params.put("key", APPKEY_ROBOT_HAOAPI);// 您申請到的本接口專用的APPKEY
params.put("info", info);// 要發(fā)送給機器人的內(nèi)容,不要超過30個字符
doNet(callback, url, params);
}
這是網(wǎng)絡(luò)請求回調(diào)接口捡硅,最初準備返回retCode和retMsg哮内,后來決定從簡只返回JSONObject了:
/**
* 回調(diào)接口
*/
public interface NetCallback{
public void callback(JSONObject object);
}
這是一個簡單的HttpURLConnection網(wǎng)絡(luò)請求封裝,項目開始比較早壮韭,什么OKHttp之類的也不太流行北发,而且應(yīng)用用到網(wǎng)絡(luò)請求的地方并不是非常多,集成第三方網(wǎng)絡(luò)框架過于臃腫了:
/**
* 發(fā)起網(wǎng)絡(luò)請求
* @param callback
* @param url
* @param params
* @param isPost
*/
private void doNet(NetCallback callback, String url, Map params, boolean isPost) {
JSONObject object = null;
try {
String strMethod;
if(isPost) {
trMethod = "POST";
} else {
strMethod = "GET";
}
String result = net(url, params, strMethod);
object = new JSONObject(result);
// if (object.getInt("error_code") == 0) {
// System.out.println(object.get("result"));
// } else {
// System.out.println(object.get("error_code") + ":" + object.get("reason"));
// }
} catch (Exception e) {
// e.printStackTrace();
}
callback.callback(object);
}
/**
*
* @param strUrl
* 請求地址
* @param params
* 請求參數(shù)
* @param method
* 請求方法
* @return 網(wǎng)絡(luò)請求字符串
* @throws Exception
*/
private static String net(String strUrl, Map params, String method) throws Exception {
HttpURLConnection conn = null;
BufferedReader reader = null;
String rs = null;
try {
StringBuffer sb = new StringBuffer();
if (method == null || method.equals("GET")) {
strUrl = strUrl + "?" + urlencode(params);
}
URL url = new URL(strUrl);
conn = (HttpURLConnection) url.openConnection();
if (method == null || method.equals("GET")) {
conn.setRequestMethod("GET");
} else {
conn.setRequestMethod("POST");
conn.setDoOutput(true);
}
conn.setRequestProperty("User-agent", userAgent);
conn.setUseCaches(false);
conn.setConnectTimeout(DEF_CONN_TIMEOUT);
conn.setReadTimeout(DEF_READ_TIMEOUT);
conn.setInstanceFollowRedirects(false);
conn.connect();
if (params != null && method.equals("POST")) {
try {
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(urlencode(params));
} catch (Exception e) {
// TODO: handle exception
}
}
InputStream is = conn.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sb.append(strRead);
}
rs = sb.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
if (conn != null) {
conn.disconnect();
}
}
return rs;
}
/**
* 將map型轉(zhuǎn)為請求參數(shù)型
*/
private static String urlencode(Map<String, Object> data) {
StringBuilder sb = new StringBuilder();
for (Map.Entry i : data.entrySet()) {
try {
sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue() + "", "UTF-8")).append("&");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return sb.toString();
}
以上是數(shù)據(jù)請求這一塊喷屋,至于界面琳拨,則是普通的聊天對話框界面,只是對數(shù)據(jù)進行了一些過濾與處理屯曹,這些后面的文章再說狱庇。
個人博客: IT老五
微信公眾號:【IT老五(it-lao5)】,一起源創(chuàng)恶耽,一起學(xué)習(xí)僵井!
分享完自己的爛代碼,突然感慨著代碼居然是自己寫的驳棱,OMG批什,也許不同時期有不同時期的想法和見識吧。
發(fā)散下:經(jīng)常聽到有同事或朋友維護別人代碼時吐槽“這代碼太糟了社搅,完全違背了***”驻债、“這完全不合理啊”、“這明顯不應(yīng)該這樣寫”形葬、“有一點點編程思想的人都不會這樣寫”......其實所有代碼在某一個時期都是有原因的合呐,不管好與壞,也許你的代碼在別人眼里也是糟糕的笙以,也許在幾年后看自己代碼淌实,也覺得不可饒恕;個人認為拆祈,會看別人的代碼比會寫自己的代碼更能體現(xiàn)一個人的能力......
以上用到的Api地址:
相關(guān)內(nèi)容:
【小萌伴Android】相關(guān)文章目錄
1.【小萌伴Android】思量再三恨闪,終于鼓起勇氣開源~
2.【小萌伴Android】機器人陪聊模塊分享
3.【小萌伴Android】新聞/H5游戲模塊及廣告過濾
4.【小萌伴Android】段子趣圖模塊及其實現(xiàn) 及 段子趣圖數(shù)據(jù)爬取
5.【小萌伴Android】原生小游戲及其實現(xiàn)(一)2048