帮助中心

通过本地 API 把脚本接到 Profile

本地 API 在哪、怎么读端口和 token,以及启动 Profile、用 CDP 接上 Puppeteer 或 Playwright、查状态、停止这五步。

应用解锁期间,Agilelogin 会在这台电脑上运行一个小的 HTTP API。脚本从两个文件读出端口和会话 token,请求 API 启动一个 Profile,再通过 Chrome DevTools Protocol(CDP)接上它拉起的浏览器;本文讲这条路径,以及这个 API 不做的事。

适用范围: launcher 0.1.0,API 版本 v1。完整的 API 参考在首发后发布;在那之前,只使用本文给出的调用。

服务在哪里?

  • API 只监听 127.0.0.1,端口由操作系统在每次服务启动时随机分配。没有远程访问,也没有任何设置能把它绑到别的地址。
  • 服务启动时会往应用数据目录写两个文件,脚本每次连接前都要重新读:
    • api_port:纯文本的端口号。
    • api_token:64 个十六进制字符的会话 token,每次启动都重新生成。Windows 上依赖 %APPDATA% 的默认用户权限;macOS 上该文件只有你的用户可读。
  • 数据目录:Windows 为 %APPDATA%\com.agilelogin.app\,macOS 为 ~/Library/Application Support/com.agilelogin.app/。
  • 锁定应用(手动锁定,或 15 分钟无操作自动锁定)会停掉服务并删除这两个文件。此时脚本看到的是连接被拒绝,不是 401。解锁后服务重新启动,端口和 token 都是新的,所以不要缓存它们。
  • 除 GET /api/v1/status 外,所有路由都需要请求头 Authorization: Bearer <api_token 文件内容>。缺少或错误的 token 返回 401,响应体形如 { "error": { "kind": "unauthorized", "message": "…" } }。
  • 所有路径以 /api/v1 开头。请求和响应字段一律 camelCase。

最小流程

  1. 从数据目录读出 api_port 和 api_token。
  2. 带 Bearer 头调用 POST /api/v1/profiles/{id}/start。200 响应里有 cdpReady 和 cdpEndpoint,形如 ws://127.0.0.1:<port>/devtools/browser/<guid>。
  3. 接上:puppeteer.connect({ browserWSEndpoint: cdpEndpoint }) 或 playwright.chromium.connectOverCDP(cdpEndpoint)。
  4. GET /api/v1/profiles/{id}/status 返回 status(idle、running 或 error)和当前的 cdpEndpoint;浏览器没在运行时为 null。
  5. POST /api/v1/profiles/{id}/stop 关闭浏览器。

这条流程依赖的几件事:

  • cdpEndpoint 是内核自己报出来的地址,端口每次启动都不同。从响应里读,不要自己拼。
  • start 可能返回 200 但 cdpReady: false、cdpEndpoint: null:浏览器起来了,CDP 在大约十秒内没就绪。连接前先检查 cdpReady。
  • GET /api/v1/profiles/{id} 返回的 Profile 对象不含 cdpEndpoint,要从 status 拿。
  • 这个 API 没有事件推送,也没有 WebSocket。状态变化靠轮询 status。你用到的唯一一条 WebSocket 是内核的 CDP,不属于这个 API。
  • 对已在运行的 Profile 再次 start 返回 422,消息为 Profile is already running。
  • 启用启动安全锁时,如果同一个 Profile 正在另一台登录了同一账号的设备上打开,start 可能返回 409,消息以机器可解析的前缀 PROFILE_IN_USE_ELSEWHERE: 开头。启动安全锁是协商性的:它协调守规矩的客户端,不是访问控制;拿不到租约的客户端(比如断网时)照样能启动。
  • GET /api/v1/status 不需要 token,返回应用版本和 apiVersion,可以当健康检查用。

API 还覆盖什么

本版本已稳定、完整请求形状在首发后的参考里给出的部分:

  • Profile: 列出、创建、读取、修改、删除,批量删除,按状态计数,启动、停止、查状态。
  • 代理: 列出、创建、批量创建、修改、删除,以及对单个代理做连通性和出口 IP 检测。
  • Cookie(挂在 Profile 下): 读概要、清空、导入(Netscape、JSON 或 EditThisCookie)、导出、复制到另一个 Profile。
  • 分组: 列出、创建、删除。
  • 扩展: 列出和删除已导入的扩展,从本机路径导入(crx、zip 或解包目录),读取或设置某个 Profile 加载哪些扩展。
  • 账号: 读账号状态,注册,登录和登出,列出和踢除设备会话,发忘记密码邮件,重发验证邮件,设置密码。登录响应不含 access 或 refresh token。Google 或 GitHub 社交登录不走 API:它需要有人在键盘前点授权,只在应用窗口里有入口。

本版本已存在、但首发后形状可能变化、因此这里只列名不给用法的部分:内核状态,批量导入导出(异步,有操作可轮询或取消),把 Profile 迁到另一个内核版本,重置某个 Profile 的登录状态,克隆机检查,应用自用的 license 端点,以及做镜像前的制备。

错误

  • 响应体为 { "error": { "kind": "<snake_case>", "message": "<English sentence>" } },状态码按类别:400、403、404、409、422、500、502。
  • 请求在到达路由前就被框架拒绝时(比如 JSON 解析失败),返回的是纯文本 422,不是上面的形状。
  • 消息一律英文,不本地化。错误体的字段首发后可能变。

一个 token 能做什么

读到 api_token 的本地进程,就能以这台电脑的身份做这个 API 能做的一切:导入导出 cookie、启停浏览器、替这台电脑登录或登出账号。边界是这个文件只有当前操作系统用户可读。没有按脚本的权限划分,也没有只读 token。登录响应不透传 access 或 refresh token,所以进程能替这台电脑操作,但不能把凭据带走。

不提供的

  • 没有远程访问:服务只监听 127.0.0.1,没有任何东西能改这一点。
  • 没有云端 API:这个 API 只存在于装了应用的那台电脑上。账号服务不向第三方开放接口。
  • 这个 API 没有事件推送,也没有 WebSocket。

关于 API 的问题请发到 support@agilelogin.com。