Local API
通过 HTTP 从您自己的软件控制正在运行的 Q-Booth(同一台电脑或局域网):开启活动、拍照、打印、显示二维码并读取拍照亭状态。
Local API 让您自己的软件通过 HTTP 控制正在运行的 Q-Booth——可以在同一台电脑上,也可以在局域网中的其他设备上。开启活动、引导宾客完成拍摄、打印、显示二维码,并随时读取拍照亭当前的状态。
本页说明的是 API 版本 1。拍照亭会在 status → app.apiVersion 中报告它运行的版本。该 API 仅在局域网内可用,无法通过互联网访问。
快速开始
- 打开应用设置窗口,进入高级 → Local API,打开开启 Local API。(如果看不到高级,请先打开显示全部设置。)
- 密码留空会自动生成,也可以自行输入。默认端口为
8730。 - 如需从其他设备调用,请打开允许网络中的其他设备。Windows 可能会询问一次是否允许 Q-Booth 通过防火墙——请选择允许。
- 点击保存设置,然后点击打开测试页面。测试页面为每个命令提供一个按钮,并附有拍照亭自带的这份参考文档。
地址为 http://<拍照亭电脑>:8730(在拍照亭电脑本机上为 http://localhost:8730)。所有命令都位于 /api/v1/ 之下。
curl http://localhost:8730/api/v1/status -H "Authorization: Bearer 您的密码"
密码
除 GET /api/v1/commands 外,每次调用都需要密码。可用以下任一方式发送:
Authorization: Bearer <密码>(推荐)X-QBooth-Key: <密码>- 在网址中加
?key=<密码>,适用于只能打开链接的工具
密码错误或缺失时返回 401。同一地址在一分钟内输错十次,将被封锁一分钟(429)。密码相当于操作员的钥匙——任何拿到它的人都能控制拍照亭,请妥善保管。
返回格式
读取类命令使用 GET,返回 200 和数据:
{ "ok": true, "data": { ... } }
操作类命令使用 POST,参数放在 JSON 正文(或查询字符串)中。也可以用 GET,方便只能发送 GET 的触发工具。操作被接受后,拍照亭一收到就返回 202——不会等待拍照、打印或宾客操作完成:
{ "ok": true, "accepted": "camera/capture" }
被拒绝的调用会说明原因,并附带可供程序判断的代码:
{ "ok": false, "error": { "code": "wrong_page", "message": "The booth is on the welcome page. This needs the Camera page." } }
API 不会把命令排队稍后执行。如果拍照亭当前状态不允许,会立即拒绝。错误信息始终为英文;请在程序中使用 code 进行判断。
状态
GET /api/v1/status 告诉您拍照亭当前所处的位置。执行操作后可定时调用来跟进结果——每 300 到 1000 毫秒一次即可。如果完全无法连接,说明 Q-Booth 没有运行(或 Local API 未开启)。
{
"app": { "name": "QBooth", "version": "5.9.1.0", "apiVersion": "1" },
"event": { "id": "1781706869_H5A4", "name": "Wedding" },
"page": "camera",
"session": { "active": true, "templateId": "…", "templateName": "Strip 3" },
"camera": { "phase": "review", "shot": 3, "shots": 3, "captured": 3, "feed": "live", "retakesLeft": 1 },
"result": null,
"busy": { "dialog": false, "processing": false },
"available": ["camera/retake", "camera/process", "session/end", "event/stop"]
}
| 字段 | 含义 |
|---|---|
event | 正在运行的活动;未运行活动时为 null。 |
page | none、welcome、survey、categoryPicker、templatePicker、input、camera 或 result。 |
session | 宾客开始(且在收费活动中已付款)后 active 为 true,以及目前选中的模板。 |
camera | 仅在拍照页面出现。phase 为 liveIdle、counting、recording、capturing、reveal、shotDelay 或 review。retakesLeft 为 null 表示不限次数。 |
result | 仅在结果页面出现:当前显示第几张结果,共几张。 |
busy | 屏幕上有对话框(付款、PIN、二维码、提示),或照片正在处理。任一为真时,操作都会被拒绝。 |
available | 拍照亭此刻会接受的操作——与操作本身使用同样的检查,可直接用来启用或置灰您软件中的按钮。 |
一位宾客的完整流程
典型流程,每一步都在 status 中等待所示的页面或阶段:
| 调用 | 然后等待 |
|---|---|
POST event/start {"id": "…"} | page: welcome |
POST session/start | page: templatePicker(或 categoryPicker / survey,取决于活动设置) |
POST template/select {"index": 1} | page: camera、camera.phase: liveIdle、camera.feed: live |
POST camera/capture | camera.phase: review |
POST camera/process | page: result |
POST result/print | — |
POST session/end | page: welcome |
API 遵循与宾客相同的规则。问卷、表单、付款或 PIN 会像点击后一样出现在拍照亭屏幕上,API 不会替宾客填写。打印数量限制和打印 PIN 同样有效。
命令
所有路径都以 /api/v1/ 开头。index 从 1 开始,顺序与宾客看到的卡片一致(左上方的图库在前)。id 和 index 二选一;如果两者都发送,以 id 为准。
| 命令 | 可用时机 | 作用 |
|---|---|---|
GET status | 随时 | 拍照亭当前位置,以及会接受哪些操作。见状态。 |
GET commands | 随时,无需密码 | 命令列表及 API 版本——测试页面即由此生成。 |
GET events | 随时 | 电脑上的所有活动:id、name、archived、templateCount、running。 |
POST event/start{"id": "…"} | 没有活动在运行、没有对话框、活动编辑器未打开其他活动或有未保存的修改 | 开启活动,与活动的启动按钮相同。如有模板警告,会先显示在拍照亭屏幕上。 |
POST event/stop | 活动正在运行、没有对话框、未在处理 | 结束拍照亭会话并返回应用。不会询问退出 PIN。 |
GET templates?eventId=…(可选) | 带 eventId 时随时可用;不带时需有活动在运行 | 宾客可选的模板。带 eventId:任何已保存的活动,无论是否在运行。不带:正在运行的活动,在其模板选择页(或带模板图库的欢迎页)上 onScreen 和 index 表示显示了哪些卡片。 |
GET categories?eventId=…(可选) | 带 eventId 时随时可用;不带时需有活动在运行 | 活动中已启用的分类,eventId 规则相同。在正在运行的活动的分类选择页上,onScreen 和 index 表示显示了哪些卡片。 |
POST session/start | 欢迎页 | 开始按钮。如活动设有开始 PIN 或付款,会显示在拍照亭屏幕上。 |
POST session/end | 欢迎页之后的任何页面 | 主页按钮:结束该宾客的会话并返回欢迎页。 |
POST category/select{"id": "…"} 或 {"index": n} | 分类选择页 | 像点击卡片一样选择分类,然后打开模板选择页。 |
POST template/select{"id": "…"} 或 {"index": n} | 欢迎页(活动中的任意模板),或模板选择页且该模板显示在页面上 | 在模板选择页:像点击卡片一样选择模板并确认(会替您按下“下一步”按钮)。在欢迎页:以该模板开始会话,如同点击欢迎页模板图库中的卡片。启动 PIN 或付款会先显示在拍照机屏幕上,然后跳过选择页。在欢迎页上,index 按欢迎页图库的卡片计数;若欢迎页没有图库,请用 id 选择。 |
POST camera/capture | 拍照页面,实时取景待机(或两张照片之间的等待),相机在线 | 拍照按钮:开始倒计时和拍摄。在手动多张拍摄的间隔中,拍下一张。 |
POST camera/retake | 拍照页面,正在查看照片,仍有重拍次数 | 对当前显示的照片按下重拍按钮,遵循该按钮的点击后设置。 |
POST camera/process | 拍照页面,正在查看照片 | 处理按钮:把照片交给模板处理。 |
POST result/print | 结果页面,已设置打印机,允许打印 | 对当前显示的结果按下打印按钮。打印 PIN、数量限制和打印后锁定均有效;若在出售额外打印,则打开购买流程。 |
POST result/qr{"type": "web"} 或 "local" | 结果页面,且已在设置中配置该类型的二维码 | 显示当前结果的二维码,与 QR Web / QR Local 按钮相同。默认 web。 |
错误
| HTTP | 代码 | 含义 |
|---|---|---|
| 400 | bad_request | 参数缺失或无效。 |
| 401 | unauthorized | 没有密码或密码错误。 |
| 404 | not_found | 未知的路径或命令。 |
| 404 | unknown_event、unknown_template、unknown_category | 找不到该 id 或 index 对应的活动、模板或分类。 |
| 405 | method_not_allowed | 对读取类命令发送了 POST。 |
| 409 | no_event | 该命令需要有活动在运行。 |
| 409 | event_running | 已有活动在运行。 |
| 409 | editor_open | 拍照亭电脑上的活动编辑器已打开(其他活动,或有未保存的修改)。 |
| 409 | no_templates | 该活动没有模板。 |
| 409 | wrong_page | 在拍照亭当前显示的页面上不可用。 |
| 409 | wrong_phase | 在拍照页面,但还未到可以执行的阶段。 |
| 409 | dialog_open | 拍照亭屏幕上有对话框打开。 |
| 409 | processing | 照片正在处理。 |
| 409 | busy | 拍照亭仍在完成上一个操作,请稍后再试。 |
| 409 | not_allowed | 被规则阻止:重拍次数用完、达到打印上限、打印后锁定中。 |
| 409 | not_configured | 没有打印机,或该类型的二维码未在设置中配置。 |
| 429 | too_many_attempts | 密码错误次数过多,请等待一分钟。 |
| 503 | busy | Q-Booth 没有及时响应,请重试。 |
日志
每次调用都会写入应用日志文件夹 log\local_api\,每天一个文件:调用方地址、命令及其参数、返回结果以及被拒绝的原因。密码从不写入日志。成功的 status 轮询不会记录。
版本历史
| API 版本 | Q-Booth 版本 | 变更 |
|---|---|---|
| 1 | 即将推出 | 首个版本:status、commands、events、活动开启 / 结束、templates、categories、会话开始 / 结束、分类与模板选择、相机拍照 / 重拍 / 处理、结果打印与二维码。 |
仍需要帮助?
我们的团队在 WhatsApp 上为您解答。请告知 Q-Booth 版本及屏幕上显示的内容。