音符·代码·脑洞

不想当程序员的歌手不是好指挥。

0%

解析易班自动签到的逻辑+Nodejs实现

易班+uni-app

下载易班APP,稍微进行一些测试,我便发现了易班和学校签到系统进行连接的基本套路。首先,我校的签到系统是一个通过易班统一认证登录的第三方系统。易班所有的第三方应用都是依靠h5实现的,并且可以通过右上角的按钮获取第三方应用的页面链接。这就非常方便我们调试和抓包了。复制一下应用链接到浏览器,就可以获得我校签到系统的域名,从而扒出开发公司、法人是谁等等等等……这就是八卦的快乐吗!

打开调试窗口,观察源码,也能发现这个系统基于uni-app,而uni-app的页面逻辑是以vuejs为基础的,还正好就撞在我的专业上(

uni-app的优势是一套代码可以全平台发布,安卓、苹果手机都不用再重新写一套前端逻辑,可以直接复用。但缺点也非常明显,就是能够轻松地通过浏览器获取H5页面链接、js代码等等,然后进行分析、破解。

易班登录——RSA加密

任何软件或网站都不应该将用户输入的密码以明文直接在客户端和服务端间传送,易班这一点做的还不错。易班网页版的登录入口,是将用户输入的密码进行RSA加密后再发送到后端,后端再进行解密获得原始数据。这样不仅可以防止用户密码在传输过程中泄露,并且还可以获得用户输入的原文。

易班的登录逻辑很久以前就有人实现过了,参考这篇文章:python requests 简单实现易班自动登录,批量_文章发布,投票发布,评论,点赞,v2.0 - jum_blog - 博客园 (cnblogs.com)

OAuth链接第三方应用

易班开放平台上有关于第三方网站接入的文档:易班开放平台wiki文档 (yiban.cn)

其实不看文档也罢。简单来说,平常我们签到时,是从易班的界面上点击一个入口按钮,打开一个新的浏览器,页面跳转几次之后才显示签到系统的界面。在这几次页面跳转之间,已经完成了易班账号和第三方应用的认证过程。

我们在浏览器上还原一下这个过程,发现最后一次重定向的网址中就包含了认证凭据。我们就可以利用这个凭据,模仿正常请求的格式,调用签到的API实现自动签到。

具体的签到页面逻辑,可以通过阅读页面源代码来获得。

源码与自动运行

源码我上传了Github一份,仅供交流学习使用:LiCasey/yiban_autosign (github.com)

至于自动运行,我选择将代码部署到一台闲置服务器上,并配置cron定时任务,教程可参考这篇文章:linux定时执行脚本 - jihite - 博客园 (cnblogs.com)

写在最后,一些吐槽

我并不反对每日签到打卡,疫情期间,按时上报体温是每个人都要承担的责任。但我反对学校以每日签到打卡作为理由,强制要求学生下载易班app、关注公众号等等类似的行为。

我校的签到系统既然是基于Uni-app开发,就说明在设计初期的定位并不仅仅是作为易班的第三方应用,而是完全可以整合在公众号、小程序、网页中,甚至可以打包为独立的APP,强制接入易班显得十分刻意和强行。并且可笑的是,易班作为app的主体,所有经常使用的实际功能都是由第三方应用实现的。

愿世界再无易班!