数字杭电 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<={$_loginCookie['lt']}
而不要使用数组的形式传入。虽然 PHP 的官方文档上说两种方式都支持,但是我使用数组的方式传入的时候,模拟登录一直都不成功。也不知道是为什么。
获取跳转的 URL
登录成功后我们会转到一个页面,里面有一段 JavaScript 代码,用来跳转到之后的页面。这个页面的内容在 Chrome 的开发者面板并不能看到。只能抓包获得。 用正则表达式取出代码中的那一行 URL。然后直接 GET 访问就行了。
跳转到的页面
其实真正登录时,当跳转到这个页面时,后面还有好几层跳转。但是我发现在这个页面就有教务系统的 Cookie 了。因为 Cookie 是在这个页面上创建的,所以在返回头里可以看到 Set-Cookie
,从这里就可以拿到 Cookie 了。并不需要再用 curl
的 COOKIEJAR
去保存 Cookie 到本地的文件再读取。
嘿嘿嘿
至此,我们就拿到了登录教务系统的 Cookie 了,一个是 ASP.NET_SessionId
,一个是route
。
然后嘛,就没有然后啦~
代码放助手 Git 仓库了。话说我的账号密码都在上面...... 希望各位大佬不要搞事。
喜欢这篇文章?为什么不打赏一下呢?