此目录存储客户端 (用于更新状态/设备状态)
Important
每个客户端的标题可以 点击跳转最新文件, 不要使用固定 commit 的链接, 否则无法获取最新文件
我是真心建议你过段时间再用, 还在重构呢
Windows:
- WinDevice (已安装 Python 推荐)
- Win_Simple (未安装 Python 推荐)
- Win Fast Settings
Android:
- AutoxjsScript (无需 Root, 需安装额外软件)
- MagiskService (需 Root)
Linux:
- LinuxScriptKDE (KDE Python 脚本)
- LinuxScriptHyprland (Hyprland 原生脚本)
IOS/MacOS:
- AppleShortcuts (需要快捷指令拥有“获取前台 App”命令)
- 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 - 异步支持
在 Windows 上自动更新设备状态
依赖: httpx, pywin32
:: 必装依赖,其他为可选 (对应功能需要)
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 psutilpython win_device.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
使用 Autox.js 编写的安卓自动更新状态脚本
在使用前,请确保已安装 Autox.js 且授予无障碍权限
https://github.com/sleepy-project/sleepy/blob/e6b77af1e4333ad570983b5bf9ac397cb1d40d7b/client/autoxjs_device.js#L8-L15 https://github.com/sleepy-project/sleepy/blob/e6b77af1e4333ad570983b5bf9ac397cb1d40d7b/client/autoxjs_device.js#L8-L15
启动后可点击 Autox.js 右上角的日志图标查看日志
- 当手机息屏 (应用名返回为空) 时视为未在使用
- 当脚本退出时也会更新状态为未在使用 (不包括 Autox.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 环境的服务脚本
Tip
详见 说明
刷入 magisk.zip 并重启即可
by: @RikkaNaa
适用于 Linux KDE 桌面环境,且需要系统安装 kdotool
如获取失败则视为未在使用,变量计时参考
可自行配置本脚本的自启动
当进程接收到
SIGTERM信号时将会发送未在使用请求
by: @inoryxin
适用于 Linux Hyprland 桌面环境,无需任何依赖,开箱即用
直接启动即可
Tip
开机自启可自行在 hyprland.conf 中配置
注意: 需要给脚本加上可执行权限 (chmod +x), 否则无法运行!
by: @Detritalw
指向外部资源
点击链接安装完整版, 支持 Apple Watch, iPhone, iPad, mac...
建议设置自动化 → 打开App → 选择全部App → 设置为不确认,立即执行 → 选择快捷指令为Sleepy Client Shortcuts Fast,即可获得超级好的体验。
Warning
IOS 版本 >= 18 才可使用 (获取前台 App 命令) 这里的链接可能不是最新,建议到项目内查看
Tip
你可以将该快捷指令设置为操作按钮、控制中心按钮、锁定屏幕按钮、敲击 2 / 3 下背板指令来快捷使用
支持macOS 10.9+
by: @wan0ge & AI
使用 AppleScript 编写的mac os自动更新状态脚本
因为检测锁屏和关机前上报未在使用实现困难,分为两个脚本,mac_device_sleepy_AS为主脚本,mac_device_sleepy_AS_false为停止并上报脚本
主脚本也支持长时间窗口无变化上报未在使用、忽略特定窗口/进程,如果觉得关机前启动副脚本不够便利也可以搭配快捷指令使用,创建一个快捷指令选择“运行AppleScript”和“关机”就可以当一个伪一键关机脚本使用,或者其他方式搭配“运行AppleScript”使用。
下载后解压至想保存的位置然后使用 Automator(自动操作)打开
根据首行提示滑到中底部分别修改两个脚本的具体配置并保存(找不到位置可以使用Command+F查找"配置项")
===== 配置项 =====
set deviceID to "mac" -- 你的设备 id, 唯一
set showName to "mac" -- 你的设备名称, 将显示在网页上
set secret to "绝对猜不出来的密码" -- 你的密钥
set endpoint to "https://al.u311533.nyat.app:32848/device/set" -- 你的完整 API 地址,以 `/device/set` 结尾
set ignoreAppNames to {"改成你想忽略的进程名", "两种忽略都支持部分匹配", "ControlCenter"}
set ignoreWindowTitles to {"改成你想忽略的窗口名", "输入法", "控制中心"}
set idleTimeoutSeconds to 10800 -- 设置窗口多久未变化上报未使用,默认3小时 单位秒
set inputIdleThresholdSeconds to 600 -- 设置窗口未变化上报前提:鼠标空闲时间,只有鼠标也达标才会上报,默认10分钟 单位秒
然后在保存的位置双击启动mac_device_sleepy_AS分别给予辅助权限、自动化权限就能够后台检测窗口名称上报,关机前启动mac_device_sleepy_AS_false就可以停止主脚本并上报未在使用。
权限说明:
辅助权限为主要权限,用来检测窗口名进程名(权限入口:系统设置→隐私与安全性→辅助功能)
自动化权限用于更精准的获取浏览器标签页标题,因为用到了浏览器自身的一些API所以需要这个权限访问(权限入口:系统设置→隐私与安全性→自动化)
Warning
mac os对AppleScript权限给予有问题,请尽量保存运行后不要更改文件位置也不要再次更改内容
如果只上报进程名而不是窗口名说明辅助权限有问题,请在 系统设置→隐私与安全性→辅助功能 里将本脚本删除再手动添加给予权限即可正常
在 系统设置→通用→登录项→登录时打开 中将主脚本加入即可
by: @wyf9
一个手动设置设备状态的示例 (不止!) 用来展示你的作业进度
依赖: requests
脚本提供了一些函数:
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
启动脚本, 按照提示操作即可
by: @wyf9
留档,不建议使用
CMDConsole 的旧版本 (可选择多个服务)
同上, 多了一步选择服务
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(也可为其他名字)
需要配置两处:
- 基本服务
app_name格式
配置完成后重启 Minecraft 进入游戏, 按 T (默认键位, 可能不同) 打开聊天栏, 并输入: \sleepy *(即上面重命名后的文件名去掉 .py 后缀) 回车启动
停止: \sleepy stop
也可以配置自启, 只需在 config.txt 中新增一行:
autorun[*]=eval 'execute("\\sleepy")'by: @nuym
在任何支持油猴脚本的浏览器均可使用,据作者↑说是为了解决 Mac 无法获取窗口标题,遂退而求其次获取浏览器页面(有系统就有浏览器,即有用户脚本)
by: @NiuFuyu855
获取你的智学网成绩并展示在页面上
依赖: requests, zhixuewang
同时需要添加环境变量:
sleepy_page_zhixue = true需要将本脚本放在服务器的 main.py 同级目录运行,或编辑 L195-L197:
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
