ICCMO微信公众账号开发系列(3)CURL模拟登陆教务系统查成绩

模拟登陆新版正方教务管理系统 引入 与很多高校一样,西安皇家邮电大学一直钟爱于正方教务管理系统。 前一段时间爬了学校的旧版的教务系统,旧版主页 想了解更多请点击这里:爬取学校教务系统获取学生信息 不知道学校是不是把装空调的拿去买新教务系统了,新教务系统主页 可以看出,学校用的仍然是正方教务系统,不过版本升级了,新教务系统是用Java写的后台,前端用了Bootstrap框架。与旧系统相比,界面美观大方,易用性也... 阅读详情
上一篇提到CURL。咱们这一篇来玩玩它。
    CURL 是什么呢?
    CURL有什么用?
    咱们今天通过CURL模拟登陆教务系统查成绩来学习一下这个函数。
    今天要实现的功能是:通过微信查成绩。
    原理:
    怎么实现的呢?
   就是模拟登陆。什么是模拟登陆?通俗一点的说法就是,模拟咱们的浏览器去登陆咱们的教务系统。怎么实现登陆的呢。这就得用到CURL类的函数了。下面我们来看看原理图。
   ![这里写图片描述](https://img-blog.csdn.net/20150801154152948)
   现在我们模拟登陆教务系统,把成绩抓过来再返回给我们的手机。
   ![原理](https://img-blog.csdn.net/20150801154340651)

正常情况下我们查成绩是登陆教务系统网站,输入学号和密码,登陆成功,然后点击查看成绩。今天我们要实现的就是模拟浏览器发送账号密码并取回成绩。大家知道,浏览器有两种传值方法GET和POST。(有的说有3种,有一种不常用)GET方法就是通过URL传值,一般我们是可以在地址栏看得到的。就是这种形式http://www.baidu.com?word=“xxxx”。POST传值一般我们是看不到的,但是我们可以通过抓包看得到。做模拟登录最重要的就是保存cookie。cookie是一种会话技术,http连接是一种无状态的连接,网站不知道是谁发送的请求,需要一种标识来记录用户身份。Cookie是由教务系统服务器端生成,发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求教务系统网站时就发送该Cookie给服务器。Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。所以咱们发送完数据的时候记得保存cookie。到时候咱们再请求页面的时候直接发送cookie就可以了。
下面我以中南民族教务系统演示一下抓包。
打开中南民族大学教务系统首页,输入学号和密码。

这里写图片描述

    在点击登陆之前按下F12,我们通过谷歌浏览器自带的这个抓包就可以了。当然你也可以用你习惯的抓包工具。F12,在上面一栏点击NetWork。![这里写图片描述](https://img-blog.csdn.net/20150801160718361)

点击登陆,然后注意看看下面控制台的变化。
这里写图片描述
咱们一点击登陆,浏览器就发了这么多请求,到底哪个是咱们想要的呢请求呢?找到第一条POST请求。右键,我们看看浏览器发了什么给教务系统系统服务器。
这里写图片描述

这里写图片描述
看图中的1和2是我的账号密码,浏览器就是把DATA下面的数据通过POST形式发送给教务系统服务器的。下面我们通过代码来模拟浏览器的行为。
右键第一条POST请求,选择Copy as CURL。
这里写图片描述
把复制出来的东西粘贴到编辑器里,待会会用到。
这里写图片描述
curl开头的这一行是我们请求的地址。
-H开头的都是请求头。
-data开头的是我们要模拟发送的数据。
这里我们只需要留:curl和-data开头的就行了。
curl:
http://ids.scuec.edu.cn/amserver/UI/Login
–data :”IDToken0=&IDToken1=我的账号&IDToken2=我的密码&IDButton=Submit&goto=aHR0cDovL215LnNjdWVjLmVkdS5jbi9pbmRleC5wb3J0YWw”%”3D&encoded=true&gx_charset=UTF-8”
这时可以清空控制台下面的请求了。待会继续看成绩的页面也抓包,主要是为了获取成绩页面的URL地址。这里说明一下:我这里不是直接进的教务系统,而是进的信息门户,信息门户集成了中门民族大学的大部分系统。中南民族大学教务系统有验证码,模拟登录起来比较麻烦,所以我就绕道而行,如果以后把自动识别验证码做出来的话,可以直接从这里模拟登录。不过有学校的教务系统有漏洞,不用验证码也可成功登录。带验证码登录的我也做过,就是靠人工识别,自己写程序识别识别率不是很高,经常导致模拟登录失败。废话不多说了。咱们把请求成绩的URL地址找出来。你根据你自己的情况来。我这里是先跳转到中南民族大学教务系统,跳转的时候需要再保存一次cookie。然后再点击请求成绩页面。
这两个URL地址在地址栏就可以复制出来。

新建一个test.php文件,咱们用CURL来模拟浏览器登录教务系统:记得保存cookie。

来说一下这个CURL类。
CURL基本的使用方法:
1.初始化,创建一个新cURL资源
2.设置URL和相应的选项
3.抓取URL并把它传递给浏览
4.关闭cURL资源,并且释放系统资源
直接上代码,代码里有注释。

<?php
/*
 * 查成绩功能
 *
*/
    $username="你的账户";
    $password="你的密码";
    $cookie_file  = tempnam('./temp','cookie');

   // $cookie_file = tempnam(SAE_TMP_PATH, 'cookie');//在SAE下用这个
    $login_url  ='http://ids.scuec.edu.cn/amserver/UI/Login';//信息门户登陆地址
    $post_fields ="encoded=true&goto=aHR0cDovL215LnNjdWVjLmVkdS5jbi9pbmRleC5wb3J0YWw=&gx_charset=UTF-8&IDButton=Submit&IDToken0=&IDToken1=".$username."&IDToken2=".$password;//这是post的数据
    $ch = curl_init($login_url);//初始化
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//这儿参数1,不输出,后面如果有输出函数也能输出页面
    curl_setopt($ch, CURLOPT_POST, 1);//使用的是post方法,参数为1
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);//需要post的数据
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);//这句的作用就是保存cookie
    $content=curl_exec($ch);
    curl_close($ch);

    //模拟登陆教务系统
    $url='http://ssfw.scuec.edu.cn/ssfw/j_spring_ids_security_check';//这是转到教务系统页面
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);//这里会用到前面保存的cookie
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
    $contents = curl_exec($ch); //执行,得到是字符串,赋值给contents,$contents变量的类型是string
   // print_r($contents);
    //die;

    //成绩查询页面       
    $url='http://ssfw.scuec.edu.cn/ssfw/zhcx/cjxx.do';//这次请求的就是成绩页面
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);//这里会用到前面保存的cookie
    $contents = curl_exec($ch);
    curl_close($ch);
    print_r($contents);

运行一下这个文件,看看,已经可以抓到成绩的页面了,咱们再成正则表达式把我们需要的内容提取出来。咱们只需要这个学期的成绩。好,继续加代码。这里写图片描述

<?php
/*
 * 查成绩功能
 *
*/
 //header('Content-Type: text/html; charset=UTF-8');
   function chengji($username,$password){
    //$cookie_file  = tempnam('./temp','cookie');
    $cookie_file = tempnam(SAE_TMP_PATH, 'cookie');//在SAE下用这个
    $login_url  ='http://ids.scuec.edu.cn/amserver/UI/Login';//信息门户登陆地址
    $post_fields ="encoded=true&goto=aHR0cDovL215LnNjdWVjLmVkdS5jbi9pbmRleC5wb3J0YWw=&gx_charset=UTF-8&IDButton=Submit&IDToken0=&IDToken1=".$username."&IDToken2=".$password;//这是post的数据
    $ch = curl_init($login_url);//初始化
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//这儿参数1,不输出,后面如果有输出函数也能输出页面
    curl_setopt($ch, CURLOPT_POST, 1);//使用的是post方法,参数为1
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);//需要post的数据
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);//这句的作用就是保存cookie
    $content=curl_exec($ch);
    curl_close($ch);

    //模拟登陆教务系统
    $url='http://ssfw.scuec.edu.cn/ssfw/j_spring_ids_security_check';//这是转到教务系统页面
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);//这里会用到前面保存的cookie
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
    $contents = curl_exec($ch); //执行,得到是字符串,赋值给contents,$contents变量的类型是string
    curl_close($ch);

    //成绩查询页面       
    $url='http://ssfw.scuec.edu.cn/ssfw/zhcx/cjxx.do';//这次请求的就是成绩页面
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);//这里会用到前面保存的cookie
    $contents = curl_exec($ch);

    if(!empty($contents))
      {
        $match="|(<=<td>).*(?=</td>)|";
        preg_match_all( '/<table class="table_con" base="color3" width="100%" border="0" align="center" cellpadding="0" cellspacing="0">[^>]*>([\s\S]*?)<\/table>/', $contents, $mycontents);//正则匹配成绩那一表格
        $arr = get_td_array($mycontents[0][0]);
        array_shift($arr);
        array_pop($arr);
        $result="-------------我的成绩---------------\n";
        if(count($arr)>0){  
        for($i=0;$i<count($arr);$i++){
            $result .=trim($arr[$i][3]);
            $result .= trim($arr[$i][7])."\n";

          }
        }else{
            $result= "您的考试成绩还没出来哦O(∩_∩)O~";
        }
    }else{
         $result= "登陆教务系统失败!!!";
     }

        return $result; 

 }     

function get_td_array($table) {
        $table = preg_replace("'<table[^>]*?>'si","",$table);
        $table = preg_replace("'<tr[^>]*?>'si","",$table);
        $table = preg_replace("'<td[^>]*?>'si","",$table);
        $table = str_replace("</tr>","{tr}",$table);
        $table = str_replace("</td>","{td}",$table);
        //去掉 HTML 标记
        $table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table);
        //去掉空白字符
        $table = preg_replace("'([rn])[s]+'","",$table);
        $table = preg_replace('/&nbsp;/',"",$table);
        $table = str_replace(" ","",$table);
        $table = str_replace(" ","",$table);
        $table = explode('{tr}', $table);
        //array_pop($table);
        foreach ($table as $key=>$tr) {
                $td = explode('{td}', $tr);
                //array_pop($td);
            $td_array[] = $td;
        }
        return $td_array;
}


到这里咱们的成绩处理就处理完了。根据你的情况处理成绩。
现在我们把他接入微信。
新建一个index.php文件

把上面的成绩页面引进来。
$keywords = explode("+",$keyword);

                $username=$keywords[1];
                $password= $keywords[2]; 
                $contentStr=chengji($username,$password);

“`
58行的这断是把微信发过来的消息拆分,我们约定查询的格式为:成绩+学号+密码。当然你也可以存到数据库里,查询的时候先要求绑定学号,然后再从数据库里面查询。这里我们就直接拆分为三个字段了。
好,把代码打包上传到SAE。咱们来测试一把。
这里写图片描述

成功了。完整代码包下载:点击下载
查询课表,查询考试安排的原理也是一样的。有什么问题联系我,QQ648988391。QQ交流群:429207338

自己动手写一个查询cet成绩的API 这两天闲来无事,学习了一些关于php的curl相关的内容,并利用curl和simple_html_dom做了一个查询cet成绩的API,在这了分享出来。    我利用的是学信网的查询地址。http://www.chsi.com.cn/cet/,可以看到,我们需要根据准考证号和姓名来进行查询,幸运的是,它不需要用验证码,但不知道它的后台是用post还是get方式来接受,所以,先输入一个数据查询 阅读详情

相关推荐

微信查成绩——正方教务系统

SAE代码、支持正方教务系统,突破验证码

微信开发)PHP curl模拟登陆教务系统查询成绩查询课表实现微信查成绩差课表功能

最近微信开发特别火,刚学会helloword的我也去玩了一下。做了一个微信查成绩、课表考试安排,图书借阅情况,一键续借的微信公众账号。做了几天,从只会echo到这个公众账号完成,遇到了不少问题,也学到了不少东西。现在写出来算是总结吧。也给需要的同学一个参考的例子。下面以中南民族大学教务系统为例。      一.原理        模拟登陆的原理是这样的,当我们登陆教务系统的时候,我们把学号

xiaoxiaobai2015的专栏 90万+

正方系统查成

如果你们学校还能够用xsjicx.apsx等代码,就没必要下载这个了。这个软件算是查成绩的绝版了吧,之前我有找出近10个查成绩的方法,反正都是改网址的方法,只是代码不一样而已。后来悲剧了,全被封了。这个是唯一存活的,一般这个是不会被封的。

【亲测免费】 教务系统微信小程序使用教程

教务系统微信小程序使用教程 1. 项目的目录结构及介绍 student-information-system-wechat-applet/ ├── app.js ├── app.json ├── app.wxss ├── config.js ├── package.json ├── README.md ├── LICENSE ├── pages/ │ ├── index/ │ │ ├─...

gitblog_00302的博客 956

案例189:基于微信小程序的高校教务管理系统设计与实现

互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用基于web的高校教务管理系统可以有效管理,使信息管理能够更加科学和规范。基于web的高校教务管理系统使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。

2301_79727522的博客 1497

忙里偷闲第三弹:开发成绩查询微信公众

1、先上个图 2、具体的实现步骤就不写了,慕课网上有基础教程,这个项目的源代码可以在我的github看,还有一些bug未解决。https://github.com/Vito-Yan/WeiXinMY 3、我这里把实现思路讲一下,还有遇到的一些巨坑。 实现思路: 1、注册微信公众订阅号(个人只能注册这个) 2、把开发文档前半部分通读几遍 3、搞个内网穿透服务器ngrok或...

dianhuang8011的博客 224

求高手指教,我有一个会员登陆文件页面,我想在会员点登陆弹出新窗口,然后自动关闭登陆窗口,就象腾讯2007版的官方会员网站http://my.qq.com上面的那个登陆窗口一样

求高手指教,我有一个会员登陆文件页面,我想在会员点登陆弹出新窗口,然后自动关闭登陆窗口,就象腾讯2007版的官方会员网站http://my.qq.com上面的那个登陆窗口一样我的登陆文件如下,请问怎么样修改,也可以到我的网站上看看实列,我的网站http://blog.17175.org请指教啊,高手来response.expires = 0   response.expiresabso

beijing17175的专栏 2102

基于微信小程序的教务查询系统的设计与实现

目录 1 绪论 2 1.1 研究背景 2 1.2 教务查询系统的现状和发展前景 3 1.3 系统的技术架构 3 1.4 论文框架 4 2 系统需求分析 5 2.1 系统概述 5 2.2 系统功能需求 5 1.用户登录 5 2.首页 5 3.公选课信息查询 5 4.学校校历 6 5.考试查询 6 6.成绩查询 6 7.等级考试 6 8.新闻公告 6 9.我的课程 6 10.个人信息 6 2.3 系统用例图 6 2.4 技术平台 7 2.4.1 Spring Boot 7 2.4.2 微信

weixin_40228600的博客 9227

正方系统成绩查询详细技术贴

去年那个改域名的方法已经失效了,下面介绍新的查成绩方法 : 1、下载安装Google Chrome 浏览器。 2、使用Chrome打开教务处,登录进入系统。 3、随便右击某一菜单,比如信息维护,选择审元素。 4、下面的代码框自动定位到蓝色显示的一行:   5、在这一行上右击,选择Edit as HTML。然后复制这一段代码(不包括引号)“<A

Elegantwww 7896

ICCMO微信公众账号开发系列(1)接入微信公众账号

目录    一、申请微信公众账号    二、申请空间并上传代码    三、接入微信公众平台    四、发送一条微信信息并得到回复      效果如下:         马上来搭建我们的微信公众号吧O(∩_∩)O哈! 一.申请微信公众账号 ①.如果你还没有自己的微信公众号,赶紧去注册一个 点击这里去注册(是微信公众号哦,不是微信号)如果你已经申请了,请跳

Iccmo的博客 1921

python-scrapy模拟登陆网站--登陆青果教务管理系统(一)

前言:第一篇,分析青果教务管理系统登陆模块,理清思路第二篇,使用常规的python常用库 requests来实现模拟登陆第三篇,使用scrapy来实现模拟登陆目的在于了解模拟登陆网站的要点和方法,了解http请求的一些知识。(1)本例子背景介绍青果教务管理系统是许多大学正在使用的教务管理系统,现在市面上我知道使用比较多的两个教务系统,一个是青果教务管理系统(大概几百所,我大概),一个是正方教...

qq1164014750 3万+

PHP模拟登陆正方系统获取课表成绩(一看就懂!!!)

最近很多人问我到底怎么模拟登陆正方系统来抓取课表成绩的,其实如果你知道了浏览器是怎么和服务器交互数据的话,实现起来就很简单了。 当我们输入学号、密码后点击登陆,浏览器会把我们的学号、密码或者验证码,post到服务器的一个地址,服务器接受到POST请求后,首先验证验证码是否正确,然后验证学号、密码是否正确,如果其中有一个不正确的话,直接返回验证码错误或者学号不存在或者密码错误。如果匹配正确,那么...

einstein10147的专栏 3539

微信查成绩php源码,PHP-Educational-Administration

微信查询教务处成绩、用户信息===============基于ThinkPHP5 基础上开发微信查成绩、发红包等ThinkPHP5的运行环境要求PHP5.4以上。目录结构初始的目录结构如下:www WEB部署目录(或者子目录)├─application 应用目录│ ├─common 公共模块目录(可以更改)│ ├─index ...

weixin_42408094的博客 383

今日头条视频采集方法

这是一个视频网址:http://www.toutiao.com/a6372122640186720513/ (首富马云小品首秀,搭档宋小宝却当面把首富们都损了一遍) 访问。在页面JS脚本中找到 var player; player={ videoid:’8c601b01d1b24ff9b543f3b378b707ea’, share_url:’http://toutia

redsen的专栏 9312
上一篇: ICCMO微信公众账号开发系列(2)打造微信聊天机器人
下一篇: mysql报错:Duplicate entry ‘1’ for key ‘PRIMARY’
Iccmo
博客等级 码龄11年 3粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值