一款用JTabbedPane选项卡实现的实例,其功能领域有:笑话、新闻、星座运势、成语、解梦。询问不同领域的问题,自动切换至对应的选项卡来输出答案。用到的技术主要有:javax.swing.JFrame,javax.swing.JTabbedPane,javax.swing.JScrollPane,javax.swing.GroupLayout,javax.swing.JTable,Jsoup。
程序运行效果图见(上一篇)Olami智能语义解析—学习娱乐小能手
该程序可运行jar包见xiaonengshou.jar
代码原文如下:
1、MyJFrame:界面显示。
import java.awt.Color;
import java.awt.Desktop;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.GroupLayout.Alignment;
import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class MyJFrame extends javax.swing.JFrame {
private static final long serialVersionUID = 1L;
private JButton jButton_send;
private JLabel jLabel1;
private JLabel jLabel2;
private JPanel jPanel1;
private JTextField jTextField1;
private JTextArea areaTxt;
private JTabbedPane tabbedPanel;
private JTable table;
private String introduce = "你好,我是娱乐学习小能手。\r\n 我可以讲笑话、查运势、查新闻、查公交线、查成语、还可以解梦呢!\r\n\r\n";
private String[] introduces = {"笑话类:\r\n 1、讲笑话。\r\n 2、来个笑话。\r\n 趣图类:\r\n 1、看趣图。\r\n 2、来张趣图。","新闻类:\r\n 1、娱乐头条。\r\n 2、看新闻。","星座类:\r\n 1、摩羯座今日运势。\r\n 2、摩羯座本月运势。 \r\n 3、摩羯座的本周运势","成语类:\r\n 1、日积月累是什么意思。\r\n 2、有龙字的成语 。\r\n 3、带龙马的成语。","解梦类:\r\n 1、我梦到了黄金。\r\n 2、梦到了黄金有什么寓意。"};
private AppProcess app;
public MyJFrame() {
initComponents();
app = new AppProcess();
}
private void initComponents() {
jPanel1 = new JPanel();
jLabel1 = new JLabel();
jLabel2 = new JLabel();
jTextField1 = new JTextField();
jButton_send = new JButton();
tabbedPanel = new JTabbedPane(JTabbedPane.TOP);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new java.awt.Dimension(430, 280));
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("智能问答"));
JLabel jl_href = new JLabel("<html><a href=''>相关代码详细说明</a></html>");
jl_href.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(new URI("http://blog.csdn.net/u011827504/article/details/75284546"));
} catch (IOException | URISyntaxException e1) {
e1.printStackTrace();
}
}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}
});
jLabel1.setText("提问:");
jTextField1.setText("娱乐头条");
jButton_send.setText("send");
jButton_send.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton_sendActionPerformed(evt);
}
});
GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
GroupLayout.SequentialGroup hGroup = jPanel1Layout.createSequentialGroup();
hGroup.addGap(15);
hGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jLabel1));
hGroup.addGap(5);
hGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jTextField1).addComponent(jl_href).addComponent(jLabel2));
hGroup.addGap(5);
hGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jButton_send));
hGroup.addGap(15);
jPanel1Layout.setHorizontalGroup(hGroup);
GroupLayout.SequentialGroup vGroup = jPanel1Layout.createSequentialGroup();
vGroup.addGap(8);
vGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jl_href));
vGroup.addGap(8);
vGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jLabel1)
.addComponent(jTextField1).addComponent(jButton_send));
vGroup.addGap(8);
vGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jLabel2));
vGroup.addGap(8);
//设置垂直组
jPanel1Layout.setVerticalGroup(vGroup);
jPanel1.setLayout(jPanel1Layout);
//创建面板
JScrollPane panel_joke = new JScrollPane();
JScrollPane panel_news = new JScrollPane();
JScrollPane panel_hor = new JScrollPane();
JScrollPane panel_idiom = new JScrollPane();
JScrollPane panel_oneir = new JScrollPane();
areaTxt = new JTextArea();
areaTxt.setColumns(28);
areaTxt.setRows(15);
areaTxt.setText(introduce + introduces[0]);
areaTxt.setEditable(false);
areaTxt.setLineWrap(true);
areaTxt.setAutoscrolls(true);
panel_joke.setViewportView(areaTxt);
tabbedPanel.addTab("笑话",panel_joke);
tabbedPanel.addTab("新闻",panel_news);
tabbedPanel.addTab("星座",panel_hor);
tabbedPanel.addTab("成语",panel_idiom);
tabbedPanel.addTab("解梦",panel_oneir);
tabbedPanel.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent arg0) {
// TODO Auto-generated method stub
int index = tabbedPanel.getSelectedIndex();
areaTxt.setText(introduce + introduces[index]);
((JScrollPane)tabbedPanel.getComponent(index)).setViewportView(areaTxt);
}
});
GroupLayout layout = new GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addComponent(tabbedPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tabbedPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}
private void jButton_sendActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Map<String, Object> retMap = app.process(jTextField1.getText());
jLabel2.setText("");
if (retMap.containsKey("ds")) {
jLabel2.setText(retMap.get("ds").toString());
jLabel2.setForeground(Color.red);
} else if (retMap.containsKey("joke")) {
Object obj = retMap.get("joke");
tabbedPanel.setSelectedIndex(0);
JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(0));
if (obj instanceof String) {
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
} else {
JLabel jLabel = new JLabel();
if (obj != null) {
ImageIcon image = new ImageIcon((URL) obj);
jLabel.setIcon(image);
} else {
jLabel.setText("图片加载失败!");
}
jpanel.setViewportView(jLabel);
}
}else if (retMap.containsKey("horoname")){
Object obj = retMap.get("horoname");
tabbedPanel.setSelectedIndex(2);
JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(2));
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
}else if(retMap.containsKey("news")){
Object obj = retMap.get("news");
tabbedPanel.setSelectedIndex(1);
JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(1));
if (obj instanceof String) {
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
}else{
@SuppressWarnings("unchecked")
Map<String, List<String>> newsMap = (HashMap<String, List<String>>)obj;
List<String> titleList = newsMap.get("title");
final List<String> urlList = newsMap.get("url");
table = getSimpleTable(titleList);
jpanel.setViewportView(table);
table.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
// 取得用户所选行的行数
int selectRows=table.getSelectedRows().length;
if(selectRows==1){
// 取得用户所选单行
int selectedRowIndex = table.getSelectedRow();
String url = urlList.get(selectedRowIndex);
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(new URI(url));
} catch (IOException | URISyntaxException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}});
}
}else if(retMap.containsKey("oneiromancy")){
Object obj = retMap.get("oneiromancy");
tabbedPanel.setSelectedIndex(4);
final JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(4));
if (obj instanceof String) {
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
}else{
@SuppressWarnings("unchecked")
Map<String, List<String>> OneirMap = (HashMap<String, List<String>>)obj;
List<String> wordList = OneirMap.get("word");
final List<String> urlList = OneirMap.get("url");
table = getSimpleTable(wordList);
jpanel.setViewportView(table);
table.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
// 取得用户所选行的行数
int selectRows=table.getSelectedRows().length;
if(selectRows==1){
// 取得用户所选单行
int selectedRowIndex = table.getSelectedRow();
String url = urlList.get(selectedRowIndex);
String answer = app.getOneirData(url);
areaTxt.setText(answer);
jpanel.setViewportView(areaTxt);
}
}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}});
}
}else if(retMap.containsKey("idioms")){
Object obj = retMap.get("idioms");
tabbedPanel.setSelectedIndex(3);
final JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(3));
if (obj instanceof String) {
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
}else{
@SuppressWarnings("unchecked")
Map<String, List<String>> OneirMap = (HashMap<String, List<String>>)obj;
List<String> nameList = OneirMap.get("name");
final List<String> idList = OneirMap.get("id");
table = getSimpleTable(nameList);
jpanel.setViewportView(table);
table.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
// 取得用户所选行的行数
int selectRows=table.getSelectedRows().length;
if(selectRows==1){
// 取得用户所选单行
int selectedRowIndex = table.getSelectedRow();
String id = idList.get(selectedRowIndex);
String answer = app.getIdiomsP(id);
areaTxt.setText(answer);
jpanel.setViewportView(areaTxt);
}
}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}});
}
}
}
public JTable getSimpleTable(List<String> titleList){
String[] colname = {"请选择"};
int num = titleList.size();
Object[][] data = new Object[num][1];
for(int i =0; i < num; i++ ){
data[i] = new Object[]{(i+1) + "、" +titleList.get(i)};
}
JTable jtable = new JTable(data,colname);
return jtable;
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
MyJFrame frame = new MyJFrame();
frame.setTitle("自然语言理解试验小程序——学习娱乐小能手");
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
2、NLIProcess:智能语义解析(支持领域有笑话、新闻、星座运势、成语、解梦)。
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
public class NLIProcess {
private static final String url = "https://cn.olami.ai/cloudservice/api";
private static final String Appkey = "fcf20941682b494e9db8c23c14deeb74";
private static final String Appsecret = "1bcbbe1fb5924185a13c9b5f6d548ee0";
private static final String api = "nli";
private JSONObject process (String input) {
JSONObject NLIresult = new JSONObject();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("appkey", Appkey));
params.add(new BasicNameValuePair("api", api));
long timestamp = Calendar.getInstance().getTimeInMillis();
params.add(new BasicNameValuePair("timestamp", String.valueOf(timestamp)));
params.add(new BasicNameValuePair("sign", generateSign(timestamp)));
JSONObject request = new JSONObject();
JSONObject data = new JSONObject();
try {
data.put("input_type", 0);
data.put("text", input);
request.put("data_type", "stt");
request.put("data", data);
} catch (JSONException e1) {
e1.printStackTrace();
return NLIresult;
}
params.add(new BasicNameValuePair("rq", request.toString()));
params.add(new BasicNameValuePair("cusid", "asdfghj"));
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(url);
try {
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
CloseableHttpResponse response = httpclient.execute(httppost);
try {
HttpEntity entity = response.getEntity();
if (entity != null) {
String contnt = EntityUtils.toString(entity);
NLIresult = JSONObject.parseObject(contnt);
}
} finally {
response.close();
}
} catch (Exception e) {
e.printStackTrace();
return NLIresult;
} finally {
try {
httpclient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return NLIresult;
}
private String generateSign(long timestamp) {
String sign = Appsecret + "api=" + api + "appkey=" + Appkey + "timestamp=" + timestamp + Appsecret;
return MD5String(sign);
}
public String MD5String(String str) {
try {
MessageDigest msgDigest = MessageDigest.getInstance("MD5");
msgDigest.reset();
msgDigest.update(str.getBytes("UTF-8"));
byte[] byteArrary = msgDigest.digest();
StringBuffer md5StrBuff = new StringBuffer();
for (int i = 0; i < byteArrary.length; i++) {
String tmp = Integer.toHexString(0xFF & byteArrary[i]);
if (tmp.length() == 1) {
md5StrBuff.append(0).append(tmp);
} else {
md5StrBuff.append(tmp);
}
}
return md5StrBuff.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
public Semantic parseSemantic(String input) {
JSONObject semantic = process(input);
Semantic s = new Semantic();
if (semantic == null || !"ok".equalsIgnoreCase(semantic.getString("status")))
return s;
JSONObject data = semantic.getJSONObject("data");
JSONArray s_list = data.getJSONArray("nli");
JSONObject s_first = s_list.getJSONObject(0);
s.app = s_first.getString("type");
JSONObject desc_obj = s_first.getJSONObject("desc_obj");
s.status = desc_obj.getInteger("status");
if (0 == s.status && desc_obj.containsKey("result")) {
s.answer = desc_obj.getString("result");
}else if(0 != s.status){
s.answer = desc_obj.getString("result");
return s;
}
JSONObject intention = s_first.getJSONArray("semantic").getJSONObject(0);
JSONArray modifier = intention.getJSONArray("modifier");
for (int i = 0; i != modifier.size(); i++) {
s.modifiers.add(modifier.getString(i));
}
JSONArray slots = intention.getJSONArray("slots");
for (int i = 0; i != slots.size(); i++) {
JSONObject record = slots.getJSONObject(i);
Slot slot = new Slot();
slot.name = record.getString("name");
slot.value = record.getString("value");
s.slots.put(slot.name, slot);
}
return s;
}
}
class Semantic {
String app = "";
String answer = "";
Map<String, Slot> slots = new HashMap<String, Slot>();
List<String> modifiers = new ArrayList<>();
int status = -1;
}
class Slot {
String name = "";
String value = "";
}
3、AppProcess:笑话和成语的api接口访问,新闻、星座运势、解梦爬虫。
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.eclipse.swt.graphics.ImageData;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;
import org.jsoup.parser.XmlTreeBuilder;
import org.jsoup.select.Elements;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class AppProcess {
private NLIProcess nli = new NLIProcess();
private Map<String,List<String>> horMap = new HashMap<>();
private List<String> jokeList = new ArrayList<String>();
private List<String> jokePicList = new ArrayList<String>();
private void getHorMap(){
String[] horStrs = {"白羊座","金牛座","双子座","巨蟹座","狮子座","处女座","天秤座","天蝎座","射手座","摩羯座","水瓶座","双鱼座"};
String[] yunshiStrs = {"todaybox3","tomorrowbox3","weekbox3","monthbox3","textbox"};
for(int i = 1; i <= 12; i++){
List<String> yunshiList = new ArrayList<>();
for(int j = 1; j <= 5; j++){
String url = MessageFormat.format("http://cn.xingbar.com/cgi-bin/x5starfate2?fate={0}&type={1}", j, i);
String httpContent = getHttpContent(url, "GBK");
if (httpContent != null && !httpContent.equals("")){
Document doc = Jsoup.parse(httpContent);
Element boxElement = doc.getElementsByClass(yunshiStrs[j-1]).first();
if(boxElement != null){
StringBuffer content = new StringBuffer();
Elements dottxtElements = boxElement.getElementsByClass("dotLbox");
if(dottxtElements != null){
for(Element e : dottxtElements){
content.append(e.text() + "\r\n");
}
}
Elements dotRtxtElements = boxElement.getElementsByClass("dotRbox");
if(dotRtxtElements != null){
for(Element e : dotRtxtElements){
content.append(e.text() + "\r\n");
}
}
Elements trElements = boxElement.select("tr");
for(Element e : trElements){
content.append(e.text() + "\r\n");
}
yunshiList.add(content.toString());
}
}
}
horMap.put(horStrs[i-1], yunshiList);
}
}
private void getJokeList(){
String jokeUrl = "http://api.laifudao.com/open/xiaohua.json";
String jokePicUrl = "http://api.laifudao.com/open/tupian.json";
String httpContent = getHttpContent(jokeUrl,"UTF-8");
JSONArray jokeJS = JSONArray.parseArray(httpContent);
for(int i = 0; i<jokeJS.size(); i++){
JSONObject js = jokeJS.getJSONObject(i);
String jTitle = js.getString("title");
String jContent = js.getString("content");
jokeList.add(jTitle + "\r\n" + jContent.replaceAll("<br/><br/>", "\r\n"));
}
httpContent = getHttpContent(jokePicUrl,"UTF-8");
JSONArray jokepJS = JSONArray.parseArray(httpContent);
for(int i = 0; i<jokepJS.size(); i++){
JSONObject js = jokepJS.getJSONObject(i);
String jContent = js.getString("sourceurl");
jokePicList.add(jContent);
}
}
private Map<String, List<String>> getNewsMap(String type){
Map<String, List<String>> newsMap = new HashMap<>();
List<String> titleList = new ArrayList<>();
List<String> urlList = new ArrayList<>();
String url = MessageFormat.format("http://www.chinanews.com/rss/{0}.xml", type);
String httpContent = getHttpContent(url,"gbk");
//Document doc = Jsoup.parse(httpContent);
Document doc = Jsoup.parse(httpContent, "", new Parser(new XmlTreeBuilder()));
//item
Elements itemElements = doc.select("item");
if(itemElements != null){
for(Element e : itemElements){
String title = e.select("title").first().text();
String link = e.select("link").first().text();
titleList.add(title);
urlList.add(link);
}
newsMap.put("title", titleList);
newsMap.put("url", urlList);
}
return newsMap;
}
private Map<String, List<String>> getOneirMap(String content){
Map<String, List<String>> OneirMap = new HashMap<>();
List<String> wordList = new ArrayList<>();
List<String> urlList = new ArrayList<>();
String path = "http://www.aqioo.cn";
String url = "http://www.aqioo.cn/dream/Dlist?word=" + content;
String httpContent = getHttpContent(url, "GBK");
if (httpContent != null && !httpContent.equals("")){
Document doc = Jsoup.parse(httpContent);
Element fixElement = doc.getElementsByClass("clearfix").first();
if(fixElement != null){
Elements aElements = fixElement.select("a");
if(aElements != null){
for(Element e : aElements){
String word = e.text();
String id = e.attr("href");
wordList.add(word);
urlList.add(path+id);
}
OneirMap.put("word", wordList);
OneirMap.put("url", urlList);
}
}
}
return OneirMap;
}
public String getOneirData(String url){
StringBuffer content = new StringBuffer();
String httpContent = getHttpContent(url, "GBK");
if (httpContent != null && !httpContent.equals("")){
Document doc = Jsoup.parse(httpContent);
Element idElement = doc.getElementById("wraper");
if(idElement != null){
Element infoElement = idElement.getElementsByClass("info").first();
content.append(infoElement.text());
}
}
return content.toString();
}
private Map<String, List<String>> getIdioms(String idiom){
Map<String, List<String>> idiomsMap = new HashMap<>();
List<String> idiomList = new ArrayList<>();
List<String> idList = new ArrayList<>();
String urlkey = "您申请的key值";
String url = "http://api.avatardata.cn/ChengYu/Search?key="+urlkey+"&keyWord="+idiom;
String httpContent = getHttpContent(url,"UTF-8");
JSONObject idiomJS = JSONObject.parseObject(httpContent);
if(idiomJS != null && idiomJS.get("reason").equals("Succes")){
JSONArray idiomsJSlist = idiomJS.getJSONArray("result");
int size = idiomsJSlist.size();
for(int i = 0; i<size; i++){
JSONObject js = idiomsJSlist.getJSONObject(i);
idiomList.add(js.getString("name"));
idList.add(js.getString("id"));
}
idiomsMap.put("name", idiomList);
idiomsMap.put("id", idList);
if(size == 1){
String desc = getIdiomsP(idList.get(0));
List<String> descList = new ArrayList<>();
descList.add(desc);
idiomsMap.put("desc", descList);
}
}
return idiomsMap;
}
public String getIdiomsP(String id){
String urlkey = "您申请的key值";
String url = "http://api.avatardata.cn/ChengYu/LookUp?key="+urlkey+"&id="+id;
String httpContent = getHttpContent(url,"UTF-8");
JSONObject idiomJS = JSONObject.parseObject(httpContent).getJSONObject("result");
StringBuffer retStr = new StringBuffer();
retStr.append("成语:"+idiomJS.getString("name")+"\r\n" + "拼音:"+idiomJS.getString("spell")+"\r\n"+"释义:"+idiomJS.getString("content")+"\r\n");
String derivation = idiomJS.getString("derivation");
if(derivation!= null && !derivation.equals("")){
retStr.append("出处:"+derivation+"\r\n");
}
String samples = idiomJS.getString("samples");
if(samples!= null && !samples.equals("")){
retStr.append("例句:"+samples+"\r\n");
}
return retStr.toString();
}
public String getHttpContent(String url,String charset) {
StringBuffer httpContent = new StringBuffer();
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpGet httpget = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(httpget);
try {
// 获取响应实体
HttpEntity entity = response.getEntity();
if (entity != null) {
if(charset != null && !charset.isEmpty()){
httpContent.append(EntityUtils.toString(entity,charset));
}else{
httpContent.append(EntityUtils.toString(entity));
}
}
} finally {
response.close();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return httpContent.toString();
}
public ImageData DownloadImg(String listImgSrc) {
try {
URL url = new URL(listImgSrc);
HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
urlcon.setInstanceFollowRedirects(false);
urlcon.setRequestMethod("GET");
urlcon.setDoOutput(true);
urlcon.setDoInput(true);
if (urlcon.getResponseCode() == HttpURLConnection.HTTP_OK) {
try (InputStream urlcon_is = urlcon.getInputStream();) {
return new ImageData(urlcon_is);
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private URL getUrl(String picurl){
try {
URL url = new URL(picurl);
return url;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public Map<String, Object> process(String input) {
Semantic s = nli.parseSemantic(input);
Map<String, Object> retMap = new HashMap<String, Object>();
if(s.app.equals("joke")){
if(jokeList.size() < 1 || jokePicList.size() < 1){
getJokeList();
}
if(s.modifiers.contains("query")){
if(jokeList.size() < 1){
retMap.put("joke", "对不起,网络不给力,笑话加载失败。");
}else{
int randomInt = (int)(Math.random() * jokeList.size());
retMap.put("joke", jokeList.get(randomInt));
}
}else if(s.modifiers.contains("query_pic")){
if(jokeList.size() < 1){
retMap.put("joke", "对不起,网络不给力,趣图加载失败。");
}else{
int randomInt = (int)(Math.random() * jokePicList.size());
String picurl = jokePicList.get(randomInt);
retMap.put("joke", getUrl(picurl));
}
}else{
retMap.put("joke", s.answer);
}
}else if(s.app.equals("news")){
if(s.modifiers.contains("query")){
Map<String, List<String>> newsMap = new HashMap<>();
if(s.slots != null && !s.slots.isEmpty()){
String slotValue = s.slots.get("type").value;
newsMap = getNewsMap(slotValue);
}else{
newsMap = getNewsMap("importnews");
}
if(newsMap.isEmpty()){
retMap.put("news", "对不起,网络不给力,新闻加载失败。");
}else{
retMap.put("news", newsMap);
}
}else{
retMap.put("news", s.answer);
}
}else if(s.app.equals("horoname")){
if(horMap.isEmpty()){
getHorMap();
}
//horMap
String slotValue = s.slots.get("hname").value;
List<String> horList = horMap.get(slotValue);
if(s.modifiers.contains("can")){
retMap.put("horoname", s.answer);
}else if(horList.size() < 1){
retMap.put("horoname", "对不起,网络不给力,运势加载失败。");
}else if(s.modifiers.contains("lucktoday")){
retMap.put("horoname", horList.get(0));
}else if(s.modifiers.contains("lucktomor")){
retMap.put("horoname", horList.get(1));
}else if(s.modifiers.contains("luckweek")){
retMap.put("horoname", horList.get(2));
}else if(s.modifiers.contains("luckmonth")){
retMap.put("horoname", horList.get(3));
}else if(s.modifiers.contains("luckyear")){
retMap.put("horoname", horList.get(4));
}
}else if(s.app.equals("oneiromancy")){
if(s.modifiers.contains("query")){
String slotValue = s.slots.get("content").value;
Map<String, List<String>> OneirMap = getOneirMap(slotValue);
if(OneirMap.isEmpty()){
retMap.put("news", "对不起,网络不给力,解梦信息加载失败。");
}else{
retMap.put("oneiromancy", OneirMap);
}
}else{
retMap.put("oneiromancy", s.answer);
}
}else if(s.app.equals("idioms")){
Map<String, List<String>> idiomsMap = new HashMap<>();
if(s.modifiers.contains("query")){
String slotValue = s.slots.get("iname").value;
idiomsMap = getIdioms(slotValue);
}else if(s.modifiers.contains("query_idioms")){
String slotValue = s.slots.get("ikeyword").value;
idiomsMap = getIdioms(slotValue);
}
if(idiomsMap.isEmpty()){
retMap.put("idioms", "对不起,网络不给力,成语加载失败。");
}else{
if(idiomsMap.containsKey("desc")){
String desc = idiomsMap.get("desc").get(0);
retMap.put("idioms", desc);
}else{
retMap.put("idioms", idiomsMap);
}
}
}else if(s.app.equals("ds")){
retMap.put("ds", s.answer);
}
return retMap;
}
}