教务系统
本文将讲一下如何通过Node.JS登录正方教务系统并获取用户信息。
本文涉及的正方教务系统有一个特点,就是地址中必须包含一串随机代码,例如:
链接地址后缀
本文要求【观看者】有两个要求网校哪个好,满足其中任何一个即可理解。
对于有了解的人,会有专家指导。
如果你满足以上任何一个条件,那么就可以看我一步步来啦~
如何获取学校教务系统的IP地址?
通过【终端】ping学校教务系统,获取IP。这一步是为了保证后面请求中验证码的正确性做准备。
【赢】
Win键+R键输入xx.xxxx.xx
【苹果】
⌘键+空格键输入终端 ping xx.xxxx.xx
注意:需要删除或
PS:教务系统IP获取! ~
如何分析需要准备的一切?
登录界面
【直观看到】
用户名 密码 验证码 身份信息
【非直观】---用浏览器F12打开控制台
单击单击登录按钮单击?.aspx 查找表单数据
请求清单
大致如上图所示,此时你可能想知道为什么有这么多。别担心,这些东西大部分都是因为学校懒得删除而留下来的。您可以输入您的个人信息正方教务系统,点击登录正方教务系统,查看需要输入的内容。
PS:获取所需的数据分析! ~
如何解决验证码问题?
我们登录教务系统的难点只有两个:一是接口请求,二是获取验证码。这个老版本的教育系统是用.Net编写的,所以我们只能通过请求下载来获取验证码。
F12打开控制台,从标签上找到验证码。验证码的URL以.aspx结尾。
这时就无法按照传统的图像链接方法进行处理了。我们可以这样理解。首先这个验证码必须是动态地址。那么我们如何获取这个动态地址呢?我们有一个学术管理系统的链接,xxx.xxx.xxx/()/.aspx。我们来做个假设。我把xx.aspx放在链接后面的验证码上。是这样吗?好的? (经过我的实际实验,是可以的,我们的验证码问题就解决了)
PS:获取验证码问题的解决方案! ~
参数中有奇怪的长数据怎么办?
请求参数的表单数据很长。这里都是什么?说实话,我不知道那是什么。我只是知道有这样一个标签隐藏在页面结构中的一个小地方才能找到它。
隐藏标签
您可以通过搜索[ctrl/⌘ + F]找到该标签。
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 }); }); }); };
提供使用模块的现成版本。
PS:获取验证码数据接口获取! ~
登录界面怎么写?
// 获取系统主页面 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 }); }); }); };
提供一个现成的,主要使用“解构赋值”和模块。
PS:登录界面搞定! ~
本文主要记录模拟登录正方教务系统时遇到的问题解决方法和思路。如果确实遇到困难,可以私信或者在下面评论,我会及时回复提供帮助。