数字杭电 CAS 认证系统模拟登录

今天体育课在和同学吃鸡的时候,部长 QQ 上找我说让我去尝试爬一下教务系统的学生推荐课表。
最近只是看书确实有点无聊,是该写点东西了。便答应了。部长的声音真好听!

每个学生的教务系统推荐课表都是不一样的,并且每个人也只能看到自己的课表。因此需要模拟登录进入教务系统再爬取。
回到宿舍后打开数字杭电,先是拿自己的号登录了一下。最初只是用 Google Chrome 的开发者面板分析请求头的,但是发现 Chrome 并不能显示那些直接跳转没有被加载出来的页面的内容。无奈打开了强大的 花瓶Charles 抓包。

数字杭电登录页

首先先是数字杭电的登录页。进去该页面后会生成两个 Cookie,分别是 key_dcp_cas route,这两个 Cookie 在第二步的 POST 请求时是需要的。并且还有一个 lt参数,来自于登录表单中的一个隐藏文本域中,这个也是不可以缺少的。

POST 请求登录

在点击登录按钮后,我发现它是向当前页面发送 POST 请求,参数中包含学号以及 md5 过后的密码。(我们可以找到用来进行 md5 加密的 JavaScript 文件)在 HTTP 请求头中还需要加上我们在上一个页面获得的 Cookie。

一个坑

在这里我遇到了一个坑,折腾了我一个下午。
PHP 中使用 curl 进行 POST 请求时,发送的数据时:

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

其中的转悠 $postData 最好是 urlencoded 的格式的字符串来:

service=http%3A%2F%2Fjxgl.hdu.edu.cn%2Fdefault.aspx&username=12345&password=12345&lt={$_loginCookie['lt']}

而不要使用数组的形式传入。虽然 PHP 的官方文档上说两种方式都支持,但是我使用数组的方式传入的时候,模拟登录一直都不成功。也不知道是为什么。

获取跳转的 URL

登录成功后我们会转到一个页面,里面有一段 JavaScript 代码,用来跳转到之后的页面。这个页面的内容在 Chrome 的开发者面板并不能看到。只能抓包获得。
用正则表达式取出代码中的那一行 URL。然后直接 GET 访问就行了。

跳转到的页面

其实真正登录时,当跳转到这个页面时,后面还有好几层跳转。但是我发现在这个页面就有教务系统的 Cookie 了。因为 Cookie 是在这个页面上创建的,所以在返回头里可以看到 Set-Cookie,从这里就可以拿到 Cookie 了。并不需要再用 curlCOOKIEJAR 去保存 Cookie 到本地的文件再读取。

嘿嘿嘿

至此,我们就拿到了登录教务系统的 Cookie 了,一个是 ASP.NET_SessionId,一个是route
然后嘛,就没有然后啦~
代码放助手 Git 仓库了。话说我的账号密码都在上面…… 希望各位大佬不要搞事。

打赏

2 条评论

 

昵称
  1. hqqps

    github地址留一下

    1. John

      这是旧版的数字杭电登录了,新的杭电 CAS 模拟登录我也写了。不过因为一些原因不方便开源,抱歉。