图灵机器人的应用

要实现一个图灵机器人(类似微软小冰),首先需要在 http://www.tuling123.com/ 中注册,然后创建一个应用,便可通过应用的API key使用图灵机器人。图灵机器人非常方便的一点是不需要添加额外的库类。只需要get请求访问 http://www.tuling123.com/openapi/api 就可以获得json数据,然后对json数据进行解析即可。

1 写一个访问图灵机器人网络地址的工具类

这里用到了谷歌sdk自带的JSONObject解析json数据,然后根据json数据中的code值辨别不同的json类型

最终返回一个JavaBean对象,示例代码如下:

public class HttpUtils {
    public static final String TURING_URL = " http://www.tuling123.com/openapi/api";
    public static final String API_KET = "ded5d09265aa95782f638bfdcb5eb96c";

    public static ChatMessage doGet(String msg) {
        String url = setParams(msg);
        if (TextUtils.isEmpty(url)) {
            return null;
        }
        ChatMessage chatMessage=new ChatMessage();
        InputStream inputStream = null;
        ByteArrayOutputStream outputStream = null;
        try {
            URL urlNet = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) urlNet
                    .openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(3 * 1000);
            connection.setReadTimeout(5 * 1000);
            int code = connection.getResponseCode();
            Log.i("Code", code + "");
            inputStream = connection.getInputStream();
            int len = -1;
            byte[] buff = new byte[128];
            outputStream = new ByteArrayOutputStream();
            while ((len = inputStream.read(buff)) != -1) {
                outputStream.write(buff, 0, len);
            }
            outputStream.flush();
            Gson gson = new Gson();
            String result=new String(outputStream.toByteArray());
            JSONObject jsonObject=new JSONObject(result) ;
            int typeCode=jsonObject.getInt("code");
            Log.i("code", typeCode+"");
            chatMessage.setDate(new Date());
            chatMessage.setName("小王");
            chatMessage.setType(Type.INCOMING);
            if(typeCode==100000)
            {
                chatMessage.setCode(typeCode);
                chatMessage.setText(jsonObject.getString("text"));
            }else if(typeCode==200000)
            {
                chatMessage.setCode(typeCode);
                chatMessage.setText(jsonObject.getString("text"));
                chatMessage.setUrl(jsonObject.getString("url"));

            }else if(typeCode==302000)
            {
                NewsBean newsBean=gson.fromJson(result, NewsBean.class);
                chatMessage.setCode(typeCode);
                chatMessage.setText(newsBean.getText());
                chatMessage.setList(newsBean.getList());
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null)
                    inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outputStream != null)
                    outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return chatMessage;
    }
    private static String setParams(String msg) {
        String url = "";
        try {
            url = TURING_URL + "?key=" + API_KET + "&info="
                    + URLEncoder.encode(msg, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return url;
    }
}

2 聊天界面

聊天界面设计比较简单 顶部是一个标题栏,中间是显示聊天记录的LIstView,底部是一个发送消息的布局。

总布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_alignParentTop="true"
        android:background="@drawable/title_bar"
        android:id="@+id/rl_top"
        >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:textColor="#ffffff"
            android:text="小王"
            android:textSize="22sp"
            />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:layout_alignParentBottom="true"
        android:background="@drawable/bottom_bar"
        android:id="@+id/rl_bottom"
        >

        <Button
            android:id="@+id/btn_send"
            android:layout_width="60dp"
            android:layout_height="40dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:text="发送"
            android:onClick="send"
            />

        <EditText
            android:id="@+id/et_msg"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_centerVertical="true"
            android:background="@drawable/login_edit_normal"
            android:textSize="18sp"
            android:layout_toLeftOf="@+id/btn_send"
            />

    </RelativeLayout>
    <ListView
        android:id="@+id/lv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/rl_bottom"
        android:layout_below="@+id/rl_top"
        android:divider="@null"
        android:dividerHeight="5dp"
        />
</RelativeLayout>

子ListVIew的布局也比较简单,有一个图像和TextView组成,根据信息来设置布局是居左还是居右。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_time_from"
        android:text="2012-12-12 12:12:12"
        android:textSize="16sp"
        android:background="#bebebe"
        android:textColor="#f5f5f5"
        android:gravity="center"
        />

    <LinearLayout
        android:layout_marginTop="3dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <ImageView
            android:layout_width="49dp"
            android:layout_height="49dp"
            android:src="@drawable/xw" />
        <TextView
            android:id="@+id/tv_text_from"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/chatfrom_bg_normal"
            android:gravity="center_vertical"
            android:text="你好"
            android:textSize="16sp" />

    </LinearLayout>
</LinearLayout>

3 实现聊天界面的逻辑功能

主要是实现发送按钮的点击事件,当触发点击事件后,将开启子线程将从EditText获得的文本信息向图灵

机器人发出请求。获得数据后将异步刷新ListView,显示结果,示例代码如下:

public class MainActivity extends Activity {
    private ListView lv_content;
    private List<ChatMessage> chats=new ArrayList<ChatMessage>();
    private MyAdapter adapter=null;
    private EditText et_msg;

    private Handler handler=new Handler(){

        public void handleMessage(android.os.Message msg) {

            ChatMessage chatMessage=(ChatMessage) msg.obj;
            chats.add(chatMessage);
            adapter.notifyDataSetChanged();
            lv_content.setSelection(lv_content.getBottom());

        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        lv_content=(ListView) findViewById(R.id.lv_content);
        et_msg=(EditText) findViewById(R.id.et_msg);
        adapter=new MyAdapter(this);
        lv_content.setAdapter(adapter);    

        ChatMessage m1=new ChatMessage();
        m1.setDate(new Date());
        m1.setName("h");
        m1.setText("你好,我是小王");
        m1.setType(Type.INCOMING);

        chats.add(m1);
        // EditText的监听器
        et_msg.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
                lv_content.setSelection(lv_content.getBottom());
            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }
        });

        et_msg.setOnFocusChangeListener(new OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {

                lv_content.setSelection(lv_content.getBottom());
            }
        });

    }

    public void send(View v)
    {
        final String msg=et_msg.getText().toString();
        if(TextUtils.isEmpty(msg))
        {
            return ;
        }
        Log.i("data", msg);

        ChatMessage chatMessage=new ChatMessage();
        chatMessage.setDate(new Date());
        chatMessage.setName("h");
        chatMessage.setText(msg);
        chatMessage.setType(Type.OUTCOMING);
        chats.add(chatMessage);
        adapter.notifyDataSetChanged();
        lv_content.setSelection(lv_content.getBottom());
        et_msg.setText("");

        // 关闭输入法的软键盘
        InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        im.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        new Thread()
        {
            public void run() {
                ChatMessage chatMessage=HttpUtils.doGet(msg);
            /*    chatMessage.setDate(new Date());
                chatMessage.setName("h");
                chatMessage.setText(bean.getText());
                chatMessage.setType(Type.INCOMING);*/
                Message message=Message.obtain();
                message.obj=chatMessage;
                handler.sendMessage(message);
            };
        }.start();
    }

    private class MyAdapter extends BaseAdapter{
        private Context context;

        public MyAdapter(Context context)
        {
            this.context=context;
        }
        @Override
        public int getCount() {
            return chats.size();
        }
        @Override
        public Object getItem(int position) {
            return chats.get(position);
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ChatMessage chatMessage = chats.get(position);
            ViewHolder holder=null;
            if(convertView==null)
            {

                if(getItemViewType(position)==0)
                {
                    convertView=View.inflate(context, R.layout.item_from_msg, null);
                    holder=new ViewHolder();
                    holder.tv_time=(TextView) convertView.findViewById(R.id.tv_time_from);
                    holder.tv_content=(TextView) convertView.findViewById(R.id.tv_text_from);
                    convertView.setTag(holder);

                }else{
                    convertView=View.inflate(context, R.layout.item_to_msg, null);
                    holder=new ViewHolder();
                    holder.tv_time=(TextView) convertView.findViewById(R.id.tv_time_to);
                    holder.tv_content=(TextView) convertView.findViewById(R.id.tv_text_to);
                    convertView.setTag(holder);
                }

            }else{
                holder=(ViewHolder) convertView.getTag();
            }

            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            holder.tv_time.setText(df.format(chatMessage.getDate()));

            int code=chatMessage.getCode();
            if(code==100000)
            {
                holder.tv_content.setText(chatMessage.getText());

                Log.i("Text", chatMessage.getText());

            }else if(code==200000)
            {
                holder.tv_content.setText(chatMessage.getText()
                        +chatMessage.getUrl());
                Log.i("URL", chatMessage.getText());
            /*    Intent intent =new Intent(context,UrlActivity.class);
                intent.putExtra("url", chatMessage.getUrl());
                context.startActivity(intent);*/

            }else if(code==302000)
            {
                News []list=chatMessage.getList();
                StringBuffer sb=new StringBuffer();
                for(News n:list)
                {
                    sb.append(n.toString());
                }
                holder.tv_content.setText(chatMessage.getText()+sb.toString());
                Log.i("NEWS", chatMessage.getText());
            }else{

                holder.tv_content.setText(chatMessage.getText());
                Log.i("ELSE", chatMessage.getText());
            }

            return convertView;
        }
        @Override
        public int getItemViewType(int position) {

            return chats.get(position).getType()==Type.INCOMING?0:1;
        }
        @Override
        public int getViewTypeCount() {
            return 2;
        }

        public class ViewHolder{

            TextView tv_time;
            TextView tv_content;
        }

    }
}

4.效果图:

时间: 2024-10-28 21:26:45

图灵机器人的应用的相关文章

机器人api(图灵机器人)

图灵机器人,是基于自然语言解析的智能机器人,已经免费开放了机器人api接口,有需求的同学能够去试试. 图灵机器人官网:http://www.tuling123.com 图灵机器人体验:http://www.tuling123.com/openapi/cloud/proexp.jsp

使用图灵机器人笑话功能提高微信公众帐号活跃度

概要: 微信公众帐号早已经"泛滥成灾",虽然如此,各企业商家还是费尽心思在上面做文章,以免"错失商机".然而,微信公众帐号的活跃度可为掺不忍睹,除了极个别的知名服务行业帐号每天有上千次交互外,其余基本"无人问津". 为了解决这一难题,提高微信活跃度,本次教程以java开发为例,介绍如通过图灵机器人api接口在微信公众帐号中加入笑话功能. 通过增加其趣味娱乐性,可以有效提高用户粘度,在保证关注量的同时,实现公众帐号应有的价值. 本文重点介绍笑话功能

个人微信接入图灵机器人(基于Python)

开发环境:Ubuntu14.04 编程语言:Python2.7 1.在图灵机器人官网(http://www.tuling123.com)注册账号,创建机器人,如果只是学习的话,可以使用免费版,一个账号最多可以创建5个机器人,一个机器人日调用接口数5000次. 2.开发环境搭建,这里使用的是阿里云服务器Ubuntu14.04 2.1 安装python2.7: sudo apt-get install python2.7 2.2 借助python的itchat和pillow,可以使用pip安装.it

Delphi 实现 图灵机器人API(IDHTTP POST )

此功能所需的 Key及接口文档,都可以在图灵机器人的官网下载, 小伙伴们需要申请自己的图灵机器人账号. 申请方法请自行百度“图灵机器人”  . 登录账号后,在左侧的[机器人接入],获取需要的信息,记得一定要关闭 secret,开启的话,需要对请求进行特殊处理,具体处理方法可以看接口文档中的“数据加密Demo”,当然Java 开发的小伙伴可以直接使用Demo(流行的语言真好,东西都是现成的) 下面贴出的是POST请求,实现图灵机器人的方法. unit Demo; interface uses Wi

用图灵机器人高速创建微信公众帐号

微信公众帐号已经泛滥成灾,作为一个技术开发者,想高速创建一个智能的微信公众帐号,能够试试功能强大的图灵机器人. 首先.必须已经拥有了一个可用的公众帐号,这是前提. 其次.登录公众帐号.进入管理后台.进入"功能-高级功能"模块.能够看到有"编辑模式"和"开发模式". 非常多人仅仅能选择"编辑模式",是由于"编辑模式"仅仅是普通的网页操作,没有不论什么的技术可言.当然实现的功能也非常easy. 假设想要很多其它

介绍图灵机器人php API

图灵机器人平台,基于自然语言处理.知识库和云计算等技术,为广大开发者.合作伙伴提供的一系列智能语义处理能力(包括语义理解.智能问答.知识库对接等)的服务平台.截止到目前为止,平台已经积累了近百亿条语料库和PB级别的基础数据,经测试平台的整体准确度已经达到90%以上,而且平台已经应用于HTC的小Hi语音助手.中国电信的微信平台.海尔的智能家电控制系统等,广受企业的好评. 下面介绍下他的api: 下面这里摘自官网:http://www.tuling123.com/openapi/cloud/api.

微信公众平台接入图灵机器人

这是我已经接入好的,见图: 第一步:微信公众平台申请: 第二步:图灵机器人官网申请key;完了后按照http://www.tuling123.com/openapi/cloud/api.jsp?section=3参照这个在微信公众平台的开发者模式填写即可以. 快来试试我的吧.

图灵机器人API,适用于微信、微博、QQ群、智能硬件等

该API有智能聊天.查天气.查快递.查菜谱.查车票.查航班.查出行.查周边等近500个功能,可以用在微信公众平台.QQ群.手机语音助手.智能硬件等领域\ [1].[代码] [PHP]代码 跳至 [1] [2] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?PHP /**图灵机器人网站:http://www.tuling123.com /**API端口体验链接:http://www.tuling123.com/

图灵机器人API调用 C++版

这是一个非常简单的例子,作为新手的我是拿来练手的,当然也可以给和我一样的朋友一些参考. 而且图灵官网没有给出C的例子,网上一搜也是各种Java.C#甚至易语言实现,不要歧视C++好不好●︿●,就算不如语言老大PHP,它也是很强的! 这个例子其本质就是一个C++写的get数据  (POST和这个也差不多啦,可以自己动手试一试╭(′▽`)╯ ) 没有用MFC,直接用的WindowAPI哦,用的是winhttp. 也没有使用JSON库之类的来解析数据,因为我是暴力拆解字符串的,所以如果返回值位数不对可