此目录存储客户端 (用于更新状态/设备状态)
Important
每个客户端的标题可以 点击跳转最新文件, 不要使用固定 commit 的链接, 否则无法获取最新文件
我是真心建议你过段时间再用, 还在重构呢
Windows:
- WinDevice (已安装 Python 推荐)
- Win_Simple (未安装 Python 推荐)
- Win Fast Settings
Android:
- AutoxjsScript (无需 Root, 需安装额外软件)
- MagiskService (需 Root)
- SleepyXposed (需 Root, 需 Xposed 框架)
Linux:
- LinuxScriptKDE (KDE Python 脚本)
- LinuxScriptHyprland (Hyprland 原生脚本)
- NiriPiri (Niri 插件客户端, 外部资源)
IOS/MacOS:
- AppleShortcuts (需要快捷指令拥有“获取前台 App”命令)
- SwiftUI版本 (mac原生应用 支持macOS 13.0+)
- AppleScript版本 (支持macOS 10.9+)
CLI (命令行):
- HomeworkDevice
- CMDConsole (不建议使用)
- CmdConsoleMulti (不建议使用)
Others (其他):
Tip
欢迎提交 Issue / PR 贡献自己的脚本!
Tip
欢迎提交 Issue / PR 贡献自己的脚本!
by: @wyf9
Co-authored-by: @kmizmal
Co-authored-by: @pwnInt - ^C / 鼠标空闲检测
Co-authored-by: @gongfuture - 媒体信息获取
Co-authored-by: @LeiSureLyYrsc - 异步支持
Co-authored-by: @GoingScience - 托盘启动
在 Windows 上自动更新设备状态
依赖: httpx, pywin32
Lines 29 to 75 in 23c14c9
:: 必装依赖,其他为可选 (对应功能需要)
pip install pywin32 httpx:: 媒体状态依赖 (Python <= 3.9)
:: winrt-runtime 仅适用于 python 3.10+ (下面两个 winrt.windows.xxx 的依赖中有, 无需手动安装)
pip install winrt:: 媒体状态依赖 (Python >= 3.10)
pip install winrt.windows.media.control winrt.windows.foundation:: 电池状态依赖
pip install psutil:: 托盘功能依赖
pip install pystray Pillowpython win_device.py
:: 显然,托盘功能仅添加到了ds版本中
python win_device_ds.py有两种方式:
可以使用 PM2 来自启动 / 管理进程 (搜索: Windows PM2 自启)
PM2 启动命令参考:
pm2 start python --name sleepywin -- -u win_device.py
如日志出现乱码请手动设置编码环境变量
win_device_ds_autostart.vbs
自启脚本,使启动后不显示窗口 (适用于不想用第三方软件托管进程的情况下)
- 将
win_device_ds_autostart.vbs放入shell:startup(开始菜单 -> 启动) 文件夹 - 将
win_device_ds.py放入%UserProfile%(用户主目录) 文件夹
Tip
shell:startup 和 %UserProfile% 两个文件夹可用运行窗口 (Win+R) 打开
原因: 网易云音乐不会设置 SMTC 状态,导致无法获取媒体信息
解决方法: 安装 BetterNCM,并安装 InfLink 插件,启用其中的 SMTC 功能即可正常获取
by: @CR400AFC2214
这是一个基于 win_device.py 的快速调整 sleepy 设置的小脚本,基于 tkinter
Warning
本 client 基于 WinDevice, 请确保您在使用前将 win_device.py 放在同一文件夹下, 并已经完成了在 win_device.py 中的配置!
额外的依赖: requests
python win_settings.pyby: @kmizmal
源代码:./Win_Simple/script.py
配置文件 (首次打开自动在同级目录下创建): config.ini
config.ini里面的注释写的很详细了,不再提供示例
下载后双击 Win_Simple.exe 初始化配置文件,然后在同级目录下的 config.ini 中填写配置,重新打开即可
Tip
如何开机自启?
创建一个 Win_Simple.exe 的快捷方式,然后扔到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 下即可
by: @wyf9
Co-authored-by: @VanillaNahida
Co-authored-by: @makabaka-andy
Co-authored-by: @GoingScience
使用 Autox.js 编写的安卓自动更新状态脚本
在使用前,请确保已安装 Autox.js 且授予无障碍权限
sleepy/client/autoxjs_device.js
Lines 8 to 15 in e6b77af
sleepy/client/autoxjs_device.js
Lines 8 to 15 in e6b77af
启动后可点击 Autox.js 右上角的日志图标查看日志
-
当手机息屏 (应用名返回为空) 时视为未在使用
-
当脚本退出时也会更新状态为未在使用 (不包括 Autox.js 直接停止运行)
- 导入autoxjs_device_once_gemini.js或者autoxjs_device_gemini.js(就我来说更推荐后者了)使用教程参考这两个文件的头部啦!
如果需要在较低的安卓版本运行,无法安装上面 repo 中的安装包,可以从下载站下载旧版本:
http://www.autoxjs.com/topic/116/autox-js
另外,此链接中的版本运行脚本会报错,可以参考 这里 的解决方案
点击展开
之所以报错是因为 AutoX.js 旧版本不支持 Javascript 中的模板字符串
解决方案: 手动将脚本中的模板字符串替换为 + 连接的形式,如:
// Before
console.log(`[sleepyc] ${msg}`);
// After
console.log('[sleepyc] ' + msg);如果可以安装软件, 但首次启动时报错:
展开报错示例
错误信息:
Unable to start activity ComponentInfo{org.autojs.autoxjs.v7/org.autojs.autojs.ui.splash.SplashActivity}: java.lang.SecurityException: Unable to start service Intent { cmp=org.autojs.autoxjs.v7/com.stardust.autojs.IndependentScriptService }: Unable to launch app org.autojs.autoxjs.v7/10361 for service Intent { cmp=org.autojs.autoxjs.v7/com.stardust.autojs.IndependentScriptService }: process is bad
java.lang.RuntimeException: Unable to start activity ComponentInfo{org.autojs.autoxjs.v7/org.autojs.autojs.ui.splash.SplashActivity}: java.lang.SecurityException: Unable to start service Intent { cmp=org.autojs.autoxjs.v7/com.stardust.autojs.IndependentScriptService }: Unable to launch app org.autojs.autoxjs.v7/10361 for service Intent { cmp=org.autojs.autoxjs.v7/com.stardust.autojs.IndependentScriptService }: process is bad
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3903)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4049)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:211)
at android.os.Looper.loop(Looper.java:300)
at android.app.ActivityThread.main(ActivityThread.java:8348)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1028)
Caused by: java.lang.SecurityException: Unable to start service Intent { cmp=org.autojs.autoxjs.v7/com.stardust.autojs.IndependentScriptService }: Unable to launch app org.autojs.autoxjs.v7/10361 for service Intent { cmp=org.autojs.autoxjs.v7/com.stardust.autojs.IndependentScriptService }: process is bad
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1916)
at android.app.ContextImpl.startService(ContextImpl.java:1874)
at android.content.ContextWrapper.startService(ContextWrapper.java:827)
at com.stardust.autojs.servicecomponents.ScriptServiceConnection$Companion.start(ScriptServiceConnection.kt:129)
at org.autojs.autojs.ui.splash.SplashActivity.onCreate(SplashActivity.kt:51)
at android.app.Activity.performCreate(Activity.java:8577)
at android.app.Activity.performCreate(Activity.java:8541)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1437)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3884)
... 12 more有两种解决方案:
- 检查系统设置 (如 Google
Play 保护机制可能会将其阻止) - 找 wyf9 获取旧版安装包
by: @kmizmal
适用于 Magisk Root 环境的服务脚本
sleepy/client/magisk/config.cfg
Lines 1 to 6 in 7bb1866
Tip
详见 说明
刷入 magisk.zip 并重启即可
另有 @XFJ-YYQF 的修改版本可用,支持媒体状态获取
见:
by @RhenCloud
Source Code: RhenCloud/SleepyXposed
基于 Xposed 框架,对系统框架进行 hook 的客户端方案。
请前往 RhenCloud/SleepyXposed (Release) 下载
启动应用后,进行以下配置:
| 字段 | 说明 | 示例 |
|---|---|---|
| 服务器地址 | Sleepy 服务器地址 | https://your-sleepy.com |
| 服务器密钥 | Sleepy 认证密钥 | your-secret-key-here |
| 设备 ID | 唯一标识此设备 | android-phone-1 |
| 字段 | 说明 | 默认值 |
|---|---|---|
| 显示名称 | 在 Sleepy 页面显示的名称 | 设备型号 |
| 启用上报 | 是否启用数据上报 | 禁用 |
- 打开 Xposed/LSPosed 管理器
- 找到 "SleepyXposed" 模块
- 启用 该模块
- 在作用域中勾选 "系统框架"
- 重启设备
by: @RikkaNaa
适用于 Linux KDE 桌面环境,且需要系统安装 kdotool
如获取失败则视为未在使用,变量计时参考
sleepy/client/linux_device_kde.py
Lines 18 to 28 in 7fc2138
可自行配置本脚本的自启动
当进程接收到
SIGTERM信号时将会发送未在使用请求
by: @inoryxin
适用于 Linux Hyprland 桌面环境,无需任何依赖,开箱即用
sleepy/client/linux_device_hyprland.sh
Lines 7 to 12 in 7fc2138
直接启动即可
Tip
开机自启可自行在 hyprland.conf 中配置
注意: 需要给脚本加上可执行权限 (chmod +x), 否则无法运行!
by: @RhenCloud
指向外部资源
这是一个基于 piri 的 Fork 版本
感谢 piri 原作者 Asthestarsfalll 做出的贡献
适用于 Linux Niri 桌面环境,通过 piri 的 Sleepy 插件在窗口焦点变化时自动上报应用状态。
在 ~/.config/niri/piri.toml 中启用插件并添加 sleepy 配置:
[piri.plugins]
sleepy = true
[sleepy]
server_url = "https://sleepy.example.com"
device_id = "my-linux"
device_name = "Niri Desktop"
token = "" # 可选, Bearer Token 鉴权
secret = "" # 可选, 某些部署需要 body 内 secret
prefer_app_id = falseTip
server_url 填写服务端根地址即可,插件会自动请求 /api/device/set。
- 安装并启动 piri daemon
- 保持 piri 在 Niri 会话中运行
- 切换窗口焦点后即可自动更新 Sleepy 设备状态
相关文档:
by: @Detritalw
指向外部资源
点击链接安装完整版, 支持 Apple Watch, iPhone, iPad, mac...
建议设置自动化 → 打开App → 选择全部App → 设置为不确认,立即执行 → 选择快捷指令为Sleepy Client Shortcuts Fast,即可获得超级好的体验。
Warning
IOS 版本 >= 18 才可使用 (获取前台 App 命令) 这里的链接可能不是最新,建议到项目内查看
Tip
你可以将该快捷指令设置为操作按钮、控制中心按钮、锁定屏幕按钮、敲击 2 / 3 下背板指令来快捷使用
支持macOS 13.0+
by: @wan0ge & AI
Sleepy_SU(点击下载安装包)
使用 Swift 编写的 macOS 原生自动更新状态轻应用,与AppleScript版本差异是有图形化UI,并且支持锁屏、睡眠、关机状态检测上报未使用
原生开发轻量级低占用,拥有图形化UI,支持锁屏、睡眠、关机状态的检测上报未使用,支持Apple Music、Spotify的音乐播放状态上报,支持忽略进程、窗口名,支持长时间窗口无变化上报未在使用
下载镜像安装包后双击打开,将应用图标拖拽到Applications(应用程序)即可完成安装,安装后启动就能够在菜单栏看到一只小猫的图标,点击能够看到各种选项
首次运行需要先去配置选项进行基础配置,注意更改都需要点击底部的保存才会应用
配置文件储存在 ~/Library/Preferences/com.Sleepy-SU.plist
然后在菜单栏点击开启状态更新,应用会先申请辅助权限
给予权限之后就能够看到正在运行了
遇到关机、睡眠、锁屏、强制退出都会进行上报未使用,只要在配置里面开启开机自启动与启动应用时默认开启上报就可以无感使用了
如果有使用浏览器、Apple Music、Spotify应用会申请对应的自动化权限,用于获取更准确的窗口名与音乐播放信息(音乐播放信息暂时只支持Apple Music、Spotify,默认开启,开启后播放时会追加到窗口名后面显示)
权限说明:
辅助权限为主要权限,用来检测窗口名进程名(权限入口:系统设置→隐私与安全性→辅助功能)
自动化权限用于更精准地获取浏览器标签页标题以及 Apple Music、Spotify 的播放信息,因为用到了应用自身的一些 API 所以需要这个权限访问(权限入口:系统设置→隐私与安全性→自动化)
Warning
macOS 对应用权限的授予有问题,请尽量在运行后不要更改文件位置或移除权限
如果只上报进程名而不是窗口名说明辅助权限有问题,请在 系统设置→隐私与安全性→辅助功能 里将本应用删除再手动添加给予权限即可正常
支持macOS 10.9+
by: @wan0ge & AI
Sleepy_AS(点击下载安装包)
使用 AppleScript 编写的 macOS 自动更新状态脚本,如果macOS > 13.0 推荐使用上方的SwiftUI版本
因为AS脚本检测锁屏和关机前上报未在使用实现困难,分为两个脚本,Sleepy_AS为上报状态主脚本,Sleepy_AS_false为停止并上报未使用脚本
主脚本也支持长时间窗口无变化上报未在使用、忽略特定窗口/进程,如果觉得关机前启动副脚本不够便利也可以搭配快捷指令使用,创建一个快捷指令选择“打开App”和“关机”并选中Sleepy_AS_false就可以当一个伪一键关机脚本使用,或者其他方式搭配“打开App”使用。
下载镜像安装包后双击打开,将两个脚本图标拖拽到Applications(应用程序)即可完成安装
首次安装后需要先启动主脚本Sleepy_AS根据弹窗填写配置,填写完基础的API地址、密钥、设备ID、设备名称就能够看到运行弹窗
配置文件储存在 ~/Library/Preferences/com.sleepy.as.app.plist
点击直接运行会申请辅助权限,进行授权后即可开始使用,脚本会在后台自动获取窗口名并上报(如果需要配置忽略窗口名请点击配置高级选项)
如果有使用浏览器、Apple Music、Spotify程序会申请对应的自动化权限,用于获取更准确的窗口名与音乐播放信息(音乐播放信息暂时只支持Apple Music、Spotify,默认开启,开启后播放时会追加到窗口名后面显示)
关机或锁屏前启动Sleepy_AS_false就可以停止主脚本并上报未在使用(同样需要辅助等等权限),关闭脚本不需要再次填写配置会自动读取主脚本的配置
权限说明:
辅助权限为主要权限,用来检测窗口名进程名(权限入口:系统设置→隐私与安全性→辅助功能)
自动化权限用于更精准的获取浏览器标签页标题以及AppleMusic、Spotify的播放信息获取,因为用到了应用自身的一些API所以需要这个权限访问(权限入口:系统设置→隐私与安全性→自动化)
Warning
mac os对应用权限给予有问题,请尽量保存运行后不要更改文件位置以及移除权限
如果只上报进程名而不是窗口名说明辅助权限有问题,请在 系统设置→隐私与安全性→辅助功能 里将本脚本删除再手动添加给予权限即可正常
在 系统设置→通用→登录项→登录时打开 中将Sleepy_AS主脚本加入即可
by: @wyf9
一个手动设置设备状态的示例 (不止!) 用来展示你的作业进度
依赖: requests
sleepy/client/homework_device.py
Lines 5 to 9 in 2df5d62
脚本提供了一些函数:
left(num: int): 设置剩余作业的数量 (为0则移除) [device id:homework-left]writing(name: str): 设置正在写的作业 (名称为空字符串则移除) [device id:homework-writing]
还有一些扩展函数, 可以调用 全部 (存疑) 大部分 API:
点击展开列表
点击链接跳转 api 文档
query(): 查看当前状态 (未格式化输出)status_list(): 查看可用状态列表 (未格式化输出)metrics(): 查看统计数据 (未格式化输出)status(stat: int): 设置状态device_set(id: str, show_name: str, msg: str, using: bool = True): 设备状态设置device_remove(id: str): 移除设备状态device_clear(): 清除设备状态private_mode(private: bool): 开关隐私模式
那么,如何使用这两个函数呢?
- 直接使用
使用 python homework_device.py 直接打开, 并用执行函数 (eval()) 的方式发送请求,
如:left(114514)
如何将多个调用写在一行?可用逗号分隔:
left(114513), writing('五 年 中 考 三 年 模 拟')
- 其他程序调用
from time import sleep
from homework_device import left, writing # import
for i in range(114514, 1, -1):
left(i)
writing(f'My Homework #{i}')
sleep(11.45)by: @wyf9
留档,不建议使用
一个简单的命令行客户端,用于手动更新状态
依赖: requests
Lines 14 to 21 in e6b77af
启动脚本, 按照提示操作即可
by: @wyf9
留档,不建议使用
CMDConsole 的旧版本 (可选择多个服务)
sleepy/client/cmd_console_multi.py
Lines 14 to 23 in e6b77af
同上, 多了一步选择服务
by: @wyf9
依赖: requests
一个使用 Minescript mod 在 Minecraft Java 版中上报游戏内信息的脚本
在使用前, 你需要下载 Minescript mod:
Links: MCMod.cn / Modrinth / Repo
也可在各大启动器的 Modrinth 源中直接下载
在下载并启动一次后, 打开 .minecraft/versions/你的版本/minescript/ 目录, 并进行两个操作:
- 新建
config.txt, 内容:
# Lines starting with "#" are ignored.
# 替换为你的 Python 可执行程序路径
python="C:\Program Files\Python312\python.exe"- 将
mc_script.py复制到此目录, 并改名为sleepy.py(也可为其他名字)
需要配置两处:
- 基本服务
Lines 16 to 24 in e6b77af
app_name格式
Line 116 in e6b77af
配置完成后重启 Minecraft 进入游戏, 按 T (默认键位, 可能不同) 打开聊天栏, 并输入: \sleepy *(即上面重命名后的文件名去掉 .py 后缀) 回车启动
停止: \sleepy stop
也可以配置自启, 只需在 config.txt 中新增一行:
autorun[*]=eval 'execute("\\sleepy")'by: @nuym
在任何支持油猴脚本的浏览器均可使用,据作者↑说是为了解决 Mac 无法获取窗口标题,遂退而求其次获取浏览器页面(有系统就有浏览器,即有用户脚本)
sleepy/client/browser-script.user.js
Lines 18 to 25 in 2df5d62
by: @NiuFuyu855
获取你的智学网成绩并展示在页面上
依赖: requests, zhixuewang
Lines 38 to 47 in 73a5e35
同时需要添加环境变量:
sleepy_page_zhixue = true需要将本脚本放在服务器的 main.py 同级目录运行,或编辑 L195-L197:
Lines 195 to 197 in 73a5e35
Important
在功能 / API 实现上有不同,需要进行修改以与本分支适配 (见 API #device-set)
- [1812z/sleepy] Android Macrodroid: (main)
前台应用状态.macro - [HBWuChang/sleepy] Android Magisk: (main)
_example/magisk/service.sh(详见脚本目录) - [HBWuChang/sleepy] Windows Python: (main)
_example/win.py
