Install
openclaw skills install shlibrary-seat-booking上海图书馆东馆三楼座位预约。支持浏览器自动化登录获取认证信息,以及基于API的座位预约(指定座位或系统自动分配)。适用于需要自动化预约图书馆座位的场景。
openclaw skills install shlibrary-seat-booking通过上海图书馆预约接口,预约东馆三楼阅览座位。
--area 南区 --seat-row 4排 --seat-no 2号 这样的直观输入--profile 切换不同账号profile 对应的认证文件book_seat.js 会在认证缺失或失效时自动拉起登录流程当前推荐统一使用子命令入口:
availability:查询某天全部时段都可用的座位list:查询当前账号已有预约cancel:取消指定预约book:预约座位当前脚本支持两类预约:
参数约定:
availability --date [日期] [--area 区域...]
--date:必填,表示查询哪一天--area:可选,表示只扫描哪些区域;不传就查询全部区域list [--profile 名称]
cancel --reservation-id [预约ID]
--reservation-id:必填,只负责指定要取消哪条预约book --date [日期] [--period 时段] [--area 区域] [--seat-row 排号] [--seat-no 座位号]
--date:整天自动分配--date + --period:单时段自动分配--date + --area + --seat-row + --seat-no:整天指定座位--date + --period + --area + --seat-row + --seat-no:单时段指定座位--area 南区 --seat-row 4排 --seat-no 2号# 查询当前账号预约
node ./scripts/book_seat.js list
# 查询指定账号预约
node ./scripts/book_seat.js list --profile user1
# 查询 3 月 20 日在多个区域里整天都可用的座位
node ./scripts/book_seat.js availability --profile user1 --date 2026-03-20 --area 北区 西区 东区
# 查询 3 月 20 日全部区域里整天都可用的座位
node ./scripts/book_seat.js availability --profile user1 --date 2026-03-20
# 取消预约
node ./scripts/book_seat.js cancel --profile user1 --reservation-id 5187335
# 按时段自动分配
node ./scripts/book_seat.js book --profile user1 --date 2026-03-24 --period 上午
# 按时段指定座位
node ./scripts/book_seat.js book --profile user1 --date 2026-03-24 --period 下午 --area 南区 --seat-row 4 --seat-no 5
# 整天自动分配
node ./scripts/book_seat.js book --profile user1 --date 2026-03-24
# 整天指定座位
node ./scripts/book_seat.js book --profile user1 --date 2026-03-24 --area 南区 --seat-row 4 --seat-no 5
说明:
--profile 就使用默认账号--profile <name> 会读取默认 profile 根目录下的 profiles/<name>.json~/.config/shlibrary-seat-booking--profile-dir 或 --auth-file 显式指定认证文件位置Skill 提供了基于 Node.js + Playwright 的浏览器自动化脚本,可以自动完成登录并获取认证信息:
# 在 skill 目录内安装 Playwright
cd /path/to/shlibrary-seat-booking
npm install playwright
# 安装浏览器二进制
npx playwright install chromium
说明:
npm install playwright,这样 node ./scripts/*.js 才能稳定加载本地 playwright 依赖npx playwright install chromium 会联网下载 Chromium 浏览器二进制# 默认账号登录
node ./scripts/login.js
# 指定profile登录
node ./scripts/login.js --profile user1
# 指定 profile 根目录
node ./scripts/login.js --profile user1 --profile-dir ~/.config/shlibrary-seat-booking
# 直接指定认证文件
node ./scripts/login.js --auth-file ~/.config/shlibrary-seat-booking/profiles/user1.json
脚本会:
seatyy / service/yuyue,优先直接调用 queryAuthInfo~/.config/shlibrary-seat-booking/profiles/default.json)seatyy -> service/yuyue -> queryAuthInfoaccessToken、sign、timestamp--profile 参数管理多个账号如果你更喜欢手动操作,或者想排查认证问题:
service/seatyy 或 service/yuyue)accessTokensigntimestampx-encode 不需要手动保存,脚本会在每次发请求前动态生成如果使用浏览器自动化登录,认证信息会自动保存。
如果手动获取,将认证信息保存到文件:
mkdir -p ~/.config/shlibrary-seat-booking/profiles
cat > ~/.config/shlibrary-seat-booking/profiles/default.json << 'EOF'
{
"accessToken": "你的accessToken",
"sign": "你的sign",
"timestamp": "你的timestamp"
}
EOF
chmod 600 ~/.config/shlibrary-seat-booking/profiles/default.json
注意:
book_seat.js 会先探测登录态;如果认证来自 profile 文件且缺失或失效,会自动拉起 login.jscode 101 / 获取用户信息时出现异常,脚本也会按失效登录态处理如果你需要管理多个账号,也可以按 profile 名称保存多个文件:
~/.config/shlibrary-seat-booking/profiles/default.json
~/.config/shlibrary-seat-booking/profiles/user1.json
~/.config/shlibrary-seat-booking/profiles/user2.json
认证读取优先级是:
--auth-file:直接读取显式指定的单文件--profile-dir + --profile:读取 <profile-dir>/profiles/<profile>.json--profile:读取 ~/.config/shlibrary-seat-booking/profiles/<profile>.json~/.config/shlibrary-seat-booking/profiles/default.json认证写入规则是:
--auth-file:登录成功后写回该文件--profile-dir + --profile:写 <profile-dir>/profiles/<profile>.json--profile:写 ~/.config/shlibrary-seat-booking/profiles/<profile>.json~/.config/shlibrary-seat-booking/profiles/default.json补充说明:
book_seat.js 会先探测登录态;如果 profile 文件缺失或登录态失效,会自动拉起 login.js统一使用 book 子命令:
# 整天自动分配
node ./scripts/book_seat.js \
book --date 2026-03-24
# 单时段自动分配
node ./scripts/book_seat.js \
book --date 2026-03-24 --period 上午
# 整天指定座位
node ./scripts/book_seat.js \
book --date 2026-03-24 --area 南区 --seat-row 4 --seat-no 5
# 单时段指定座位
node ./scripts/book_seat.js \
book --date 2026-03-24 --period 下午 --area 南区 --seat-row 4 --seat-no 5
脚本执行流程:
如果你只关心时间段,不关心具体座位,可以让系统自动分配:
# 预约3月22日上午,由系统自动分配座位
node ./scripts/book_seat.js \
book --date 2026-03-22 --period 上午
自动分配模式的流程:
也支持按时段标签自动分配:
node ./scripts/book_seat.js \
book --date 2026-03-22 --period 上午
如果要替另一个账号查预约:
node ./scripts/book_seat.js \
list --profile user1
如果你想先确认账号当前已经约了哪些时间段,可以直接查询:
node ./scripts/book_seat.js list
查询模式会:
如果你想先筛出“某一天全部时段都可用”的位置,可以直接查询。这里日期是必填参数,区域通过 --area 可选传入:
node ./scripts/book_seat.js \
availability --profile user1 --date 2026-03-20 --area 北区 西区 东区
如果你不指定区域,脚本会自动扫描全部区域:
node ./scripts/book_seat.js \
availability --profile user1 --date 2026-03-20
这个模式会:
说明:
--area 传一个或多个区域,例如 --area 北区 西区 东区2 / 3 / 4 / 5如果你已经知道预约 ID,可以直接取消:
node ./scripts/book_seat.js cancel --reservation-id 5187335
取消模式会:
更稳的使用顺序通常是:
list预约IDcancel --reservation-id [预约ID]当前脚本按业务规则使用固定 mapping:
下午 -> 13:45:00-16:45:00晚上 -> 17:00:00-20:30:00上午 -> 不可用上午 -> 09:15:00-12:45:00下午 -> 13:00:00-16:30:00晚上 -> 16:45:00-20:15:00如果图书馆后续调整了开放时段,这部分规则也需要同步更新。
当使用整天预约模式时,脚本会按这个顺序逐段尝试:
下午晚上上午这是一种 best-effort 策略:
1 秒,再继续下一段,尽量降低"请勿重复提交"这类频控问题当前脚本对部分临时性失败做了短重试:
系统拥挤,请稍后再试 时3 次1.5 秒像这些明确的业务失败不会自动重试:
座位已约满该时间段有其他预约目标座位不可用2: 东区3: 西区4: 北区5: 南区accessToken、sign、timestamp 三个字段是否都存在code 101 / 获取用户信息时出现异常,也按登录态失效处理code 101 / 获取用户信息时出现异常,通常也需要重新登录accessToken、sign、timestamp 后重试预约ID 是否存在可取消: 是