云计算开发者社区

用新浪微博连接

一步搞定

查看: 18441|回复: 31

Java微信公众对接高校教务,实现成绩查询【求精】 [复制链接]

Rank: 2

发表于 2014-7-22 12:41:32 |显示全部楼层
本帖最后由 lMscf 于 2014-7-28 10:20 编辑

近来, 很多高校微信公众账号都开发了成绩查询、课表查询之类的功能. 今天就简单说一下使用java模拟登陆高校教务系统, 实现成绩查询等功能.


功能思路:

  • 首先, 通过模拟登陆获取相关Cookie
  • 其次, 使用获取的Cookie访问相关功能页面
  • 之后, 将获取的数据进行处理展示给用户查看


抓包分析:


首先, 我们需要对网页进行抓包, 获取相关的参数信息. 以方便进行模拟登陆.

登陆界面,该学校使用正方的web管理系统, 登陆时无需验证码, 模拟登录时会简单一些.

这里使用Chrome浏览器自带的工具进行抓包. 具体数据如图。



由此可知:

  • 提交URL:http://*.*.*.*/Default2.aspx
  • POST数据如下↓↓↓
    • _VIEWSTATE:未知, 固定值
    • yh:学号
    • kl:密码
    • RadioButtonList1:单选按钮值,通过该值判断登陆者权限,学生、教师、部门、游客
    • Button1:按钮值,通过该值判断点击的哪个按钮,登录、取密码、退出
    • CheckBox1:是否阅读许可条款

代码部分:

- 2014/7/25 更新使用HttpClient 4.3最新版。该版本与之前的代码写法相差较大,大家多留意下。

模拟登陆代码:


首先导入jar包:commons-logging-1.1.3.jar / httpclient-4.3.4.jar / httpcore-4.3.2.jar


    private static CloseableHttpClient httpClient = HttpClients.createDefault();
    
    /**
    * 高校教务系统,模拟POST登陆
    * 
    * @param username 学号
    * @param password 密码
    * @return
    */
    public static int getLoginCookie(String username, String password) {
      System.out.println("--------Get Cookie for Login---------");
    String loginUrl = "http://*.*.*.*/Default2.aspx";
    int htmlCode= 0;
      
    //模拟登陆,按实际服务器端要求选用 Post 或 Get 请求方式
      HttpPost httpPost = new HttpPost(loginUrl);
      System.out.println("request line : " + httpPost.getRequestLine());
      
    try {
      //设置登陆信息,POST提交数据
        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("__VIEWSTATE", "dDwtMTgzNTQyOTM0O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDExPjs+O2w8dDxwPDtwPGw8b25jbGljazs+O2w8d2luZG93LmNsb3NlKClcOzs+Pj47Oz47Pj47Pj47bDxDaGVja0JveDE7Pj4jTSDOG8YeEoLssydszmMECrKaiw=="));
    nvps.add(new BasicNameValuePair("yh", username));
    nvps.add(new BasicNameValuePair("kl", password));
    nvps.add(new BasicNameValuePair("RadioButtonList1", "%D1%A7%C9%FA"));    //“学生”的 urlEncode编码
    nvps.add(new BasicNameValuePair("Button1", "%B5%C7++%C2%BC"));        //“登录”的 urlEncode编码
    nvps.add(new BasicNameValuePair("CheckBox1", "on"));              // 代表接受许可
    
      httpPost.setEntity(new UrlEncodedFormEntity(nvps));
        CloseableHttpResponse response = httpClient.execute(httpPost);
        
        try {  
            // 获取返回数据
        HttpEntity entity = response.getEntity();  
      System.out.println("Response Line: " + response.getStatusLine()); 
        System.out.println("Cookie: " + response.getFirstHeader("Set-Cookie").getValue());
        htmlCode = response.getStatusLine().getStatusCode();
        EntityUtils.consume(entity);  
      } finally {  
        response.close();  
      }
        
      } catch (ClientProtocolException e) {  
    e.printStackTrace();  
    } catch (UnsupportedEncodingException e1) {  
    e1.printStackTrace();  
    } catch (IOException e) {  
    e.printStackTrace();  
    }
    
      return htmlCode;    // 返回网页状态码
    }

运行结果如图:




获取成绩部分代码:


    /**
    * 教务系统:查询成绩
    * 
    * @param username    学号
    * @return
    */
    public static String getResultsHtml(String username) {
      System.out.println("--------Get Results Data---------");
      // 成绩的 Url
      String dataUrl = "http://*.*.*.*/xscj.aspx?xh=" + username;
      String htmlText = "";
      
    try {
      HttpGet httpGet = new HttpGet(dataUrl);
      System.out.println("request line : " + httpGet.getRequestLine());
      CloseableHttpResponse response = httpClient.execute(httpGet);
      try {  
        HttpEntity entity = response.getEntity();  
        System.out.println("Response Line: " + response.getStatusLine());  
        if (entity != null) {  
        htmlText = EntityUtils.toString(entity);
        EntityUtils.consume(entity);  
        }  
      } finally {  
        response.close();
      }
    
    } catch (Exception e) {
    e.printStackTrace();
    }  
      
    return htmlText;
    }    

运行结果如图:




数据处理部分:

导入jar包:jsoup-1.7.2.jar


    /**
    * 数据处理:提取成绩信息
    * @param htmlSource 获取的成绩源码
    */
    public static void getResults(String htmlSource) {
      System.out.println("--------Processing Results Data---------");
      Document document = Jsoup.parse(htmlSource);
      Elements elements = new Elements(document.getElementById("DataGrid1").getElementsByTag("td"));
      
      for (int i = 0; i < elements.size(); i++) {
        System.out.println(elements.get(i).html() + "\t" + elements.get(i+1).html() + "\t" + elements.get(i+2).html() + "\t" + 
                      elements.get(i+3).html() + "\t" + elements.get(i+4).html() + "\t" + elements.get(i+5).html() + "\t" + 
                      elements.get(i+6).html() + "\t" + elements.get(i+7).html() + "\t" + elements.get(i+8).html());
        System.out.println("----------------------Processing end-----------------------------");
        i = i+8;
      }
    }

运行结果:




你也可以使用其他方式对数据处理,之后就是把相关代码集成到公众平台上就可以了。


相关源码jar包下载链接: http://pan.baidu.com/s/1jGl4yma 密码: 2et0



本文思路参考小丧博客:http://www.smallsung.com/?post=8 ,原文为php开发的,有想了解的可以看一下。


本人也不是什么高手 大家一起交流吧!



使用道具 举报

Rank: 2

发表于 2014-7-22 12:44:12 |显示全部楼层
本帖最后由 lMscf 于 2014-7-28 10:17 编辑

再补充一个入口的代码:

  /**
    * 程序入口
    * @param args
    */
  public static void main(String[] args){
    
    int htmlCode = getLoginCookie("*****", "******");
    
    if (htmlCode == 302) {
      // 登录成功
      String htmlSource = getResultsHtml("*****");
      getResults(htmlSource);
    } else if (htmlCode == 200) {
      System.out.println("登录失败请检查,您的账号或者密码!");
    } else {
      System.out.println(htmlCode);
    }
  }


另外每个学校的系统都稍有差别,所以大家在开发时,请自己更改相关代码。

使用道具 举报

Rank: 2

发表于 2014-7-23 11:55:24 |显示全部楼层
没人啊

使用道具 举报

Rank: 2

发表于 2014-7-27 08:43:10 |显示全部楼层
你的百度网盘下载不了。

使用道具 举报

Rank: 2

发表于 2014-7-28 09:47:02 |显示全部楼层
huahua 发表于 2014-7-27 08:43
你的百度网盘下载不了。

抱歉 前几天更新了一下 重新用HttpClient4写了一下!忘记更新链接了

链接: http://pan.baidu.com/s/1jGl4yma 密码: 2et0

使用道具 举报

Rank: 1

发表于 2014-7-28 10:21:58 |显示全部楼层
擦 这个是否不和谐呀

使用道具 举报

Rank: 2

发表于 2014-7-28 10:23:43 |显示全部楼层
霜冷枫 发表于 2014-7-28 10:21
擦 这个是否不和谐呀

怎么不和谐了  只是模拟登陆  又不是利用漏洞什么的!

使用道具 举报

Rank: 1

发表于 2014-7-30 21:16:30 |显示全部楼层
lMscf 发表于 2014-7-28 10:23
怎么不和谐了  只是模拟登陆  又不是利用漏洞什么的!

在于那个系统 正方吧 不安全 容易被心怀不轨的人利用。

使用道具 举报

Rank: 1

发表于 2014-7-31 08:52:28 |显示全部楼层
学习一下

使用道具 举报

Rank: 2

发表于 2014-7-31 09:48:14 |显示全部楼层
霜冷枫 发表于 2014-7-30 21:16
在于那个系统 正方吧 不安全 容易被心怀不轨的人利用。

那倒是 不过貌似现在很多学校都是 正方的

使用道具 举报

Rank: 1

发表于 2014-10-2 14:28:45 |显示全部楼层
其实我想问问这个怎么集成到公众号中,原谅我是个白痴,可否留个联系方式?
我的qq:1353131833

使用道具 举报

Rank: 1

发表于 2014-10-19 15:42:38 |显示全部楼层
可以模拟登陆http://www.chsi.com.cn/cet/吗

使用道具 举报

Rank: 2

发表于 2014-11-6 21:35:52 |显示全部楼层
NigulasiF3 发表于 2014-10-19 15:42
可以模拟登陆http://www.chsi.com.cn/cet/吗

一般模拟登陆都是可以的,但是可能需要你重新写代码

使用道具 举报

Rank: 1

发表于 2014-11-10 00:47:52 |显示全部楼层
找这个找了超级久的,要google才能找得到,可是出现的以下的问题
Response Line: HTTP/1.1 500 Internal Server Error
请教下,这个问题怎么解决啊,十分感谢

使用道具 举报

Rank: 1

发表于 2014-11-10 00:53:41 |显示全部楼层
楼主我想加你的qq询问下,我感觉还有一些地方有问题的。。我很想解决他!

使用道具 举报

Rank: 1

发表于 2014-11-10 00:55:19 |显示全部楼层
我的qq是419776494,麻烦楼主了!!!!!感恩一辈子

使用道具 举报

Rank: 1

发表于 2014-11-12 19:05:52 |显示全部楼层
我也实现了,能查询各种校内的东西,但是发布到sae出现问题了

使用道具 举报

Rank: 1

发表于 2014-11-12 19:10:48 |显示全部楼层
模拟登陆好实现,关键是处理发布的各种bug难

使用道具 举报

Rank: 1

发表于 2014-11-12 19:34:54 |显示全部楼层
这个HTTPclient是4.3的版本,sae支持的是4.1吧

点评

颩捲殘塵  是啊 sae只支持4.1吧 不知道LZ怎么弄的  发表于 2015-3-11 11:41:50

使用道具 举报

Rank: 5Rank: 5

发表于 2014-11-13 11:16:03 |显示全部楼层
谢谢分享!

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|云计算开发者社区 ( 京ICP证000007-137 )

GMT+8, 2018-4-24 12:27 , Processed in 0.218666 second(s), Total 15, Slave 14 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部