职校家园自动打卡平台开发历程

前言

由于我经常忘记打卡,其实本可以通过苹果手机快捷指令或者小米等自己借助系统便捷或者第三方来实现定时打开某个app,然后如果写了接口逻辑的话,还可以自动打卡,但是像苹果手机只有保持亮屏时,才会执行该操作。而且有些同学想使用其他地址打卡还要虚拟定位。

前几天我突发奇想邀请我室友FDD共同开发一个平台来解决这个问题,这个看起来很简单就一个表单,然后提交账号密码自动打卡;几乎没有技术含量。我想弄这个项目之前,我也是这样想的。就这? 都不好意思拿出来说,但是如果让你面临这个项目深度刨析时你就会发现面临的问题真不少。

这篇前面说的是把自己遇到的一些技术问题分享出来,希望其他开发者遇到同类问题时能避免踩坑,我是从一个个坑里出来的,可能前面说的东西只有懂技术和对技术感兴趣的人才有耐心看下去,如果你不属于这一类,那么你可以跳过踩坑历程,直接看第二个标题“职校家园打卡逻辑探讨”。

踩坑历程

首先呢,其实我自己本就想过用抓包拦截网络请求,来抓出职校家园的请求接口,这样就可以不通过职校家园打卡。然后我因为比较忙,一直没时间搞。前几天在网上看到Andy使用Django开发了一个这样的平台。虽然只有电脑端,手机端没有适配,站点也没域名纯IP,表单也没加任何正则验证。正是这样简陋的站点却是前几天全网唯一一个职校家园打卡平台。

我本想着这样可太简单了,我直接对他页面进行嵌套,就可以拿来自己用。但是我把事情想的简单了,事实上嵌套会被Django的安全机制拦截。于是,我对他站点进行反向代理来绕过这个机制,搭建了一个他站点的镜像站,再嵌套进自己的网站。事实上这样也确实ok,但我还是小看了Django,虽然我能把页面全部代理过来,但Django会拦截我代理站的所有请求。看来Django的开发者早就考虑过这些问题。

经过各种尝试无果后,我决定利用github上XuanRan开源的python脚本自己写个接口。我预想了方案,就是用Windows服务器先运行python打卡脚本,然后设置定时任务,只需写一个表单接口让用户新数据加入。因为我很久没碰代码了,而且我忙着考试没时间。所以就联系了我大学室友FDD,他目前在公司实习,而且代码比我熟练。

给他说了我的方案后,我希望他用JavaScript写一个表单,因为关系比较好,而且需要写的东西也很简单,他很快就去实施了,但是发现JavaScript无法操作本地文件,也就没法让新数据加入。难不成还要用Nodejs的fs模块来操作,然后前面表单页面用axios请求后端接口,这样我觉得大材小用了。但是没有更好的方案,也只能这样的写。

决定用Nodejs写之后,没多久他就写出来了,也在本地测通了。我当时是在部署python到服务器,这是我第二次部署python的项目,属实很多东西都不知道,各种报错,python环境依赖版本不匹配,还有无法读取本地json等等问题,看的我头疼,只能不断的测试解决。在不断努力尝试下,我终于让整个项目成功跑起来。接下来就是Nodejs和python都在服务器部署了。

我选择在宝塔面板部署,对于使用宝塔面板已经3年之久,我相信部署起来Nodejs应该是很简单的事。但是问题又来了,宝塔本次更新后把端口搞废了,端口无法放行,我的项目也就没法跑。我是真不知道这是咋回事,我还以为我服务器的问题,重装还原后问题依然存在。在宝塔论坛发帖求助,有人告诉我这是因为服务器防火墙服务无法正常运行。我就去排查系统防火墙,果然无法正常运行。就在我以为是系统问题时,我看到一个帖子,遇到和我一样的问题,说是升级宝塔版本后出现的。刚好我的另一台服务器的宝塔没有更新,我就去测试。更新前我去看了下端口都正常,我点了更新后就和之前服务器一样所有端口都看不到了。这哪是什么系统问题,明明宝塔更新导致的,但官方不承认,我也不好说什么,后来我各种尝试,以及想对宝塔强行降级。发现降级确实不好降,然后又尝试了几个方案后,把系统Firewall服务改为自动运行,虽然之前的端口仍旧看不见,但好在可以添加端口了。我先部署项目再说吧。

然后呢,开始部署项目,本以为总该没问题了,问题又又来了,pm2管理器里没有我项目对应的nodejs版本。我找了个临近版本,部署后启动1秒直接就崩了。这东西我去宝塔官方群问,都没有解决方案。百度上各种找也没人说个所以然来。要不是在另一台服务器成功跑起来我都以为我项目问题了。最后我在GitHub看到了以为国外开发者发表的文章,他说经他测试,windows 2012这个系统是无法运行pm2的。文章下好多人也有相同问题。终于自证清白,不是我问题。所以我只好部署在我的linux服务器上。

在linux服务器上部署pm2出奇的顺利,不到1分钟我就部署完成了,也顺利运行了。但是我python项目还在windows服务器上。本来想着分别部署在两个服务器也行啊。但node的fs貌不能对网络资源读写,为了不产生更多问题也为了方便管理,我就把python项目搬到liunx系统上。

看着马上就要成功了,我都准备放松了,问题又又又来了,宝塔了python管理器我选择了最新2.1版本,使用后发现一添加python项目就失败。又是论坛百度各种找问题所在,仍是没找到。所以我不断测试, 没办法我选择不相信这个模块的开发者,我对python管理器进行降级,不用最新的2.1版本,用2.0版。还真让我直接添加成功并运行,只用再添加个定时执行脚本。并对node端web端和python端进行适配就可以了。

这时问题又又又又来了,他这个python管理器创建的python虚拟环境有问题,导致无法正常添加定时任务,眼看就要完成,总不能放弃吧。又是不断的测试去找答案。所有问题的答案仿佛都已注定,那就是没有答案。于是我再次选择不相信这个模块的开发者。再次对这个模块降版本,我选择了1.9的版本 这次直接创建成功并且可以监控。所有运行都正常。

这时我突然想到一句话,当圈内开发者被别人问这次又更新了啥时,都会说:新增了更多Bug,这本是一句玩笑话,此时却真的出现了。从一开始我习惯性认为版本越高bug越少,所以选择2.1最新版,没想到2.1时Bug最多的。项目都无法正常添加,2.0虚拟环境无法创建,1.9才得以正常运行。

不管怎么说,项目都跑起来了,并成功对接。因为直接表单页面为了快速测试接口直接扒别人网站的。属实太丑了。所以我连夜找了新的页面前端二改适配上去,并且对部分代码进行优化。

然后我和FDD对跨域等自己项目代码上的问题解决改进,以及前端页面优化。

职校家园打卡逻辑探讨

其实,上面说了这么多,直到这时才真正的进入打卡问题上来。外面所谓的虚拟定位来改变打卡位置,实际是的难度在于骗过自己手机,手机才会给一个错误地址,给职校家园。而我们通过接口提交,不需要通过手机,只用把自己的想要的位置提交给职校家园后端就行了。这好解决。但是职校家园还要经纬度和设备ID等参数。越是前端和用户交互越能体会到,有些用户属实是啥也看不懂。你只能把步骤简化到越简单越好。能不让用户的就不让用户操作。设备ID我用Javascrip写了个随机字符串作为设备ID,经纬度给了个大致默认值,用户只用填写账号密码打卡位置等必要参数即可。这样经过多次测试确实可行。

这里就有一个大家可能考虑的问题了,安全问题,因为本程序目前执行逻辑确实是记录了账号密码,每天程序自动用你的账号密码去打卡签到。我们是肯定不会泄漏用户的密码,但是比如一个用户在我们平台提交了密码,然后他密码也告诉了其他人,或者密码被其他人知道。然后导致账号密码被改或者其他。这样我们很难和用户解释清楚。

因为职校家园的开发者确实是XX,改密码这种事竟然不要手机验证码验证,更换绑定手机好像也不要原手机短信验证码验证。而且忘记密码和密码被改,除了找学校没有任何其他渠道。职校家园好像是政府外包给一个公司的项目,咱也不知道怎么选择的这家公司,也不会去恶意揣测。我不知道这是该外包公司为了省短信费还是干嘛。因为短信验证需要开发者去定期找运营商买短信包的。也或许他们觉得这里逻辑代码复杂能省就省。

而且我也看了他新增一个微信登陆,但是那个微信登陆毫无逻辑啊。微信登陆你除非是新用户直接通过微信渠道注册,根本没法绑定原账户。大多数学生应该是学校要求手机号注册的,所以那属实是个摆设登陆。

目前我们项目的实现逻辑是记录用户账号密码和打卡地址,每次执行打卡时用账号密码换取打卡需要的uid,再用uid进行打卡请求,这样的好处在于用户不想使用我们的程序时,自己修改密码就行了。但是就是可能出现上面所说的问题。

为此我也和另一位python开发者交流了方案,后期我们决定,新增一个获取用户token(uid)的接口,然后用记录用户uid来代替记录用户密码。因为uid只能用于打卡签到,是无法像账号密码一样登陆职校家园。但是这样增加了用户操作,用户首次使用需要输入账号密码获取uid,然后我们只记录uid,账号密码随着用户的浏览器关闭或者刷新就消失在网络中了。

但是这时我又意识到一个问题,因为职校家园开发者的XX(X X懂得都懂)。他竟然拿uid代替token,这就导致用户的token也就是uid永远不会变也不会失效。改密码都不会导致该(uid)改变。第一次见到这样有人用这样不安全的开发逻辑。这样也就导致,用户无法自己决定是否继续使用我们程序,需要联系我们删除该uid,非常不方便。而且目前两种写法都无法实现用户自己对提交信息的修改。

目前避免用户重复提交,检测到相同账号就禁止再次提交,我有个想法,将禁止提交改为有重复账号再次添加就替换这个用户除了账号外的所有信息,这样他就能修改自己信息了,也不会有重复账号出现。但很快这个想法又被我自己否决,这样没有鉴权,别人知道你手机号,就可以用同样操作。走这个系统恶意修改成错误的密码或者错误的地址,导致无法正常自动打卡。虽然我们不能把人想的太坏,但总有一些无聊的人喜欢卡bug来证明自己的存在。如果网络上人人都是好人,那么网络安全这个专业也就不复存在。

我准备等我考完试,用vue将表单完善成带登陆鉴权的系统,这样用户就可以登陆系统对自己账号进行,删除和修改。我想用Nodejs直接编写对接职校家园的接口,摆脱对我所不熟悉的python的依赖。我还想搬迁到微信小程序,还想对接到QQ微信机器人,用户可以通过微信或者QQ给机器人发消息来实现账号添加修改,我还想。。。。。。,再简单的项目,只要你想总能玩出花儿来。

总之言之,我并不是无聊到没事干为这个小小的打卡系统花费这么多的精力,也不是炫耀的自己的一些破技术,搭建这个只是玩,顺便引流,主要是磨练自己,光用嘴说一个系统怎么实现谁不会,现在我就是练练自己真正的面临一个项目时,解决问题的思路和逻辑,考完试再练习代码,以后也能让我空白的简历在项目那一页有东西可写。可能这次的项目在开发者眼里确实不算什么,比这复杂的项目多了去了。但正是因为简单我才拿来练手,毕竟这是我真正构思并实现的第一个项目。

非常感谢我室友FDD一直陪我没日没夜的改Bug,也感谢python开发者Andy和XuanRan愿意分享自己的python代码让我借鉴学习并且愿意同我这个新人共同探讨这个项目的逻辑思路。

职校家园打卡平台网址:dk.ti3.cc

本文出自职校家园打卡平台怎么开发的? (vxnn.cn)

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容