![23f7d5916d19a07f1b3a72ad41b88eab.png](https://i-blog.csdnimg.cn/blog_migrate/1c96ea82eff2327f0c842669a8bde64b.jpeg)
教务系统
本篇来讲讲如何通过Node.JS登录正方教务系统并且获取到用户信息。
本文涉及到的正方教务系统有一个特点,那就是地址必须带有一串随机码比如:
![2d91f04bad2b571b3ff58175589393cc.png](https://i-blog.csdnimg.cn/blog_migrate/db7c508013bafa681919b74543242671.jpeg)
链接地址后缀
本文需要【查看者】有2个要求,满足其中任何一个即可看懂。
- 对NodeJs有了解
- 有专人辅导
如果你已经满足上面条件的任一项,那么接下来就可以看我是如何一步步操作滴~
如何获取学校教务系统IP地址?
通过【终端】ping通学校教务系统,获得IP,这个步骤是为了后面在请求中保证验证码正确做准备。
【win】
- win键 + R键
- 输入cmd
- ping xx.xxxx.xx
【mac】
- ⌘键 + 空格键
- 输入终端
- ping xx.xxxx.xx
注:需要去掉http://或者https://
PS:教务系统IP get!~
如何分析都需要准备的东西?
![e20cf927c4880c3a2f3810376fa5ff49.png](https://i-blog.csdnimg.cn/blog_migrate/4670a4d7096a3f2497f0ff0ec012ac41.jpeg)
登录界面
【直观看到的】
- 用户名
- 密码
- 验证码
- 身份
【非直观看到的】---Chrome浏览器F12打开控制台
- 点击network
- 点击登录按钮
- 点击default?.aspx
- 找到form data
![8c2284e43869e47e48f4fd6d84671b5b.png](https://i-blog.csdnimg.cn/blog_migrate/35c3f526ebc9fd98c1629baed2a3bfe8.jpeg)
请求列表
大概如上图所示,此时你可能会想,为什么有这么多。别急,这些东西大部分都是学校懒得删才留下的。你可以输入你的个人信息,点击登录,查看都哪些是需要输入的。
PS:需要的数据分析 get!~
验证码问题如何解决?
我们实现登录教务系统只有2个难点:一个是接口请求,一个是获取验证码。这种老版的教务系统都是采用.Net写的,所以我们要获取验证码只能用请求的方式去下载它。
F12打开控制台,从标签中找到验证码,验证码的url是.aspx结尾。
此时就不能按常规图片链接方式处理了,我们可以这样理解,首先这个验证码肯定是一个动态地址。那么我们如何获得这个动态地址,我们有教务系统的链接,xxx.xxx.xxx/(xxxxxxx)/default.aspx,做一种假设,我把验证码上的xx.aspx放在链接的后面,是不是就可以了?(经过本人实际实验,是可以的,我们的验证码问题就解决了)
PS:验证码问题解决方式 get!~
参数里有个奇怪的长长的数据怎么办?
在请求参数的form data中有个很长的_VIEWSTATE。这里都是啥呢?说实话我也不知道是什么,我就知道在页面结构中,有个很小的地方藏着这么个标签能找到它。
![5fc7e91bec7ccc2341cfdd206fd70e36.png](https://i-blog.csdnimg.cn/blog_migrate/5016eeaf922357ef3824be2e934dfb3e.jpeg)
隐藏的标签
通过搜索【ctrl/⌘ + F】查找_VIEWSTATE就能找到这个标签。
PS:又长又奇怪的参数解决 get!~
怎么写获获取验证码数据的接口?
const hostUrl = '学校教务系统IP';const getCodeUrl = ctx => { return new Promise((resolve, reject) => { superagent .get(hostUrl) .charset('gb2312') .set(headers) .end(function(err, res) { console.log('res', res); const body = res.text; // 获得重定向地址 const systemUrl = res.redirects[0]; // 获得codeUrl后缀 $ = cheerio.load(body); const viewState = $('#form1 > input')[0].attribs.value; // 替换返回验证码地址 const codeUrl = systemUrl.replace(/default2.aspx/, 'CheckCode.aspx'); resolve({ codeUrl, viewState, systemUrl }); }); });};
提供一份现成的,里面用到了superagent模块。
PS:获取验证码数据接口 get!~
怎么写登录接口呢?
// 获取系统主页面const getMainSystemUrl = payload => { // 传参 const url = payload.systemUrl; const __VIEWSTATE = payload.__VIEWSTATE; const data = { __VIEWSTATE, txtUserName: payload.txtUserName, Textbox1: '', TextBox2: payload.TextBox2, txtSecretCode: payload.txtSecretCode, RadioButtonList1: '%D1%A7%C9%FA', Button1: '', lbLanguage: '', hidPdrs: '', hidsc: '' }; return new Promise((resolve, reject) => { superagent .post(url) .charset('gb2312') .set(headers) .send(data) .end(function(err, res) { const mainSystemUrl = res.redirects[0]; const body = res.text; $ = cheerio.load(body); const stuName = $('#xhxm') .text() .replace(/同学/, ''); resolve({ url: mainSystemUrl, name: stuName }); }); });};
提供一份现成的,里面主要是用到了“解构赋值”和superagent模块。
PS:登录接口 get!~
本文主要是记录了在模拟登录正方教务系统时所遇到的问题解决方式和思路。如果实在有遇到困难的地方可以私信或者下方评论,我看到后会及时回复帮助。