键盘记录器2.0

发布日期:2025-11-25

键盘记录器的功能十分完善,可以十分详细地记录按键及所操作的窗口。但各班台安装键盘记录器后,需要去各班查看记录的内容实在是过于麻烦。于是我制作了键盘记录器2.0,可以将日志上传至服务器。

核心问题分析

要实现这一功能,有2个核心问题需要解决:上传接收

接收端设计

服务器需要有一个能够接收文件的后端,正当我兴冲冲地准备写一个后端时突然想到,Alist应该有此类的功能吧?翻阅其文档,我找到了 Alist API 的说明,依照 Alist API 的设计,首先需要获取用户的token,然后再上传文件。

日志文件设计

而上传的文件也需要智能筛选,按照之前程序的设计,所有记录都存储在同一个文件(即log.txt中),但这样这个文件会越来越大,造成不必要的空间浪费,于是我重新设计日志的保存功能。由于不同班每天都会产生新的日志,我决定将日志的格式设计为**ip_YYYYMMDD**,这样可以同时区分是那一台电脑产生的日志,以及产生日志的时间。①

以此日志的名称命名逻辑,我们以高一二班的电脑为例,将会产生名称为10.88.202.70_251117.log的日志文件。明天运行后将会产生名为10.88.202.70_251118.log的日志。那难道要上传整个日志文件夹,那和直接写在同一个日志文件中并无区别了。所以我在想,既然如此,只要选取日期最晚的日志上传即可。如此,每次都只要上传一个文件,只需检查日志文件名中日期最晚的日志就行啦。

综上,上传日志筛选部分逻辑如下:

1
在文件夹中挑选文件 → 上传 → 创建新日志

上传功能实现

接下来就到了实现最复杂的部分:上传。我一开始真的准备用node.js写一个后端,但后来想到 Alist 应该也会有类似的功能吧。在官方文档上一看,果不其然有API。在Alist上传文件,根据我们设置的权限,不登录无法上传文件,所以要上传文件需要登录账号。在Alist API的设计中,可以使用账号与密码获取一个48小时内有效的token,上传文件时需要填写token,Alist会根据token判断是否有权限上传文件。

所以要实现这一功能需要使用2个API:

  1. token获取:使用POST请求,路径为 /api/auth/login,要求两个必选参数:usernamepassword,返回的data字段将包含 token 字段。
  2. 流式上传文件:使用PUT请求,路径为 /api/fs/put,需要的参数有 authorizationFile-PathContent-TypeContent-Length

C++用起来确实有些难受,效率也比较低。为了发送网络请求,我使用了curl,解析返回值时,我使用了json.hpp。获取token后在返回的字符串中提取获取到的token值,然后将其作为上传的authorization参数,File-Path选择获取到的最晚日期的日志,Content-Length可以使用获取文件的函数获取,这样就可以将指定的日志文件上传上Alist啦。

完整逻辑流程

所以至此更改完整逻辑为:

1
筛选日志 → 获取Alist用户token → 上传日志 → 创建日志

功能总结

大功告成,现在键盘记录器就可以实现键盘记录+自动上传日志啦。我们只需要在尽可能多的班级安装键盘记录器,我们只需每日在Alist上查看日志就行了。

我还准备专门创建一个供键盘记录器上传文件的Alist用户,这样在不需要接收日志时只需在Alist上停用此账号即可(我们之前使用的是管理员账户qwq)

① 此中还产生了一个问题,有时可能会获取到其他网卡的IP地址,如在微软上测试时就获取成了Radom网络中的ip。为了避免这个问题,我在获取IP地址的代码中加入了优先获取以10.88开头的IP地址