欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java使用青云客智能聊天接口做一个小助手

程序员文章站 2022-04-29 14:34:35
青云客:http://api.qingyunke.com/也可以使用其他公司的API,比如腾讯、阿里等。...

API介绍

青云客:http://api.qingyunke.com/
Java使用青云客智能聊天接口做一个小助手
也可以使用其他公司的API,比如百度、腾讯、阿里等。

演示

Java使用青云客智能聊天接口做一个小助手
有点傻。。。。。。。。。。

代码

我把项目分为main、model、service、utils四个包。

  1. main:项目的入口,main()方法所在包。
  2. model:存放响应对象,接收API返回数据。
  3. service:相关业务接口和实现类。
  4. utils:工具类。

utils

Java使用青云客智能聊天接口做一个小助手
HttpUtils类:
网络请求工具类,里面有一个静态方法request(String api),传入API地址,进行网络请求,并返回API返回的数据(json格式)。

package utils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUtils {
    /**
     * @param api:API的URL地址
     * @return 请求API所返回的json串
     */
    public static String request(String api) {
        HttpURLConnection httpURLConnection = null;
        int code = 0;//获取HTTP请求状态码
        try {//连接API(需要有网络)
            URL url = new URL(api);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            code = httpURLConnection.getResponseCode();
        } catch (Exception e) {
            return "##出现错误,网络连接异常,请检查网络##";
        }
        if (code >= 200 && code < 300) {//状态码2开头代表成功。
            //建立输入流,获取API返回数据
            try (InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream());
                 BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
                StringBuilder stringBuilder = new StringBuilder();
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuilder.append(line);
                }
                return stringBuilder.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return "##出现错误,错误编码##:" + code;
    }
}

http状态码

model

Java使用青云客智能聊天接口做一个小助手
Response类:用于存放API的返回数据。
青云客API返回数据示例:{“result”:0,“content”:“你好,我就开心了”}
result返回状态码,0表示成功,1表示失败。
content返回数据,来自机器人的回答。

package model;

public class Response {
    private String result;//API返回码
    private String content;//API返回数据
    public Response(){}

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

service

Java使用青云客智能聊天接口做一个小助手RobotService接口:里面有一个方法:Response answer(String question);如果想调用其他平台的问答机器人接口,可以实现此接口。

package service;

import model.Response;

public interface RobotService {
    Response answer(String question);
}

QingYunkeRobotServiceImpl类:青云客平台API的RobotService实现类,里面有一个public Response answer(String question)方法,传入使用者输入的对话,返回Response对象。

package service;

import com.google.gson.Gson;
import model.Response;
import utils.HttpUtils;

import java.net.URLEncoder;

public class QingYunkeRobotServiceImpl implements RobotService {
    //青云客平台的API地址
    private String uri = "https://api.qingyunke.com/api.php?key=free&appid=0&msg=%s";
    private String api;
    Gson gson = new Gson();//用于解析json串

    /**
     * @param question:使用者输入的对话
     * @return Response对象,保存来自机器人的对话
     */
    @Override
    public Response answer(String question) {
        try {
            //需要对输入的对话进行编码,青云客平台使用utf-8编码
            api = String.format(uri, URLEncoder.encode(question, "UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        String ans = HttpUtils.request(api);//获得json串,用字符串储存
        if (!ans.contains("##出现错误,"))
            return gson.fromJson(ans, Response.class);//使用Gson对json串解析,存入Response中
        else {
            Response response = new Response();
            response.setContent(ans);
            return response;
        }
    }
}

main

Java使用青云客智能聊天接口做一个小助手
Main类:程序的入口。

package main;

import model.Response;
import service.QingYunkeRobotServiceImpl;

import java.io.UnsupportedEncodingException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //创建青云客的机器人实现类
        QingYunkeRobotServiceImpl qingyunkeRobotService = new QingYunkeRobotServiceImpl();
        Scanner scanner = new Scanner(System.in);
        System.out.println("快给你的小助手取个名字吧,按回车键确定!!!!");
        String name = scanner.nextLine();
        System.out.println("hi,我是您的小助手 " + name + ", 直接对我下达指令");

        while (true) {
            String input = scanner.nextLine();
            //退出条件:用户输入886
            if ("886".equalsIgnoreCase(input)) {
                System.out.println("欢迎下次使用,拜拜");
                scanner.close();
                return;
            }
            Response response = qingyunkeRobotService.answer(input);
            System.out.println(name + ":" + new String(response.getContent().getBytes(), "UTF-8").replace("{br}", "\n"));
        }
    }
}

扩展

可根据不同平台扩充service层的内容,service层主要是调用HttpUtils,传入API的url地址,获取json字符串并解析,得到想要的数据返回。
也可以调用文字转语音接口,让小助手会说话。

BUG

目前有两个bug,一个是+号,转成utf-8后变成了空格,建议使用汉字加。
Java使用青云客智能聊天接口做一个小助手
第二个bug也是转码问题,在打成jar包后运行有部分文字不能正确识别。
Java使用青云客智能聊天接口做一个小助手

本文地址:https://blog.csdn.net/tjk12345/article/details/110132597