调用股票API获取数据,对股票数据进行监测,通过发邮件的形式进行预警。
效果预览:
项目准备:
先新建一个java项目,导入如下图所示的包(自己去网上下载吧)。
如果觉得下包导包太麻烦,可以新建一个Maven工程,直接在pom.xml中导包岂不美滋滋。
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
实现步骤:
1.申请股票数据API
在聚合数据上申请股票数据API。
会得到一个请求key。
点击进去能看到接口的详细说明,根据自己的需求调用。
可以测试下API。
编写代码申请数据(股票类中的属性根据自己的需求定义)。
参考文档:HttpClient使用详解
public class Stock {
private String gid = "sh601009"; //股票编号
private String name; //股票名称
private double nowpri; //当前价格
private double increPer; //涨跌百分比
private double increase; //涨跌幅
private String key = "需要填写"; //申请的app key
public Stock(){
String url = "http://web.juhe.cn:8080/finance/stock/hs?gid="+gid+"&type=0&key="+key; //请求API
try {
HttpClient client = new DefaultHttpClient();
//发送get请求
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
//请求发送成功,并得到响应
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//读取服务器返回过来的json字符串数据
String strResult = EntityUtils.toString(response.getEntity());
JSONObject object = JSONObject.parseObject(strResult);
JSONObject object1 = JSONObject.parseObject(object.getString("result"));
name = object1.getString("name");
nowpri = Double.parseDouble(object1.getString("nowpri"));
increPer = Double.parseDouble(object1.getString("increPer"));
increase = Double.parseDouble(object1.getString("increase"));
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
2.实现邮件收发
参考文档:java实现邮件收发
打开qq邮箱的权限并获取授权码。
编写代码:
public class SendMail {
public void send(String IncrePer) throws GeneralSecurityException, MessagingException {
Properties prop = new Properties();
//设置QQ邮件服务器
prop.setProperty("mail.host", "smtp.qq.com");
//邮件发送协议
prop.setProperty("mail.transport.protocol", "smtp");
//需要验证用户名密码
prop.setProperty("mail.smtp.auth", "true");
//关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//使用JavaMail发送邮件的5个步骤
//1.txt、创建定义整个应用程序所需的环境信息的Session对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication("邮箱@qq.com",
"授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com", "邮箱@qq.com", "授权码");
//4,创建邮件
//4-1.txt,创建邮件对象
MimeMessage message = new MimeMessage(session);
//4-2,指明邮件的发件人
message.setFrom(new InternetAddress("邮箱@qq.com"));
//4-3,指明邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("邮箱@qq.com"));
//4-4,邮件标题
message.setSubject("股票涨跌幅预警!!!");
//4-5,邮件文本内容
message.setContent("股票的涨跌百分比为"+IncrePer, "text/html;charset=UTF-8");
//4-6,发送邮件
ts.sendMessage(message, message.getAllRecipients());
//5,关闭连接
ts.close();
}
}
3.创建GUI窗口
可以设置相应的条件发送邮件。
public class Window {
public void createWindow() throws GeneralSecurityException, MessagingException {
Stock stock = new Stock();
JFrame jf = new JFrame("股票监控");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 创建内容面板,使用边界布局
JPanel panel = new JPanel(new BorderLayout());
// 表头(列名)
Object[] columnNames = {"股票编号", "股票名称", "当前价格", "涨跌百分比", "涨跌幅"};
// 表格所有行数据
Object[][] rowData = {
{stock.getGid(), stock.getName(), stock.getNowpri(), stock.getIncrePer(), stock.getIncrease()},
};
// 创建一个表格,指定 所有行数据 和 表头
JTable table = new JTable(rowData, columnNames);
// 把 表头 添加到容器顶部(使用普通的中间容器添加表格时,表头 和 内容 需要分开添加)
panel.add(table.getTableHeader(), BorderLayout.NORTH);
// 把 表格内容 添加到容器中心
panel.add(table, BorderLayout.CENTER);
jf.setContentPane(panel);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
if(Math.abs(stock.getIncrePer())<=5){ //当股票的涨跌百分比在5之间时发送邮件预警
SendMail sendMail = new SendMail();
sendMail.send(String.valueOf(stock.getIncrePer()));
}
}
}
4.运行程序
public class Main {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Window window = new Window();
window.createWindow();
}
}