基于node.js的自动健康填报实现

前言

说在前面,功能实现很简单,但对当前阶段的我来说有较大的学习意义,还请内行人士勿笑小菜鸡


  暑假接近尾声,学习计划果然是没能达到目标的(逃)。
  不过也保持着每天学习的节奏,虽然没有在宿舍那么(被)卷,但每日一题和前端知识都是在进行着的。最近学到vue了,中途跳过了node.js,主要是感觉命令啥的还有类似后端的行为不太感冒,首要目的是开发主题。但随着知识量的入栈,越发感到学而知不足,不动手做点什么的话,很快又忘了。
  于是我开始浏览一些练手的小项目,可目前只肝了前端三大件和一些琐碎的知识(jQuery、ajax等),感觉并不能支撑很好的完成一个想要的东西。从练习三件套的商品页面,到翻回之前收藏的五十个前端小案例,都是跟着敲很少实践自己的想法,虽然坚持着练习,但感觉,不是我要的。
  这几天学校开始要求每天进行健康填报了,又得早上起来第一件事打开手机打卡,就开始实现自动打卡的想法。
一开始是在油猴脚本上,看了一下油猴脚本是怎么实现那些功能的。果不其然是js写,利用js的特性直接操作页面的元素,可以实现模拟登录输入点击打卡等等,很快就完成了一个简单的脚本。
  但是这么做有一个显著的问题,那就是……它不自动啊,还得我每次打开浏览器进行所谓的自动化操作,而这并不是我想要的。
于是我把方向改为了服务器,原因很简单,既然本地不行,那就放到服务器上跑。当然如果是简单的模拟点击的话,放服务器上也是很呆的。我想到了api接口,以前看过那些自动点赞的,有一个手动按钮点击可以模拟一次自动点赞,那不就是类似的东西吗。
于是又考虑服务端的操作,简单的来说就是需要两个步骤:1、模拟登录。2、模拟打卡。其中打卡之前需要登录也就是带上登录的信息,而登录身份验证一般有cookie和session的方式,之前学javaweb的时候接触过一点,但最近都在学js,我是这么想的:访问html页面时,会加载js,那可以把这段js作为被触发的对象,写到html里即可,需要用到时访问一下该页面。于是开始用上了之前学习的ajax的知识,进行发送简单的请求,很快就出了一个常见的问题:跨域……
  很正常,页面发送的请求肯定会有跨域问题,尝试解决无效,又想到既然前端发请求不行,那后端发请求试试?
由于node.js还没学习,而之前有过javaweb的经验,就尝试用java写一下,但在服务端怎么运行还是一头雾水,如何开始下笔(键盘)也不知道。摸索过程中认识了一个叫HttpClient的东西,似乎是java里可以用来发送请求的,正是我需要的,在B站学了一个几个小时的视频后,还是以失败告终。不是maven配置就是各种库丢失的问题,idea的调教也很是麻烦,加上服务器也不知道怎么部署就索性放弃了。
  之后回去补学了几天的node.js,希望能实现这个想法。
  在前几天的一个早晨,起来照常打开电脑,打开vscode,莫名有一股灵感,一套操作折腾到了十点,才去随便吃了早餐,又回来继续弄……了解到,所谓的后端发请求其实是一种简单的爬虫实现,之前一直以为爬虫是python的专有特效,看了这篇文章:使用JavaScript写爬虫 - 知乎才知道并不是这样,反而nodejs轻量级也很适合进行这种简单的请求。同时了解到axios可以进行后端的请求,但配置感觉比较复杂, 就选择了另一个叫request的请求库,参考了这篇文章:nodejs请求库request(一) - 阿布_alone - 博客园,于是乎,开始整活!

能记多少记多少

目前的需求是需要有一个一键执行的接口,然后这个接口是建立在对每一个账号进行打卡的基础上的,也就是目前首要是需要一个能够完成单账号打卡实现的功能,为了方便测试就写成了get请求,把登录的请求和打卡的请求封装为一个函数,然后在手动调用get接口时能够触发函数并返回相应的结果。
函数里发了两个请求分别是post的登录和get的打卡请求,因为是需要登录后的身份信息作为响应头的,也就是登录失败的话需要报错一下,因此也用了两个promise。

单账号功能实现后就能封装到一个接口里循环批量执行了,因此要把账号信息存储起来,顺便学习了一下nodejs对数据库的操作NodeJS操作数据库_QB哥的博客-CSDN博客_nodejs 数据库

接口完毕后就是部署到服务器上了,参考了这篇文章:nodejs部署到腾讯云服务器的实现(宝塔面板linux系统)_node.js_脚本之家
不得不说部署的时候废了好一些时间(ó﹏ò。)写在坑里吧。

一些坑

在进行请求时会遇到ssl证书的警告信息,只要在发送请求的时候配置上这段即可

"rejectUnauthorized": false,

登录成功后把响应头带过去再发送一次请求

resolve(response.rawHeaders);

手动设置响应头

"headers": {
    'cookie': value,
},

在数据库连接测试过程中,有一个应该是线程堵塞啥的报错Error: Cannot enqueue Handshake after invoking quit.,通过这篇文章解决:学习NodeJS时,遇到Error: Cannot enqueue Handshake after invoking quit.的解决方案_Kylin Chen的博客-CSDN博客
另外就是在查出数据库的数据之后不知道怎么拿出来,索性就直接在query函数里进行批量打卡发送请求了……请求发完再发送响应和关闭数据库连接,最后要统计打卡成功和失败的人数,就设了个五秒的延时,目前是没啥问题,不过不是很严谨,怕数据量大的话可能会统计不完全,同步异步的知识得加深一下。

在部署服务器的时候,首先在宝塔里装了pm2管理器进行nodejs的运行,然后上传文件到服务器,这里上传的时候不需要上传node_modules文件夹,只需要把配置信息的文件带上就行了,上传完之后在pm2管理器里下载回需要的模块。这里操作失误弄了好一会,服务一直重启,在端口占用、运行缓存等方面一直排查结果是模块的问题……

部署服务器的时候数据库的端口直接注释掉也行,和本地测试时候的不一样,也算踩了一个小坑。

运行截图~

页面

页面还在开发中……最近快开学了,开始有些焦虑(好像一直都很焦虑……)

登录注册用上了练习的时候写的一个up主的页面,主要是想练习一下数据库的增删改查这些。

2022年8月29日

今天写了一点后台,打算一个账号进行多个校园网账号的打卡登录设置,因此我也修改了数据库的表,当然应该不是很规范了……折腾了一晚上session和cookie,看了这个视频感觉思路比较清晰了Cookie、Session、Token究竟区别在哪?如何进行身份认证,保持用户登录状态?_哔哩哔哩_bilibili,先早点休息,明天继续。

2022年8月31日

早上没早八,继续看session相关的文章,思路一点点构建起来,感觉能理解到了,最主要的是发现了cookie设置不上(不管是用中间件自动设置还是手动设置)是因为跨域了(静态资源我是用插件打开的,端口号不同)!仿照之前的格式用下面代码暴露了就解决了,cookie设置完毕。

//暴露静态资源
app.use(express.static(__dirname + '/src'))

上网页设计课的时候,课间看到node.js中的session身份验证_MakabakaGoodnight的博客-CSDN博客这篇文章,突然明白了怎么用session进行验证身份,加上之前累计的思绪,都联系起来了。

折磨了几天的cookie、session的问题终于解决了,主要搞明白了session的工作原理,简单来说就是客户端在访问的时候服务端会产生一个sessionID来标记识别这个用户,而sessionID是以类似key-value的形式存在的,而session是基于cookie的意思是服务端会把sessionID的key放在响应头里返回给客户端,然后客户端会保存这个key,而cookie的name则是在设置session时设置的值。而在nodejs里使用express-session和cookie-parser两个中间件,就能自动实现上述操作(至于具体的操作过程不是很懂,感觉有必要学一学内部是怎么写的)。

session验证的问题解决了,就能根据session设置登录的信息了,用了一晚上把账号添加删除修改等等的功能都实现了,虽然数据库语句还得靠百度,但感觉也有一点点小进步吧,没以前那么容易卡壳了。

下面展示一下页面吧~
登录注册页面用了“响应式”(不完全哈哈哈),反正有点效果就是了。
登录注册页面

后台用vue写的,因为之前学javaweb的时候写过element组件的使用,虽然不是很规范,但也写出来了,算是练习了一点点vue初级的知识吧,vue的学习之路还很长~继续努力!
后台
添加
修改

601 次浏览
1 次获赞
上一篇
下一篇
评论已关闭
    3个月前

    还是我在校园的小程序好搞 抓两个包就完事

      3个月前

      小程序我更没思路了 网页打卡直接f12拿的接口,实现很简单啦,就是我实操经验还不是很够,摸索着整

微风忆夏