2.【小萌伴Android】机器人陪聊模块分享

小萌伴最初版本只是一个机器人陪聊软件,所以其最初的核心功能就是聊天机器人,这一功能做得很早,代码也写得很简单。

xmb.itlao5.com

聊天机器人用的是第三方Api,最初是聚合数据,刚开始免费无限次数调用,半年后收费开了一年钻石会员继续无限次数调用,用了一年,会员价翻了几倍;因为聚合数据居然用的是图灵机器人,所以用了图灵机器人的sdk,再后来因为调用限制太低(5000降为了100次/天);于是又用到showApi和haoService,并且开了多个号,加起来够几万次调用,能够满足了几千用户的正常使用。

以下分别是聚合、showApi和haoService的接口调用代码:

    /**
     * 聚合数据,聊天机器人数据接口
     */
    public void robotAsk(NetCallback callback, String info, String userid) {
        String url = "http://op.juhe.cn/robot/index";// 请求接口地址
        Map params = new HashMap();// 请求参数
        params.put("key", APPKEY_ROBOT_JUHE);// 您申请到的本接口专用的APPKEY
        params.put("info", info);// 要发送给机器人的内容,不要超过30个字符
        params.put("dtype", "json");// 返回的数据的格式,json或xml,默认为json
        params.put("loc", "");// 地点,如北京中关村
        params.put("lon", "");// 经度,东经116.234632(小数点后保留6位),需要写为116234632
        params.put("lat", "");// 纬度,北纬40.234632(小数点后保留6位),需要写为40234632
        params.put("userid", userid);// 1~32位,此userid针对您自己的每一个用户,用于上下文的关联
        doNet(callback, url, params);
    }

    /**
     * showapi,聊天机器人数据接口
     */
    public void robotAsk(NetCallback callback, String info, String userid) {
        String url = "http://route.showapi.com/60-27";// 请求接口地址
        Map params = new HashMap();// 请求参数
        params.put("info", info);// 要发送给机器人的内容,不要超过30个字符
        params.put("userid", userid);// 1~32位,此userid针对您自己的每一个用户,用于上下文的关联
        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,聊天机器人数据接口
     */
    public void robotAsk(NetCallback callback, String info, String userid) {
        String url = "http://apis.haoservice.com/efficient/robot";
        Map params = new HashMap();// 请求参数
        params.put("key", APPKEY_ROBOT_HAOAPI);// 您申请到的本接口专用的APPKEY
        params.put("info", info);// 要发送给机器人的内容,不要超过30个字符
        doNet(callback, url, params);
    }

这是网络请求回调接口,最初准备返回retCode和retMsg,后来决定从简只返回JSONObject了:

    /**
     * 回调接口
     */
    public interface NetCallback{
        public void callback(JSONObject object);
    } 

这是一个简单的HttpURLConnection网络请求封装,项目开始比较早,什么OKHttp之类的也不太流行,而且应用用到网络请求的地方并不是非常多,集成第三方网络框架过于臃肿了:

    /**
     * 发起网络请求
     * @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
     *            请求参数
     * @param method
     *            请求方法
     * @return 网络请求字符串
     * @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型转为请求参数型
     */
    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();
    }

以上是数据请求这一块,至于界面,则是普通的聊天对话框界面,只是对数据进行了一些过滤与处理,这些后面的文章再说。

个人博客: IT老五
微信公众号:【IT老五(it-lao5)】,一起源创,一起学习!

分享完自己的烂代码,突然感慨着代码居然是自己写的,OMG,也许不同时期有不同时期的想法和见识吧。

发散下:经常听到有同事或朋友维护别人代码时吐槽“这代码太糟了,完全违背了***”、“这完全不合理啊”、“这明显不应该这样写”、“有一点点编程思想的人都不会这样写”......其实所有代码在某一个时期都是有原因的,不管好与坏,也许你的代码在别人眼里也是糟糕的,也许在几年后看自己代码,也觉得不可饶恕;个人认为,会看别人的代码比会写自己的代码更能体现一个人的能力......

以上用到的Api地址:

  1. 聚合数据
  2. showApi
  3. haoService
  4. 图灵机器人

相关内容:
【小萌伴Android】相关文章目录
1.【小萌伴Android】思量再三,终于鼓起勇气开源~
2.【小萌伴Android】机器人陪聊模块分享
3.【小萌伴Android】新闻/H5游戏模块及广告过滤
4.【小萌伴Android】段子趣图模块及其实现段子趣图数据爬取
5.【小萌伴Android】原生小游戏及其实现(一)2048

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容