原理
先取COOKIE和验证码图片,然后PHP模拟用户进行POST请求登陆。
抓包分析
我是用Windows系统下的Fiddler
抓包的,当然你也可以用chrome自带的开发者工具
来抓,只要抓到我们登陆时POST请求
就好.
这个表单就是我们用户登录上去时POST请求的表单数据
,还有一个暗藏的__VIEWSTATE
其实是隐藏在登陆页的登录表单中,
然后把cookie附在header里了。
ASP.NET_SessionId=pybgm0i40egzq12db3tteo55
所以PHP只要模拟提交 组装好的表单
& cookies
,就能模拟用户登陆。
前期准备
我把用户登录页(GET方法),到模拟登陆后页面的呈现(POST方法)都写在同一个php文件里,所以我通过$_SERVER['REQUEST_METHOD']
来判断。
1 | header('Content-Type: text/html; charset=gb2312'); |
用户登录页
找到cookie & 隐藏信息
1 |
|
模拟登陆页
取用户输入数据 & 组装POST数据
1 | /* |
模拟登陆
1 | /* |
结果显示
看到熟悉的字眼,说明已经正常登录了。那么接下来的[个人课表]、[成绩查询]的原理也是相近的。
遇到的问题
获取验证码
需要第一次用curl去请求教务系统,取得cookie,并把cookie保存下来,再用这个cookie去请求验证码图片,就能得到正确的验证码。验证码有效性
我发现只要是同一个cookie,无论你是第几次请求验证码页面,得到的任意验证码拿去post都能正常登录。多用户登录
我命名验证码图片时,都在后面加了时间戳保持各自独立性,确保多用户登录时不会共用一个验证码出现错误。用户主页信息获取
因为正方系统正常登录后,会跳转到url/xs_main.aspx?xh=学号
样式的个人主页,所以用curl时要配置好header,不然会报错。用户输入
因为只是做演示,所以没有对用户输入的数据进行过滤。
自认水平非常一般,但是把模拟登陆过程记录在此,当是笔记。
附上:测试地址
完整代码稍后会放在Github.