2.【小萌伴Android】機器人陪聊模塊分享

小萌伴最初版本只是一個機器人陪聊軟件搜吧,所以其最初的核心功能就是聊天機器人,這一功能做得很早杨凑,代碼也寫得很簡單滤奈。

xmb.itlao5.com

聊天機器人用的是第三方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地址:

  1. 聚合數(shù)據(jù)
  2. showApi
  3. haoService
  4. 圖靈機器人

相關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市放坏,隨后出現(xiàn)的幾起案子咙咽,更是在濱河造成了極大的恐慌,老刑警劉巖淤年,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钧敞,死亡現(xiàn)場離奇詭異,居然都是意外死亡麸粮,警方通過查閱死者的電腦和手機溉苛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄诲,“玉大人愚战,你說我怎么就攤上這事⊥” “怎么了凤巨?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洛搀。 經(jīng)常有香客問我敢茁,道長,這世上最難降的妖魔是什么留美? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任彰檬,我火速辦了婚禮,結(jié)果婚禮上谎砾,老公的妹妹穿的比我還像新娘逢倍。我一直安慰自己,他們只是感情好景图,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布较雕。 她就那樣靜靜地躺著,像睡著了一般挚币。 火紅的嫁衣襯著肌膚如雪亮蒋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天妆毕,我揣著相機與錄音慎玖,去河邊找鬼。 笑死笛粘,一個胖子當著我的面吹牛趁怔,可吹牛的內(nèi)容都是我干的湿硝。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼润努,長吁一口氣:“原來是場噩夢啊……” “哼关斜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起任连,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蚤吹,失蹤者是張志新(化名)和其女友劉穎例诀,沒想到半個月后随抠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡繁涂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年拱她,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扔罪。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡秉沼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矿酵,到底是詐尸還是另有隱情唬复,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布全肮,位于F島的核電站敞咧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辜腺。R本人自食惡果不足惜休建,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望评疗。 院中可真熱鬧测砂,春花似錦、人聲如沸百匆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽加匈。三九已至存璃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矩动,已是汗流浹背有巧。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悲没,地道東北人篮迎。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓男图,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甜橱。 傳聞我的和親對象是個殘疾皇子逊笆,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容