本文章仅用作于学习
前提:最近期末到来,想第一时间看到新出成绩的,于是就有了爬取学校教务系统自己的成绩并通过Qmsg酱推送到自己QQ上的想法,目前完成了模拟登录的阶段。
- 分析思路用到了这个帖子(点击查看)
进入正题:
- 分析登录网页
打开教务系统的登录页面,F12 点击到Network分析,不输入账号密码,点击刷新
![b4964e2795fc4fc1562d9c0d7ee114dd.png](https://i-blog.csdnimg.cn/blog_migrate/6e94181b827f52ae5df7628f3856e80d.jpeg)
可以看到前两个东西带有logon字样,不用想肯定和登录验证有关
接下来输入账号,密码再试一次
![8ae629f3801d65f761ebb5a63fe93592.png](https://i-blog.csdnimg.cn/blog_migrate/83cc6e21951a102a11172b4a69d0d324.jpeg)
发现还是没变化,那我们点开第一个数据看看详情
![5572dc49a8a3a8118cad508f10e806fa.png](https://i-blog.csdnimg.cn/blog_migrate/89054a7bdaacaa9f3c9a49d26bd689ec.jpeg)
我们看到第一个数据的链接,上面看到flag字样,肯定代表的是服务器分发给客户端某种标识,点到headers看看详情,发现这时候已经已经出现了一个cookie,我们接着往下面看
![0f9fb72e5d8f00764d40b29c3fcfd1b4.png](https://i-blog.csdnimg.cn/blog_migrate/e42d71cf817941c22f663bf6e57e473e.jpeg)
我们可以看到是post请求,我们不难想到一般post的请求都是提交了某种表单,好,那我们接着翻下去看看(这里我们应该是看左边红框里面刷新的刷新的,但是我写这个文章的时候才发现,不过并不影响接着分析)
![2e1364b13faf11b6e6796cd0360e4cbd.png](https://i-blog.csdnimg.cn/blog_migrate/b68f041acdc9d734ee889bf4adbffe2b.jpeg)
我们发现cookie和前面尝试登陆的cookie一样,这个cookie也代表这服务器分发给客户端,代表一种标识,以后的访问都会带有这个cookie,那我们肯定要保存下来。又可以看到form data里面提交的表单,好像跟我们提交的填写的账号密码一点关系都没有。。。。这是教务系统!!!肯定不是明文传输啊,提交的数据肯定是经过加密了的表单。那我们这次成功登陆再看看这些数据。
![536cc94188484b88f68602340f5310f6.png](https://i-blog.csdnimg.cn/blog_migrate/444b6c87d29e923c3217445153e75a79.jpeg)
我们登陆进去了,可以看到cookie还是跟前面的一样,那我们的猜测是没有错的,我们得保存第一次请求的cookie,以后所有的访问都要带有这个cookie,然后再看到表单的地方,我们发现view 和 usedogcode 没变化 但是encoded和randomcode有了数据,看出了什么,randomcode的表单数据不就是上一张图我们填写的验证码嘛,好我们弄清楚了randomcode代表的数据。我们再看看encoded,我发现这个encoded里面提交的数据竟然和我的账号密码有点相似。这个数据那这无疑是加密过后的账号密码。那这个是不是固定不变的呢?或者说这一串数据仅仅通过某种固定的变化对账号密码加密。我们退出重新登录看下有没有变化。
![ec63373c037ae1b8c52c77e8903ddc07.png](https://i-blog.csdnimg.cn/blog_migrate/fd8745bad2b47f274b21de3bd995de15.jpeg)
结果发现是有变化的,好。。。。接下来该怎么办呢。。。那我们不妨去看看登录页面的源代码:
![7a498c6c3a6e3515f2af397c1cbc67c9.png](https://i-blog.csdnimg.cn/blog_migrate/4cd3b28012786cbca349911a71b3cb6f.png)
我们看到表单的位置,提交时候调用了js函数,我们不妨搜索函数的位置一探究竟
![3697677a341443d7f1003249c3709766.png](https://i-blog.csdnimg.cn/blog_migrate/1340f80f50c600ba212aa75ff6fb9a95.jpeg)
我们用浏览器自带的搜索工具Ctrl+F,找到函数的位置,果然这个地方就是对我们账号密码加密的位置,但是好像没那么简单,我们看到success后面又调用了函数里面还传递了一个形参。。。我们把它专门拿出来看一下:
![5351594ecc7905c63ebb60f35e6f0391.png](https://i-blog.csdnimg.cn/blog_migrate/c0af799006b34f9a4c3472cdc462d27a.png)
不难发现,这个函数里面对传过来的形参#号位置分割之后,就对我们账号密码和形参传过来的字符串的一套猛如虎的操作(我也看不懂,看不懂没关系)后组成了我们的encoded。不是python无所不能嘛,哈哈哈,理所当然我们就想到了execjs库,可以用来跑js代码,然后用python直接获取加密后的数据。但是这个形参是从那里传来的呢,我们看到strUrl变量被赋值了一个url链接的一部分,好像很眼熟,对,其实我们在之前见过了。下图红框:
![6f71639a106a00d129ca452b985c7efa.png](https://i-blog.csdnimg.cn/blog_migrate/6d52259ec3e921518fa00036172ea772.jpeg)
我们直接点进去
![371a9dbe6b6f160c2beaa04c62109af0.png](https://i-blog.csdnimg.cn/blog_migrate/d29672f821d48e95d178671fca37915c.jpeg)
我们看到返回了一个字符串,还带有#号,这就与前面的分析联系起来了。那这就应该是传给形参的参数了。
2. 根据分析写代码
第一步就是应该访问获取形参的参数的地址,获取形参,并保存
- 第二步就是通过获取的形参参数和自己的账号密码组合成加密后的数据:
- 但是我们得把js代码做相应修改保存到本地调用,如下:
![5351594ecc7905c63ebb60f35e6f0391.png](https://i-blog.csdnimg.cn/blog_migrate/c0af799006b34f9a4c3472cdc462d27a.png)
去掉多余代码
第三步携带
- 最后一步,得到验证码的识别后的结果后,模拟登录
def
- 完整代码:
'''
最后代码有很多的缺点,还有待完善的地方,大家可以指出