GoScry
GoScry 是一个用 Go 编写的服务器应用程序,它充当控制系统(例如 LLM 或脚本)和 Web 浏览器之间的桥梁。
copyleftdev
README
GoScry
<p align="center"> <img src="media/logo.png" alt="GoScry Logo" width="200"> </p>
<p align="center"> <a href="https://github.com/copyleftdev/goscry/actions/workflows/ci.yml"><img src="https://github.com/copyleftdev/goscry/actions/workflows/ci.yml/badge.svg" alt="GoScry CI"></a> <a href="https://goreportcard.com/report/github.com/copyleftdev/goscry"><img src="https://goreportcard.com/badge/github.com/copyleftdev/goscry" alt="Go Report Card"></a> <img src="media/goscry-quality-badge.svg" alt="Go Code Quality: Expert"> <img src="https://img.shields.io/github/go-mod/go-version/copyleftdev/goscry" alt="Go Version"> <a href="https://github.com/copyleftdev/goscry/releases"><img src="https://img.shields.io/github/v/release/copyleftdev/goscry" alt="Latest Release"></a> <a href="https://pkg.go.dev/github.com/copyleftdev/goscry"><img src="https://pkg.go.dev/badge/github.com/copyleftdev/goscry.svg" alt="Go Reference"></a> <a href="https://github.com/copyleftdev/goscry/blob/master/LICENSE"><img src="https://img.shields.io/github/license/copyleftdev/goscry" alt="License"></a> <a href="https://github.com/copyleftdev/goscry/issues"><img src="https://img.shields.io/github/issues/copyleftdev/goscry" alt="Issues"></a> <a href="https://github.com/copyleftdev/goscry/stargazers"><img src="https://img.shields.io/github/stars/copyleftdev/goscry" alt="Stars"></a> <img src="https://img.shields.io/docker/pulls/copyleftdev/goscry" alt="Docker Pulls"> <img src="https://img.shields.io/badge/platform-linux%20%7C%20macos%20%7C%20windows-brightgreen" alt="Platforms"> </p>
GoScry 是一个用 Go 编写的服务器应用程序,它充当控制系统(如 LLM 或脚本)和 Web 浏览器之间的桥梁。它使用 Chrome DevTools 协议 (CDP) 与基于通过其 API 提交的任务的网站进行交互。 GoScry 可以执行导航、点击、输入、处理身份验证(带有 2FA 的钩子)以及提取 DOM 内容等操作。结果和状态更新可以通过使用模型上下文协议 (MCP) 格式的 Webhook 报告回来。
特性
- 远程浏览器控制: 使用 CDP(通过
chromedp
)来控制无头或有头的 Chrome/Chromium 实例。 - 基于任务的 API: 通过简单的 JSON API 提交浏览器操作序列(导航、点击、输入、等待、获取 DOM、屏幕截图等)。
- 身份验证处理: 支持任务中的基本用户名/密码登录序列。
- 2FA 支持(手动钩子): 检测潜在的 2FA 提示,并通过 API/回调发回信号,允许外部系统或用户提供代码以继续任务。
- DOM 提取: 检索完整的 HTML、文本内容或 DOM 的简化版本。
- DOM AST: 生成 DOM 的结构化抽象语法树表示,并具有可选的作用域控制。
- MCP 输出: 根据模型上下文协议(规范 2025-03-26)格式化异步结果/状态更新(例如,通过回调),以实现清晰、结构化的上下文报告。
- 可配置: 通过 YAML 文件或环境变量管理服务器端口、浏览器设置、日志记录和安全性。
架构图
sequenceDiagram
participant Client as LLM 系统 / API 客户端
participant GS as GoScry 服务器 (API)
participant TM as 任务管理器
participant BM as 浏览器管理器
participant DOM as DOM 处理器
participant CDP as Chrome (通过 CDP)
participant Site as 目标网站
Client->>+GS: POST /api/v1/tasks (任务 JSON)
GS->>+TM: SubmitTask(task)
TM-->>GS: TaskID
GS-->>-Client: 202 Accepted (TaskID)
Note right of TM: 任务执行异步开始
TM->>BM: ExecuteActions(actions)
BM->>+CDP: 运行 CDP 命令 (导航, 点击, 等.)
CDP->>+Site: HTTP 请求
Site-->>-CDP: HTTP 响应 (HTML, 等.)
CDP-->>-BM: 操作结果 / DOM 状态
BM-->>TM: 操作完成 / 错误
alt DOM AST 检索
Client->>+GS: POST /api/v1/dom/ast (URL, ParentSelector)
GS->>+DOM: GetDomAST(URL, ParentSelector)
DOM->>+CDP: ChromeDP 操作 (导航, GetHTML)
CDP->>+Site: HTTP 请求
Site-->>-CDP: HTTP 响应 (HTML)
CDP-->>-DOM: HTML 内容
DOM-->>-GS: DOM AST 结构
GS-->>-Client: 200 OK (AST JSON)
end
alt 需要 2FA (例如, 登录操作后)
TM->>BM: ExecuteAction(detect2FAPrompt)
BM->>CDP: 检查页面状态以查找 2FA 指示器
CDP->>BM: 存在结果
BM->>TM: 检测到/未检测到提示
opt 检测到提示
TM->>TM: 更新任务状态 (WaitingFor2FA)
TM-->>Client: 通知回调 (MCP 2FA 请求)
Note over Client, TM: 客户端从外部检索代码
Client->>+GS: POST /api/v1/tasks/{id}/2fa (代码)
GS->>+TM: Provide2FACode(id, code)
TM->>TM: 信号/恢复任务执行
Note right of TM: 下一个操作键入 2FA 代码
TM->>BM: ExecuteActions(键入 2FA 代码, 提交)
BM->>+CDP: 键入代码, 提交
CDP->>+Site: 验证 2FA
Site-->>-CDP: 登录成功/失败
CDP-->>-BM: 结果
BM-->>TM: 操作完成
end
end
TM->>TM: 处理最终结果 / 格式化 MCP
TM-->>Client: 通知回调 (MCP 结果/状态)
TM->>TM: 更新任务状态 (已完成/失败)
Note over TM: 任务执行完成.
包结构
- cmd/goscry: 主应用程序入口点
- internal/taskstypes: 跨包共享的核心数据类型
- internal/tasks: 任务管理和执行
- internal/browser: 浏览器控制和 CDP 交互
- internal/server: HTTP API 处理程序
- internal/config: 配置处理
- internal/dom: DOM 处理实用程序
前提条件
- Go: 1.21 或更高版本。
- Chrome / Chromium: 在运行 GoScry 的系统上安装的兼容版本。 确保浏览器可执行文件位于系统 PATH 中,或在配置中提供路径。
安装
-
克隆存储库:
git clone [https://github.com/copyleftdev/goscry.git](https://github.com/copyleftdev/goscry.git) cd goscry
-
构建可执行文件:
go build -o goscry ./cmd/goscry/
这将在项目根目录中创建
goscry
二进制文件。 -
或者,从 releases page 下载预构建的二进制文件。
Docker 部署
GoScry 可以使用 Docker 和 Docker Compose 轻松部署,并提供多种部署选项。
使用 Docker 快速入门
-
克隆存储库:
git clone [https://github.com/copyleftdev/goscry.git](https://github.com/copyleftdev/goscry.git) cd goscry
-
启动容器:
docker compose up -d
-
通过 http://localhost:8090 访问 API
部署选项
GoScry 提供了几个预配置的部署配置文件:
-
基本部署 - 仅 GoScry 服务:
docker compose up -d
-
生产部署 - 包括带有 TLS 终止的 Traefik 反向代理:
docker compose --profile production up -d
-
监控部署 - 添加 Prometheus 和 Grafana 以实现可观察性:
docker compose --profile monitoring up -d
Docker 配置
-
环境变量:使用环境变量配置服务:
GOSCRY_API_KEY
:用于身份验证的 API 密钥LOG_LEVEL
:日志记录级别(debug、info、warn、error)AUTO_GENERATE_API_KEY
:自动生成安全的 API 密钥
-
卷:Docker 设置包括以下持久卷:
- 配置数据
- Prometheus 指标(使用监控配置文件时)
- Grafana 仪表板(使用监控配置文件时)
有关详细的 Docker 部署说明,请参阅 DOCKER.md。
持续集成和部署
GoScry 使用 GitHub Actions 进行 CI/CD:
- 每次推送到 main 和拉取请求时进行自动化测试
- 自动构建 Linux、macOS(Intel 和 ARM)和 Windows 的二进制文件
- 推送版本标签时自动发布(例如,
v1.0.0
)
有关发布过程的详细信息,请参阅 RELEASING.md。
配置
GoScry 通过 config.yaml
文件或环境变量进行配置。
- 复制示例配置:
cp config.example.yaml config.yaml
- 编辑
config.yaml
以适合您的环境:server.port
:API 服务器侦听的端口。browser.executablePath
:Chrome/Chromium 可执行文件的绝对路径(留空以尝试自动检测)。browser.headless
:true
以无头模式运行,false
以有头模式运行。browser.userDataDir
:持久用户配置文件目录的路径(可选,如果为空则创建临时配置文件)。browser.maxSessions
:最大并发浏览器实例数。log.level
:日志记录级别(debug
、info
、warn
、error
)。security.allowedOrigins
:允许 CORS 请求的来源列表。 在生产中使用特定域而不是*
。security.apiKey
:API 访问所需的密钥(通过GOSCRY_SECURITY_APIKEY
环境变量设置以获得更好的安全性)。
环境变量会覆盖文件设置。 它们以 GOSCRY_
为前缀,并使用下划线代替点(例如,GOSCRY_SERVER_PORT=9090
,GOSCRY_SECURITY_APIKEY=your-secret-key
)。
运行服务器
./goscry -config config.yaml
或者,如果主要使用环境变量:
export GOSCRY_SECURITY_APIKEY="your-secret-key"
# export GOSCRY_BROWSER_EXECUTABLEPATH="/path/to/chrome" # Optional
./goscry
服务器将启动并将输出记录到控制台,具体取决于配置的日志级别。
API 用法
API 在配置的端口(默认为 8080)上的 /api/v1
路径前缀下侦听。 如果设置了 security.apiKey
,则需要通过 X-API-Key
或 Authorization: Bearer <key>
标头进行身份验证。
端点
-
POST /api/v1/tasks
: 提交新的浏览器任务。- 请求正文:
SubmitTaskRequest
JSON(参见internal/server/handlers.go
)。 包括actions
、可选的credentials
、two_factor_auth
信息和callback_url
。 - 响应(成功):
202 Accepted
,带有包含task_id
的SubmitTaskResponse
JSON。 - 响应(错误):
400 Bad Request
、401 Unauthorized
、403 Forbidden
、500 Internal Server Error
。
- 请求正文:
-
GET /api/v1/tasks/{taskID}
: 获取任务的当前状态和结果。- URL 参数:
taskID
(UUID 字符串)。 - 响应(成功):
200 OK
,带有Task
JSON(参见internal/tasks/task.go
)。 - 响应(错误):
400 Bad Request
、401 Unauthorized
、403 Forbidden
、404 Not Found
、500 Internal Server Error
。
- URL 参数:
-
POST /api/v1/tasks/{taskID}/2fa
: 为等待 2FA 代码的任务提供 2FA 代码。- URL 参数:
taskID
(UUID 字符串)。 - 请求正文:
Provide2FACodeRequest
JSON(例如,{"code": "123456"}
)。 - 响应(成功):
200 OK
,带有简单的成功消息。 - 响应(错误):
400 Bad Request
、401 Unauthorized
、403 Forbidden
、404 Not Found
、409 Conflict
(如果任务未等待)、408 Request Timeout
(如果任务等待超时)、500 Internal Server Error
。
- URL 参数:
-
POST /api/v1/dom/ast
: 从带有可选父选择器的 URL 获取 DOM 抽象语法树。- 请求正文:
GetDomASTRequest
JSON(例如,{"url": "https://example.com", "parent_selector": "div#main"}
- parent_selector 是可选的)。 - 响应(成功):
200 OK
,带有表示为嵌套DomNode
对象的结构化 DOM 树。 - 响应(错误):
400 Bad Request
、401 Unauthorized
、403 Forbidden
、500 Internal Server Error
。
- 请求正文:
操作类型
提交请求中的 actions
数组定义了步骤:
类型 | 描述 | selector 是否使用 |
value 是否使用 |
format 是否使用 |
---|---|---|---|---|
Maps |
将浏览器导航到 URL。 | 否 | URL 字符串 | 否 |
wait_visible |
等待与选择器匹配的元素变为可见。 | 是 | 可选持续时间(例如,“5s”,默认为“30s”) | 否 |
wait_hidden |
等待与选择器匹配的元素变为隐藏。 | 是 | 可选持续时间(例如,“5s”,默认为“30s”) | 否 |
wait_delay |
暂停执行指定的持续时间。 | 否 | 持续时间字符串(例如,“2s”,“500ms”) | 否 |
click |
等待元素可见并单击它。 | 是 | 否 | 否 |
type |
将文本键入元素。 使用 {{task.tfa_code}} 进行 2FA 代码注入。 |
是 | 文本字符串,或 {{task.tfa_code}} |
否 |
select |
通过其 value 属性在 <select> 元素中选择一个选项。 |
是 | 选项 value 字符串 | 否 |
scroll |
滚动页面(top ,bottom )或将元素滚动到视图中。 |
如果 value 不是 top /bottom |
top 、bottom 或空(使用选择器) |
否 |
screenshot |
捕获全页屏幕截图。 结果附加到任务结果。 | 否 | 可选 JPEG 质量(0-100,默认为 90) | base64 (字符串) 或 png (字节) |
get_dom |
检索 DOM 内容。 结果附加到任务结果。 | 可选(默认为 body ) |
否 | full_html 、simplified_html 、text_content |
run_script |
在页面上下文中执行任意 JavaScript。 结果附加到任务结果。 | 否 | JavaScript 代码字符串 | 否 |
使用 DOM AST API
概述
DOM AST API 提供网页的文档对象模型 (DOM) 的结构化表示,作为抽象语法树。 此功能启用:
- 以编程方式分析页面结构
- 提取页面的特定部分,并保持其层次关系不变
- 执行具有作用域控制的定向内容提取
端点
POST /api/v1/dom/ast
请求参数
参数 | 类型 | 必需 | 描述 |
---|---|---|---|
url |
string | 是 | 要分析的网页的 URL |
parent_selector |
string | 否 | CSS 选择器,用于将 AST 的作用域限定为特定元素(例如,#main-content ,div.container ) |
响应结构
DOM AST 中的每个节点都具有以下结构:
{
"nodeType": "element", // "element", "text", "comment", 或 "document"
"tagName": "div", // HTML 标签名称(对于元素节点)
"id": "main", // ID 属性(如果存在)
"classes": ["container"], // CSS 类数组(如果存在)
"attributes": { // 所有属性的映射
"id": "main",
"class": "container"
},
"textContent": "", // 文本内容(主要用于文本节点)
"children": [] // 子节点数组
}
用法示例
请求:
curl -X POST http://localhost:8080/api/v1/dom/ast \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{
"url": "[https://example.com](https://example.com)",
"parent_selector": "#main-content"
}'
响应:
{
"nodeType": "element",
"tagName": "div",
"attributes": {"id": "main-content"},
"children": [
{
"nodeType": "element",
"tagName": "h1",
"attributes": {"class": "title"},
"children": [],
"textContent": "Welcome to Example.com"
},
{
"nodeType": "element",
"tagName": "p",
"attributes": {},
"children": [],
"textContent": "This domain is for use in illustrative examples in documents."
}
]
}
实现说明
- DOM AST 功能使用 ChromeDP 的选择器支持来实现强大的 CSS 选择器匹配
- 等待 5 秒钟,以便 JavaScript 繁重的页面在处理之前完全加载
- 适用于使用 React、Vue 或 Angular 等框架的简单站点和复杂的现代 Web 应用程序
- 处理各种 CSS 选择器,包括标签、类、ID 和嵌套选择器
贡献
欢迎贡献! 请随时提交拉取请求。
许可证
该项目已获得 MIT 许可证的许可 - 有关详细信息,请参阅 LICENSE 文件。
推荐服务器
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
MCP Package Docs Server
促进大型语言模型高效访问和获取 Go、Python 和 NPM 包的结构化文档,通过多语言支持和性能优化来增强软件开发。
Claude Code MCP
一个实现了 Claude Code 作为模型上下文协议(Model Context Protocol, MCP)服务器的方案,它可以通过标准化的 MCP 接口来使用 Claude 的软件工程能力(代码生成、编辑、审查和文件操作)。
@kazuph/mcp-taskmanager
用于任务管理的模型上下文协议服务器。它允许 Claude Desktop(或任何 MCP 客户端)在基于队列的系统中管理和执行任务。
mermaid-mcp-server
一个模型上下文协议 (MCP) 服务器,用于将 Mermaid 图表转换为 PNG 图像。
Jira-Context-MCP
MCP 服务器向 AI 编码助手(如 Cursor)提供 Jira 工单信息。

Linear MCP Server
一个模型上下文协议(Model Context Protocol)服务器,它与 Linear 的问题跟踪系统集成,允许大型语言模型(LLM)通过自然语言交互来创建、更新、搜索和评论 Linear 问题。

Sequential Thinking MCP Server
这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。
Curri MCP Server
通过管理文本笔记、提供笔记创建工具以及使用结构化提示生成摘要,从而实现与 Curri API 的交互。