你睡了,它替你守着。 到点自动打开 BetterGI → 切到「一条龙」→ 点蓝色的开始按钮 → 跑完再让电脑睡,并且能从睡眠中把电脑唤醒。全程无人值守。
✅ 2026-10-19 13:05 网络自适应全部打通:无线电关闭 / 网卡禁用 / 连错网 / 仅未认证,四种情况都能自动恢复并完成认证(15 秒内)。
✅ 2026-10-18 17:18 全流程真机跑通:定时唤醒 → 点亮屏幕 → 校园网自动认证 → 点一条龙 → 隐私弹窗兜底 → 跑完 → 自动睡眠,全程 5 分钟零人工。
关于开发过程:项目有一份详细的开发日记(逐次失败、根因、修复),但不随仓库公开(含本机排障细节)。 对外公开的是可复用的经验总结 —— 见 docs/联网原理与适配.md。
| 版本 | 适用场景 | 会做什么 | 安装方式 |
|---|---|---|---|
| 联网版 | 校园网需要认证(连上 WiFi 还得登录门户) | 唤醒后:连 WiFi → 门户认证 → 关浏览器 → 跑一条龙 | 一键安装(右键以管理员身份运行).cmd |
| 免联网版 | 网络开机即通(有线/已认证/无需门户) | 唤醒后:直接跑一条龙,完全不碰网络 | 免联网安装(右键以管理员身份运行).cmd |
两个版本共用同一套脚本,区别只是一个开关:
# 免联网版 = 关掉门户认证 + 不等待网络
.\Install-BetterGI-OneDragon-Task.ps1 -NoNetwork
# 等价于给任务加:-AutoCampusPortal:$false -WaitNetworkSeconds 0免联网版不会启动浏览器、不会碰 Wi-Fi 设置,代码路径更短、更省事; 如果你的网络环境只是偶尔需要认证,用联网版更保险(它发现网络已通会自动跳过认证)。
安装器会在「任务计划程序」里建一个名为 BetterGI-OneDragon 的任务:
| 项 | 取值 |
|---|---|
| 触发 | 每天指定时间(默认 06:00) |
| 唤醒运行 | True(能从睡眠中把电脑叫醒) |
| 运行级别 | Highest(BetterGI 是管理员,脚本必须同级才能读它的界面) |
| 仅接电源 | True(用电池不启动;拔电即停,可关) |
| 迟到容忍 | 120 分钟(错过太久的补跑会被跳过,避免早上用电脑时突然启动) |
| 跑完之后 | 等一条龙结束 → 再等 60 秒 → 让电脑睡眠 |
我把你机器上这个 BetterGI 0.66.0(D:\BetterGI\BetterGI.exe,111 MB 单文件)整个程序集的字符串扫了一遍,确认:
- 没有 启动一条龙的命令行参数(没有
--startOneDragon之类的字面量) - 没有 内置定时/计划任务(没有 cron 相关字符串)
- 没有 本地 HTTP / 命名管道控制接口
所以想让「一条龙」跑起来,只能操作它的界面。本方案因此是两层:
| 层 | 作用 | 实现 |
|---|---|---|
| 计划任务 | 到点触发、把电脑从睡眠/休眠唤醒 | Windows 任务计划程序 |
| 运行脚本 | 启动 BetterGI、切页面、点开始、校验结果 | UI Automation + 鼠标注入 |
你机器上的实际情况也决定了必须这么做:BetterGI 是以管理员身份运行的(普通权限进程连它的控件树都读不到,实测 AutomationElement 子元素为 0),所以计划任务必须以「最高权限」运行。
| 文件 | 用途 |
|---|---|
docs/联网原理与适配.md |
原理与适配指南:三层没网模型、检测方法、UI 定位、排错速查(公开版经验总结) |
一键安装(右键以管理员身份运行).cmd |
双击即可,内部会弹 UAC |
所有
.cmd都是纯 ASCII 启动器(0 个非 ASCII 字节),中文全部交给 PowerShell 输出。早期版本在.cmd里直接写中文 +chcp 65001,会导致 cmd 解析错乱(实测:改时间的脚本因此丢参数、报「缺少参数 Time」)。 |Install-BetterGI-OneDragon-Task.ps1| 创建计划任务 + 电源设置 + 检查报告 | |修改触发时间.cmd| 双击后按提示输入新时间,改完立即生效 | |Change-Time.cmd/Change-Time.ps1| 上面那个的实际实现(ASCII 名,避免中文在 cmd 里出编码问题) | |Set-BetterGI-OneDragon-Time.ps1| 命令行改时间(支持-Days) | |开关定时任务.cmd| 双击后可选:暂停 / 恢复 / 彻底删除 | |Toggle-Task.ps1| 上面那个的实际实现(菜单逻辑,中文都在 PowerShell 里) | |Set-BetterGI-OneDragon-Enabled.ps1| 命令行暂停或恢复(-Action disable/enable/status) | |Run-BetterGI-OneDragon.ps1| 真正干活的脚本(计划任务调用的就是它) | |Uninstall-BetterGI-OneDragon-Task.ps1| 删除计划任务 | |logs\| 每次运行的日志、失败截图、UI 结构快照 |
- 把整个
BetterGI-AutoOneDragon文件夹放到一个固定位置(别放桌面,路径别带太多空格)。 - 双击
一键安装(右键以管理员身份运行).cmd,UAC 点「是」。 - 想改时间就带参数重跑(会覆盖同名任务):
# 每天 04:30
powershell -ExecutionPolicy Bypass -File .\Install-BetterGI-OneDragon-Task.ps1 -Time 04:30
# 只在工作日 07:00,并且如果今天已经跑过就跳过
powershell -ExecutionPolicy Bypass -File .\Install-BetterGI-OneDragon-Task.ps1 -Time 07:00 -Days Weekdays -SkipIfRanToday:$true
# 装完立刻试跑一次(人能看着,最稳妥的验证方式)
powershell -ExecutionPolicy Bypass -File .\Install-BetterGI-OneDragon-Task.ps1 -Time 04:30 -RunNow可选参数:
| 参数 | 默认 | 说明 |
|---|---|---|
-Time |
04:30 |
24 小时制 HH:mm |
-Days |
Daily |
Daily / Weekdays / Weekend / Monday…Sunday |
-BetterGIPath |
D:\BetterGI |
BetterGI 安装目录 |
-StartupDelaySeconds |
30 |
触发后先等几秒(唤醒后等显卡/网络就绪) |
-WaitNetworkSeconds |
300 |
等网络连通的最长时间;0 = 不检查 |
-PortalRetries |
5 |
校园网认证最多重试几次(间隔 60 秒) |
-CloseBrowserAll |
True |
认证成功后关闭整个 Edge(-KeepBrowser 可保留) |
-AbortIfNoNetwork |
True |
最终没网就中止,不启动 BetterGI(false = 硬跑) |
-SkipIfRanToday |
False |
建议保持关闭。开启后会用「当天日志里有结束标记」判断是否跳过,但 BetterGI 跨夜不重启时日志文件还是昨天那份,会把昨天的标记当成今天已跑过 → 整个凌晨白跑一次(2026-10-18 04:30 真实踩过) |
-OneDragonConfigName |
空 | 指定某个一条龙配置名,空=用当前选中的 |
-ApplyPowerTweaks |
True |
改电源设置(允许唤醒定时器;「唤醒后免密码」若本机支持才设) |
-StopOnBattery |
True |
运行中拔掉电源是否停止。false = 拔电继续跑 |
-SleepAfterFinish |
True |
一条龙跑完后由脚本让电脑睡眠(BetterGI 自身没有睡眠选项) |
-SleepDelaySeconds |
60 |
结束后等多少秒再睡眠,给 BetterGI 收尾留时间 |
-AcceptPrivacyDialog |
True |
兜底点 bilibili 登录页那个粉色「同意」按钮(靠颜色识别,见下) |
-AcceptDialogSeconds |
180 |
检查「同意」按钮的持续时间,最多点 3 次 |
-RunDryRun |
关 | 装完立刻空跑一次(切页面、定位按钮、截图,不点开始),用于验证 |
方式 1(最简单):双击 修改触发时间.cmd,按提示输入 06:30 这样的时间即可,会弹一次 UAC。
方式 2(命令行):
# 只改时间,星期设置保持不变
.\Set-BetterGI-OneDragon-Time.ps1 -Time 06:30
# 改成只在工作日
.\Set-BetterGI-OneDragon-Time.ps1 -Time 07:00 -Days Weekdays
# 指定某几天
.\Set-BetterGI-OneDragon-Time.ps1 -Time 23:15 -Days Monday,Wednesday,Friday方式 3:带 -Time 重跑安装脚本(覆盖同名任务,电源设置会再刷一遍)。
三种方式都会立刻打印 下次运行时间,可以当场确认。改时间不会影响任务的其他设置(唤醒、最高权限等都保留)。
三个层级,按「临时 → 彻底」排列:
| 做法 | 效果 | 怎么操作 | 需要管理员 |
|---|---|---|---|
| 暂停(推荐先试这个) | 不再自动唤醒/运行,但任务和全部设置都保留,随时恢复 | 双击 开关定时任务.cmd 选 1;或 .\Set-BetterGI-OneDragon-Enabled.ps1 -Action disable;或任务计划程序里右键「禁用」 |
是 |
| 恢复 | 按原时间继续自动运行 | 同上,选 2 / -Action enable |
是 |
| 彻底删除 | 任务消失,脚本文件还在 | 开关定时任务.cmd 选 3;或 Uninstall-BetterGI-OneDragon-Task.ps1 |
是 |
只想看状态、不改任何东西(不需要管理员,不弹 UAC):
.\Set-BetterGI-OneDragon-Enabled.ps1 -Action status会打印 状态 / 下次运行 / 上次运行结果。Ready = 已启用,Disabled = 已暂停。
小提醒:暂停只影响「自动运行」。如果你手动双击脚本,它照样会跑——那是你主动要求的,不算自动触发。
你要求「无论电脑是否休眠还是开机都能自动运行」。这句要拆开看:
| 电脑状态 | 能否定时唤醒 | 说明 |
|---|---|---|
| 开机 / 睡眠 S3 / 休眠 S4 / 现代待机 S0ix | ✅ 能 | 计划任务里勾选「唤醒计算机运行此任务」即可 |
| 完全关机 S5(断电) | ❌ 不能 | 系统里没有任何软件能在关机时唤醒。只能靠 BIOS 定时开机(RTC Alarm) 或 网络唤醒 WoL(需要另一台设备/路由器发魔术包,部分笔记本不支持) |
所以安装脚本做了三件事来保证「能醒」:
- 任务设置
WakeToRun = True; powercfg打开当前电源计划的「允许使用唤醒定时器」(RTCWAKE=1,交流/电池都开);- 关闭「唤醒时需要密码」(
CONSOLELOCK=0)——这条不能省:锁屏状态下 Windows 在安全桌面上,任何鼠标注入都会被丢掉,脚本会卡在登录界面。
安装时会检查并提醒几个会让「唤醒」或「运行」失效的坑:
-
一条龙的「完成后」= 关机:你现在的
默认配置就是"CompletionAction": "关机"。跑完关机之后,第二天的唤醒定时器不会生效(S5 不算)。BetterGI 的这个下拉框只有 5 项:
无/关闭游戏/关闭软件/关闭游戏和软件/关机,没有「睡眠」。所以正确分工是:你要的 BetterGI「完成后」 说明 跑完睡觉、第二天继续 关闭游戏和软件(推荐)或 无 睡眠交给本脚本:检测到一条龙结束后,脚本自己让电脑睡 跑完保持原样 无 脚本同样会让电脑睡眠 跑完关机 关机 ❌ 第二天唤醒失效,别选 -
快速启动(Fast Startup):开启时「关机」其实是半休眠,同样不能被唤醒定时器唤醒。习惯关机的话请关掉它。
如果你确实想用「关机」而仍要定时启动,去 BIOS 里找:
Resume by RTC Alarm/RTC Wake/定时开机(部分笔记本叫Wake on RTC)- 或者用路由器/树莓派定时发 WoL 魔术包(需要网卡支持并从 S5 保持供电)
-
不要注销、不要关机:任务设为「仅在用户登录时运行」,因为只有登录会话里才有桌面可以点。睡眠/休眠会保留会话,登录不会丢。
-
唤醒后不能停在锁屏(最容易踩的坑):
设置 → 账户 → 登录选项 → 「如果你离开了,Windows 何时要求你重新登录」→ 从不你这台机器的电源方案里没有「唤醒时需要密码」这一项(我用 GUID
0e796bdb查过,整个方案里不存在),所以安装脚本没法用powercfg帮你关掉,只能手动切这个开关。不关的话,从睡眠唤醒后会停在锁屏界面——锁屏下 Windows 会丢弃所有鼠标注入,脚本会直接报exit 10退出。脚本现在会在开头检测LogonUI/LockApp进程,锁屏就立刻说清楚,不会莫名其妙失败。 -
原神要能进到游戏里:脚本只负责点 BetterGI 的按钮,不负责登录原神。建议
- 让游戏保持已登录(睡眠/休眠不会退出游戏);
- 或在 BetterGI「启动」页打开 同时启动原神;
- 如果游戏启动后必须手动输入账号/点「点击进入」,那这一段自动化会卡住,需要你先把「自动登录」搞定。
另外建议不要用「关机」而是「睡眠」:游戏进程还在,唤醒后一条龙能直接开工。
Run-BetterGI-OneDragon.ps1 的流程:
-
请求运行期间保持系统+显示器唤醒(
SetThreadExecutionState),并主动打开显示器(广播WM_SYSCOMMAND/SC_MONITORPOWER -1,再抖 1 像素鼠标);这一步是实测逼出来的:定时唤醒只会把系统叫醒,显示器会保持关闭(实测记录
LogonUI=False、系统已恢复,但屏幕是黑的)。显示器不亮时 BetterGI 截不到图,等于白跑。然后等网络就绪(
-WaitNetworkSeconds,默认 300 秒):每 5 秒用 TCP 探一次223.5.5.5:53和www.baidu.com:443(绕开 DNS 缓存,测真实路由),通了才往下走。长时间休眠后 WiFi 可能比系统晚起来,而 BetterGI 登录游戏需要网络。 -
找不到 BetterGI 就启动它,已有进程就复用;等主窗口出现(默认最多 180 秒);
-
把窗口切到前台;先在标题栏做一次无害的预热点击(第一次点击常被系统拿去“激活窗口”而丢失);
-
在左侧导航里找
一条龙(优先 ListItem,限定窗口左侧 30% 区域),点击;- 点不动就重试一次,再不行改用 UI Automation 的
SelectionItemPattern.Select();
- 点不动就重试一次,再不行改用 UI Automation 的
-
校验确实进了页面:存在可见的
任务列表文字; -
以
任务列表标题为锚点,在同一行、标题右侧找按钮,取最左边那个 —— 就是蓝色播放按钮(自动适配窗口大小与 175% 缩放); -
点击,然后读 BetterGI 自己的日志确认真的开始了(
启用一条龙配置/启用一条龙任务的数量),最多重试 3 次; -
把原神窗口切到前台(最多等 120 秒让游戏起来)。这一步不能省:BetterGI 只在「前台窗口是原神」时才截图和执行,否则会每秒打印一次「不是原神,暂停」,最后以「截图失败」收场;
-
兜底点「同意」(
-AcceptPrivacyDialog):截取游戏客户区,在画面里找 bilibili 登录页那个粉色按钮,找到才点、找不到不点,最多 3 次;- 一旦从 BetterGI 日志看出已经进入「任务执行」阶段(
一条龙任务执行/配置组任务执行),说明游戏早在主界面,立刻结束检查,不空转; - 日志被轮转/截断时会重置基线,不会把历史记录误判成新事件;
- 一旦从 BetterGI 日志看出已经进入「任务执行」阶段(
-
失败时保存窗口截图 + UI 结构快照到
logs\,方便定位。
不是写死坐标,而是颜色 + 几何:
- 粉色判定:
R>190 且 55<G<160 且 100<B<210 且 R-G>70 且 B-G>15 - 先按行统计粉色像素,取最宽的一条「行带」当按钮高度(避开粉色文字链接)
- 再在行带里按列统计,取最宽的连续列段当按钮宽度
- 最后校验宽高比 1.4~7、宽度占画面 2%~45%、中心在画面 25%~80% 宽 / 30%~90% 高
用你那张 2560×1599 的截图实测:精确框出 x=1310 y=926 w=210 h=63(就是那个「同意」按钮);拿 BetterGI 自己的界面截图做反例,返回 null 不会误点。
限制:游戏必须能被屏幕复制截到(你现在是窗口化/无边框,没问题;真·独占全屏会截到黑屏);bilibili 改版把这个按钮换颜色就失效。
退出码:0 成功,2 路径不对,3 没有窗口,4 读不到控件(通常是权限不够),5/6 导航失败,7 找不到标题,8 点击被遮挡,9 点了但没启动。
第 1 步:先空跑(不点开始,只验证能不能找到按钮)
以管理员身份打开 PowerShell:
cd <脚本所在目录>
.\Run-BetterGI-OneDragon.ps1 -StartupDelaySeconds 0 -DryRun-DryRun 会:启动/复用 BetterGI → 切前台 → 切到「一条龙」→ 定位蓝色开始按钮 → 打印坐标并截图,但不点击。
日志里应出现:
名为「一条龙」的元素数量: 2
点击 导航「一条龙」第1次 @ (750,494)
页面已切换到一条龙
「任务列表」位置: 左=1030 上=389 宽=140 高=44
播放按钮: 名称='xxx' 位置=1268,411 尺寸=70x70
DryRun: 已定位开始按钮 (1268,411),不执行点击。
第 2 步:真实跑一次
.\Run-BetterGI-OneDragon.ps1 -StartupDelaySeconds 0看到 日志确认一条龙已启动 就成了。
其他常用开关:
# 只导出 BetterGI 当前界面结构,什么都不点(排查用)
.\Run-BetterGI-OneDragon.ps1 -DiagnoseOnly
# 允许今天已经跑过也再跑一次
.\Run-BetterGI-OneDragon.ps1 -SkipIfRanToday:$false
# 指定某个一条龙配置
.\Run-BetterGI-OneDragon.ps1 -OneDragonConfigName "默认配置"典型失败与对策:
| 现象 | 原因 | 处理 |
|---|---|---|
| 日志里「可访问控件数量: 0」 | 没用管理员权限 | 用管理员 PowerShell 跑 |
exit 10 + 提示 LogonUI/LockApp |
桌面处于锁屏 | 按上面的路径关掉「唤醒后要求登录」 |
| BetterGI 日志刷「不是原神,暂停」 | 前台不是游戏窗口 | 脚本会在点完后自动切前台;别在运行期间点别的窗口 |
| BetterGI 日志「尝试多次后,截图失败」 | 同上(失去焦点后再也截不到图) | 同上;一轮跑完前不要碰鼠标 |
| 卡在 bilibili 隐私政策弹窗 | BGI 的 OCR 没点中「同意」(多半是焦点不在游戏,它就不截图) | 已内置兜底点击(-AcceptPrivacyDialog);更稳的是保持游戏不退出,睡眠而非关机 |
| 找不到「一条龙」 | 侧栏被折叠了 | 先把 BetterGI 侧栏展开再试 |
| 点击被遮挡 | 有别的窗口盖住 BetterGI | 脚本会自动切前台;仍失败就把其他窗口最小化 |
| 点了但没启动 | 按钮位置变了 / 弹了对话框 | 看 logs\*.png 截图和 uia-*.txt |
几点实话,也顺便说明为什么没选别的路:
- 指望 BetterGI 官方接口:目前没有。如果以后版本加了命令行(例如
BetterGI.exe --startOneDragon)或本地 API,那比 UI 自动化稳得多,只要把脚本第 4–7 步换掉就行,计划任务那层不用动。 - BetterGI 的 JS 脚本(JsScript):能写复杂流程,但同样需要先手动启动 BetterGI 并触发,解决不了「到点自动开始」。
- 用「按键精灵/自动点击器」类工具:本质上还是坐标点击,抗分辨率变化更差,且多一个常驻进程。当前脚本是按 UI 元素实时求坐标,比固定坐标稳。
- 真正稳的闭环(你现在就是这么配的):
- 计划任务 04:30 唤醒 → 跑一条龙 → 脚本在结束后让电脑睡眠(BetterGI 自己没有睡眠选项);
- 电脑平时睡眠而不是关机;
- 这样每天自动循环,也不用管登录状态。
- 细节:脚本是用独立进程发睡眠请求、自己立刻退出,避免"第二天唤醒时昨天的实例还活着"导致任务被跳过;任务的并行策略也设成了可并行(
Parallel)。
- 如果你就是想关机:那唯一可靠的是 BIOS 定时开机 + 开机自动登录(
netplwiz关掉「要输入密码」)+ 登录后自启本脚本(把计划任务触发器改成「登录时」)。这条链路依赖主板支持,笔记本不一定有。
powershell -ExecutionPolicy Bypass -File .\Uninstall-BetterGI-OneDragon-Task.ps1电源设置不会自动回滚,需要的话:
powercfg /setacvalueindex SCHEME_CURRENT SUB_NONE CONSOLELOCK 1
powercfg /setactive SCHEME_CURRENT- 本方案依赖 BetterGI 的界面文案(
一条龙、任务列表)。如果以后 BetterGI 改版换了文案/布局,需要调整脚本里的锚点(都集中在第 3、5 步,注释写清楚了)。 - 我在开发环境里无法直接驱动你的 BetterGI:它以管理员权限运行,而我的进程只有普通权限,读不到它的控件,也无法注入点击(实测 UI 树子元素为 0)。所以点击逻辑我是用一个结构相同的 WPF 假界面做了端到端实测(预热点击 → 导航点击 → 页面切换 → 定位播放按钮 → 点击 → 日志校验,全部通过),真实 BetterGI 上请先
-DryRun确认坐标,再真实跑一次。 - 如果首次真实运行失败,
logs\里的截图 +uia-*.txt足够我定位并修正锚点。
默认参数是某高校的(SSID <SSID>、门户 <门户地址>/login.jsp)。
换成别的学校/单位,只需改两处参数,不需要改代码:
# 单独跑认证时
.\Connect-CampusNetwork.ps1 -PortalUrl "http://你的门户地址/login.jsp" -WifiSsid "你的WiFi名"
# 长期使用:改任务参数
.\Install-BetterGI-OneDragon-Task.ps1 -Time 06:00 -PortalUrl "http://你的门户/..." -WifiSsid "你的WiFi名"- docs/联网原理与适配.md —— 把"校园网为什么会没网""怎么判断真能上网""按钮怎么定位"讲透, 附排错速查表和适配 checklist。接手开发/换学校,先看这份。
- tools/Dump-PageUia.ps1 —— 一条命令把你门户的控件结构(类型/名字/矩形)打印出来, 用来定位"运营商单选框""登录按钮"。
早期版本用"窗口比例坐标",实测不可靠(页面排版一变就偏 300px)。 现在优先用 UI Automation 读控件的真实矩形:
| 目标 | 定位方式 |
|---|---|
| 账号 / 密码 | Edit 控件(读它的值判断是否已自动填充) |
| 联通 / 移动 | RadioButton + 名字正则(如 联\s*通) |
| 登录按钮 | 表单区下方尺寸最大的 Hyperlink / Image |
| 比例坐标 | 仅作兜底,元素找不到时才用 |
所以换成别的门户时,最可能需要调的是"怎么认出登录按钮"——如果新门户的按钮不在预期位置,
改 Find-LoginButtonRect 的筛选条件即可(有注释)。
- 本工具不保存任何账号密码:它依赖浏览器自己记住的密码(
记住密码勾选 + Edge 自动填充)。 logs\里的日志和截图含 SSID、内网 IP、门户截图,已在.gitignore中排除,请勿提交。- 脚本本身不含学号、密码、MAC 等个人信息。
- 本项目仅供学习与技术交流,请勿用于商业用途、代练、多开或任何规模化/牟利场景。
- 自动化操作校园网认证、自动化操作游戏,可能违反所在学校的网络使用规定和游戏服务条款。 由此导致的账号封禁、处罚、成绩/记录影响由使用者自行承担,作者不承担任何责任。
- 脚本不破解、不绕过任何认证机制:它只是把鼠标点在认证页该点的地方, 账号密码来自你自己浏览器里保存的密码,本项目不收集、不上传任何凭据。
- 使用者需自行确认所在学校/单位允许此类自动化操作;不确定就不要用。
- 因使用本工具造成的任何直接或间接损失(数据丢失、设备异常、网络中断等),作者不承担责任。
cd <项目目录>
git remote add origin git@github.com:<你的用户名>/nightwatch.git
git push -u origin main
git tag -a v1.0.0 -m "NightWatch v1.0.0" ; git push origin v1.0.0建议在仓库设置里加 topics:bettergi genshin-impact powershell windows-automation task-scheduler ui-automation