这个demo主要是利用了超级课程表的成绩查询接口,因为如果要自己去抓去的话,有点困难,需要点技术。
然后超级课程表的接口是通过手机查询成绩,然后抓去手机的数据包获得的
这边有一个网页,是我们学校的成绩查询,测试不要schoolIdentity网页打不开,所以,要加上自己学校的对应的代码,不知道它是用的什么加密,所以可能只有自己抓包获得
http://112.124.54.19/Score/score.html?schoolIdentity=AECA52CC040296D2B29C131C6558860C
然后最终数据提交的地址是(仅支持post提交,不支持get提交)
http://112.124.54.19/Score/score/importScoreFromSchool.action
需要提交的数据
s_n是用户名,p_d是密码,identity好像不需要,然后其他的应该是年级和学期,自己测试,
返回的结果
{"errorCode":0,"scoreList":[{"courseCode":"SY5206","courseName":"面向对象课程设计","credit":"1.0","gpa":"3.70","score":"88"},{"courseCode":"TB1001","courseName":"经济学原理","credit":"2.0","gpa":"3.70","score":"85"},{"courseCode":"TB3702","courseName":"毛泽东思想和中国特色社会主义理论体系概论(2)","credit":"3.0","gpa":"3.30","score":"84"},{"courseCode":"ZB5231","courseName":"金融信息系统","credit":"3.0","gpa":"3.70","score":"86"},{"courseCode":"ZB5234","courseName":"软件构造","credit":"3.0","gpa":"3.70","score":"87"},{"courseCode":"ZX5221","courseName":"多媒体技术","credit":"3","gpa":"4.00","score":"95"},{"courseCode":"ZX5228","courseName":"数字媒体技术","credit":"3.0","gpa":"4.00","score":"92"},{"courseCode":"ZX5239","courseName":"C#程序设计","credit":"2.0","gpa":"3.30","score":"82"},{"courseCode":"ZX5248","courseName":"Linux系统分析","credit":"2.0","gpa":"4.00","score":"90"},{"courseCode":"ZX5279","courseName":"数据库应用系统设计与开发","credit":"2.0","gpa":"4.00","score":"90"}],"success":true,"type":0}
一个json格式的数据
额,我没有对数据进行处理,只是获取了成绩的数目跟之前成绩数目比对,如果数目不同就发邮件通知。
最后的整体思路是
写一个listener,在应用初始化时就监听,即ServletContextListener
然后定时进行post请求,进行成绩查询。获取成绩数目,进行比对,符合条件就发送邮件通知(好像大部分云服务器的邮件端口25需要单独解封,加安全组还不行),最终效果
没对成绩进行处理,直接发送了,见谅。
代码:
post请求工具类
package utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
public class Util {
public static String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream(),"UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!"+e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return result;
}
}
listener代码
@Override
public void contextInitialized(ServletContextEvent arg0) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("测试");
String sr=Util.sendPost("http://112.124.54.19/Score/score/importScoreFromSchool.action", "schoolIdentity=AECA52CC040296D2B29C131C6558860C&s_Id=0"
+ "&b_y=2017&t_m=1&s_n=学号&p_d=密码&c_k=&v_c=&identity=6EB0F8AA221180ED512C9C02CFF01FCC");
JSONObject json = JSONObject.fromString(sr);
JSONArray arr = json.getJSONArray("scoreList");
if(arr.length() != 10){
try {
MailUtils.sendMail("发送邮箱", sr);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}, new Date(), 1000 * 60 * 10);
}