Java实现一个教务处新成绩通知的Demo

这个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);


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值