我用 Python 写了个 Windows 远程控制小工具 PRTS

greater70 发布于 1 天前 11 次阅读


这玩意儿到底是个啥

PRTS 是我用 Python 写的一个 Windows 桌面小工具,GUI 用的是 PyQt5。说白了,它就是个"把自己电脑管起来"的客户端:能远程关机、看系统状态、查后台进程占了多少资源、清理垃圾文件、测网络波动,顺手还塞了一堆小工具进去。

名字下面那句"我会一直看着你"是纯恶趣味,别当真——它就是个给自己电脑用的私有工具,不是啥监控别人的东西。

功能大概分这几块:

  • 远程控制:网页端或者小爱同学远程关机、定时关机、每台机器有唯一 UID 绑定账号
  • 系统管理:CPU/内存/磁盘占用带进度条、Top15 进程柱状图、垃圾清理、重启/休眠/锁屏
  • 网络工具:网络波动测试(就是桌面版 NetPulse)、AI 网络分析、本机 IP/Ping/DNS 刷新
  • 实用工具:清临时文件、刷 DNS 缓存、复制本机 UID

远程关机是怎么做到的

核心就是一条一直连着的 WebSocket 长连接。客户端一启动,就通过 websocket-client 连上服务端,连上第一件事是发一条 register 带上自己的 client_id,等于跟服务器报个到:"我是哪台机器,在线了"。然后它每 30 秒发一次心跳保活,断线了 5 秒后自动重连——所以只要你电脑开着、联网着,网页端随时能找到它。

关机指令是服务端主动下推的。网页端或者小爱同学(走巴法云 MQTT)触发后,服务端往这条连接上扔一个 action: "shutdown" 的消息。客户端收到后,通过 Qt 的信号 shutdown_triggered 把"该关机了"这件事推给界面层,界面层再去真正执行本机命令:

# 立即关机
os.system("shutdown /s /t 0")
# 延迟关机(带倒计时,可取消)
os.system("shutdown /s /t {}".format(seconds))

延迟关机就是给个倒计时秒数,期间你能在客户端上取消。说白了就是调用 Windows 自带的 shutdown 命令,工具本身不碰内核,稳。

顺带一提,客户端里默认连的服务器地址写死成了 ws://8.153.36.132:8765——也就是我自己那台服务器(之前博客被 IP 跳转坑过的同款地址)。这个写死没问题,因为这工具本来就是连我自己的服务端用的,不是给别人部署的。

网络波动测试:就是桌面版的 NetPulse

我博客之前写过一篇网页版的网络延迟测试工具 NetPulse(那篇文章),PRTS 里的网络测试模块就是照那个思路做的桌面版,而且更狠一点。

测延迟有两种姿势:

  • 单节点:用 urllib 对目标地址发一个 HTTP GET,掐表算往返耗时。注意,它是 HTTP 请求测的延迟,不是系统那个 ping 命令——好处是纯应用层、不用管理员权限,坏处是测得的是"请求往返"不是"ICMP 回显"。
  • 多节点:对 survoid.top、百度、GitHub、腾讯云、阿里云这些地址,用 socket.create_connection 建一个到 443 端口的 TCP 连接,算建连耗时。这更接近"这个站点通不通、握手要多久"。

指标算法跟 NetPulse 一模一样:抖动 = 所有有效延迟的标准差,丢包率 = 探测失败次数 ÷ 总次数。曲线是用 PyQt5 的 QPainter 手绘的,实时往右滚,深色科技风。

还有个彩蛋:可以接 DeepSeek(或者任何 OpenAI 兼容接口)做 AI 分析。它把算出来的平均延迟、抖动、丢包拼成一个 prompt,调 /v1/chat/completions,让 AI 用 150 字以内给个"网络咋样、哪儿有问题、怎么改"的建议。代码里 system prompt 直接写死了"你是一名网络质量分析专家",挺实在的。

系统信息和垃圾清理

系统信息这块没啥花活,就是 psutil 一把梭:CPU 占用率、逻辑核数、频率、内存、C 盘用量、开机时间,全从它那拿。后台进程占用是每 3 秒刷一次 Top15,CPU/内存可以切换着看。

垃圾清理稍微硬核一点。它扫的是 Windows 临时目录、用户临时目录(%TEMP%)、Prefetch、Windows 更新缓存、注册表里那些卸载项丢了位置的残留、还有空文件夹——这些微软磁盘清理和 CCleaner 也都清,安全性没问题。真正的硬骨头是有些文件你当前用户删不掉,它就用 takeown 把文件所有权抢过来,再用 icacls 改权限,然后才删。正因为有这种操作,程序一启动就会弹 UAC 申请管理员权限(main.py 里用 ShellExecuteW(..., "runas", ...) 提权),被占用的文件会跳过、标记为失败,不会傻乎乎地硬删把系统搞崩。

密码怎么存、怎么打包

登录密码不是明文落盘的。"记住密码"这个功能,是用 cryptography 里的 Fernet 把密码加密后存进本地 config.ini,下次打开能自动填,但文件里看到的是密文。登录和注册的网络请求都丢在独立的 QThread 里跑,带 10 秒超时,不会卡住界面——这点挺重要,GUI 程序最怕主线程被网络阻塞冻住。

打包用的是 PyInstaller 目录模式,再加 Inno Setup 6 打成 PRTS_Setup_v2.2.exe 安装包。资源文件(图标、背景图)通过 resource_path 这个函数兼容开发环境和打包后环境——打包后资源在 PyInstaller 的 _MEIPASS 临时目录里,这个函数就是干这个适配的。

结尾

整套东西分两头:客户端就是上面这些,服务端是另一套独立的 Python(asyncio + websockets + aiomysql,连 MySQL,用 pm2 守护、Nginx 反代 WebSocket),仓库里没开源,需要单独部署在服务器上。客户端 MIT 协议,代码都在 gitee.com/smooge/prts,有兴趣自己扒。

说到底这就是个给自己用的玩具级运维工具,谈不上多牛,但远程关个机、看看家里电脑卡不卡、顺手清个垃圾,还挺香。

枯桑知天风,海水知天寒.
最后更新于 2026-07-26