您好,欢迎光临赵帅的博客,如果有什么不足或者错误之处,感谢您留言指出!

【原创】山东大学刷课 脚本 js+php

php 赵 帅 566浏览 0评论

写在前面

今年山东大学的选课系统大改革,以前的刷课软件都不能用了,哎呀,代码改变世界,在软件这难不到可爱的程序员们。

以前都是用学长们写的刷课软件,感觉特别厉害,炫酷!那么现在自己也是学长了,我们看看能不能也实现一个刷课脚本呢?

接下来我们就用PHP的爬虫机制写一个刷课脚本。

知识准备

JavaScript基础

PHP基础

http请求的原理

Wnmp 工具

原理分析

首先我们要知道目的是要干什么?对,选上自己需要的课!那么就有需求了。

看图,今年山东大学的选课系统和以前的不是特别一样,在选课界面给出来了可以选择的课程,只需要找到自己需要课程,点击添加的+号按钮就能选中,不在需要自己手动去输入 课程号 和 课序号。

比如说我们要选一门 国学尔雅,大家都知道这门课比较难选,需要看人品抽签。

在这选课过程中就会有 http 请求 发出去,我们去控制台(F12)里面去看一下,大概就是下面这样:

我们分析一下这个 报文头里面的内容:

 Request URL:http://bkjwxk.sdu.edu.cn/b/xk/xs/add/sd07510010/600

这个是http请求的路径,我们可以解析一下,大概可以猜出来,add  代表了添加课程的方法,后面的 sd07510010  600  分别代表了课程号课序号。  

Accept:*/*
Accept-Encoding:gzip, deflate                  压缩方法
Accept-Language:zh-CN,zh;q=0.8                 语言
Connection:keep-alive                          连接状态
Content-Length:0
Cookie:yunsuo_session_verify=c92b9dc6d54026ff50a256a2a1093465; JSESSIONID=abc5SQUpuo4YnejIB7qMv; 
       sduxk=0376493b5f3cd03f4463a9891e317b06; index=1; j_username=201400301203; j_password=960105
Host:bkjwxk.sdu.edu.cn                         
Origin:http://bkjwxk.sdu.edu.cn
Referer:http://bkjwxk.sdu.edu.cn/f/common/main
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
           Chrome/55.0.2883.87 Safari/537.36
X-Requested-With:XMLHttpRequest

上面就是http的报文头,比较重要的就是 cookie 。

所以我们需要得到cookie,用cookie来完成http请求。

啊哈,既然知道了原理,我们就试试通过“正规途径”来选到这门课了,

代码介绍

首先我们把一些需要用到的变量定义一下,把自己的 用户名 密码定义完成,填写对应课程号(KECHENGHAO) 和 课序号(KEXUHAO),就可以:

/*定义 根目录 用来保存cookie*/
define('ROOT','D:/cookie.txt');
/*定义 请求的url*/
define('BASEURL', 'http://bkjwxk.sdu.edu.cn');
//用户名密码
define('USERNAME',"201400301244");
define('PASSWORD',"199634juan");
//课程号
define('KECHENGHAO','sd03031450');
//课序号
define('KEXUHAO','100');

下面写一个xuanke.php ,
我们需要用到PHP的 curl 函数,下面代码里面的注释有一些介绍,如果有不明白的可以参考 【原创】山东大学 课程小格(php curl) ,下面是 核心代码:

include_once('config.php');
if(USERNAME && PASSWORD){
    $data = "j_username=".USERNAME."&j_password=".PASSWORD;
    /*设置请求的 url*/
    $log_url = BASEURL."/b/ajaxLogin";

    /*设置 用户 的log信息*/
    $log_path = ROOT;
    /*初始化  curl*/
    $log = curl_init();
    curl_setopt($log,CURLOPT_URL,$log_url);//设置 请求 url
    curl_setopt($log,CURLOPT_REFERER,"http://bkjwxk.sdu.edu.cn");//设置 请求头
    curl_setopt($log,CURLOPT_POST, true);//设置 请求方法
    curl_setopt($log,CURLOPT_HEADER,0);//设置 是否保存 头文件
    curl_setopt($log,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($log,CURLOPT_POSTFIELDS,$data);//设置 post 请求的参数

    /*存放 cookie*/
    curl_setopt ($log, CURLOPT_COOKIEJAR , $log_path); // 存放Cookie信息的文件名称

    curl_setopt ($log, CURLOPT_TIMEOUT, 30 ); // 设置超时限制防止死循环
    curl_setopt ($log, CURLOPT_HEADER, 0 ); // 显示返回的Header区域内容
    $return = curl_exec($log);
    curl_close($log);
    if($return == "\"success\""){
        if(file_exists($log_path)){
            $success = true;
            $main_url = BASEURL."/b/xk/xs/add/".KECHENGHAO.'/'.KEXUHAO;
            $log_path = ROOT;
            $main = curl_init();
            curl_setopt($main,CURLOPT_URL,$main_url);
            curl_setopt($main,CURLOPT_REFERER,"http://202.194.15.33:21043");
            curl_setopt($main,CURLOPT_POST, true);
            curl_setopt($main,CURLOPT_HEADER,0);
            curl_setopt($main,CURLOPT_RETURNTRANSFER,true);
            curl_setopt($main,CURLOPT_POSTFIELDS,$data);//设置 post 请求的参数

            /*读取 cookie*/
            if(file_exists($log_path)){
                curl_setopt ($main, CURLOPT_COOKIEFILE, $log_path); // 读取上面所储存的Cookie信息
            }else{
                echo -1;
                exit;
            }
            curl_setopt ($main, CURLOPT_TIMEOUT, 30 ); // 设置超时限制防止死循环
            curl_setopt ($main, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
            set_time_limit(0);
            $return = curl_exec($main);
            $res = json_decode($return);
            print_r($return."\n");
        }
    }else{
        echo -2;
    }
}else{
    echo -1;
}

上面这些做到了一次请求,那么我们还需要写一个 js 文件,会用到 XMLHttpRequest() 这个对象,然后使用 setInterval() 函数每隔一秒进行一次请求,来自动访问这个 接口:

var time = 0;
var log = "";
setInterval(function () {
    var xml = new XMLHttpRequest();
    xml.open("get","xuanke.php");
    xml.onreadystatechange = function () {
        if(xml.readyState == 4 && xml.status == 200){
            time++;
            log = xml.responseText+"      time="+time+"";
            document.getElementById("content").innerHTML = log;
        }
    };
    xml.send();
},1000);

啊哈,大概就是这样。

测试样例

这样,一但有人退课我们就可以立即选上。

有木有很激动,迫不及待想要试一下,脚本在手,课程我有!

转载请注明:碎念 » 【原创】山东大学刷课 脚本 js+php

喜欢 (11)or分享 (0)