本项目使用到的相关技术(极其简单):
- Springboot
- Jsoup
项目地址:https://github.com/ALL-AC/YiBanLogin.git
一、前期思路
这部分很重要,虽然没能完美解决问题,但最终方案是在这个基础上做成的,因此最终方案就不做过多的讲解。
(一)、爬虫篇
易班官网的登陆页面:
1、详细步骤
接下来要先登陆一次,通过抓包(我用的是Chrome,其他工具也可以),把必要的信息都记录下来:
-
先把已经登录的帐号退出,然后进入登录界面,按F12打开浏览器调试工具,先清空,再勾选上日志记录功能:
-
然后输入用户名和密码,进行登陆。登陆成功后,选择XHR中的doLoginAjax,可以看到相关登陆信息:
登陆提交的URL:
其中,account为账号,captcha为验证码,keysTime时间戳(长时间不登录,登陆页面会过期),重点的是password这个密码部分,能发现该密码是通过前端加密后再进行提交的。那我们就要先清楚其加密方式,才能进行下一步操作。
-
再次退出登陆,回到登陆页面,通过控制台的选元素箭头,将登陆按钮所在的元素选中,进行观察:
复制该登陆按钮的id,在控制台进行全局搜索(Chrome是ctrl+shift+F),找到相关的js文件:
进入该文件进行分析,可以轻易的找到登陆模块的代码,如下:
到这里,首先要搞清楚JSEncrypt用的是什么加密算法?还有其公钥是什么?
经过百度,得知JSEncrypt用的是RSA加密算法,而且由上图可知公钥可以从页面中id=login-pr的元素中得到。返回页面进行搜索,得到:
其实,到了这里,基本就能写出模拟登陆的代码了。
-
这里我直接使用的是java中的Jsoup来进行模拟登陆,毕竟后面还要暴露后端的登陆接口,用java来写简单又快捷,大概的方法如下(我直接在Markdown写的。。可能并不准确,体现出逻辑而已):
public static String login(String username, String password, String url) throws Exception { // 连接登陆页面 Response response = Jsoup.connect(url) .header("User-Agent", USER_AGENT_VALUE) .method(Method.GET) .execute(); Document page = Jsoup.parse(response.body