crawlsnap/crawlsnap-go
GitHub: crawlsnap/crawlsnap-go
CrawlSnap 数据智能平台的官方 Go SDK,提供类型化的信誉查询、威胁情报增强与子域名扫描接口封装。
Stars: 0 | Forks: 0
# CrawlSnap Go SDK
[CrawlSnap](https://crawlsnap.com) 数据智能平台的官方 Go 客户端。提供类型化的响应、类型化的错误、自动重试以及按产品划分的 API 版本控制。
## 安装
```
go get github.com/crawlsnap/crawlsnap-go
```
需要 Go 1.23+(paginator 使用了 range-over-func)。
## 认证
从您的控制面板获取 API 密钥并将其传递给 `NewClient`,或者设置 `CRAWLSNAP_API_KEY` 环境变量并传递空字符串。
```
client, err := crawlsnap.NewClient("sk-cs-...") // or NewClient("") with the env var
if err != nil {
log.Fatal(err)
}
```
## 快速开始
```
package main
import (
"context"
"fmt"
"log"
crawlsnap "github.com/crawlsnap/crawlsnap-go"
)
func main() {
client, err := crawlsnap.NewClient("")
if err != nil {
log.Fatal(err)
}
ip, err := client.VectorSnap.IP(context.Background(), "8.8.8.8")
if err != nil {
log.Fatal(err)
}
fmt.Println(ip.GetReputation(), ip.GetAsOwner())
}
```
每次调用成功时会返回解包后的、类型化的 payload,否则返回类型化的错误——您无需亲自检查响应封装。
## 资源
| 调用 | 返回 |
|---|---|
| `client.VectorSnap.URL(ctx, q)` | URL 的信誉增强 |
| `client.VectorSnap.Hash(ctx, q)` | 文件哈希的信誉增强 |
| `client.VectorSnap.IP(ctx, q)` | IP 的信誉增强 |
| `client.VectorSnap.Domain(ctx, q)` | 域名的信誉增强 |
| `client.PulseSnap.URL / Hash / IP / Domain(ctx, q)` | 威胁情报脉冲增强 |
| `client.SubdoSnap.Scan(ctx, q)` | 一页子域名 |
| `client.SubdoSnap.ScanIter(ctx, q)` | 跨越所有页面的全部子域名 |
## 错误
失败时会返回类型化的错误,可通过 `errors.As` 进行排查:
```
ip, err := client.VectorSnap.IP(ctx, "8.8.8.8")
if err != nil {
var nf *crawlsnap.NotFoundError
switch {
case errors.As(err, &nf):
// no data for this indicator
default:
var status *crawlsnap.APIStatusError // any HTTP status error
if errors.As(err, &status) {
log.Printf("status=%d request_id=%s", status.StatusCode, status.RequestID)
}
}
}
```
| 类型 | 状态码 | 含义 |
|---|---|---|
| `BadRequestError` | 400 | 无效的指示器 |
| `AuthenticationError` | 401 | 密钥缺失/无效 |
| `QuotaExceededError` | 402 | 额度或月度配额用尽 |
| `SubscriptionInactiveError` | 403 | 订阅未激活 |
| `NotFoundError` | 404 | 没有该指示器的数据 |
| `RateLimitError` | 429 | 请求达到限制(包含 `RetryAfter`) |
| `ServerError` | 5xx | 服务器/上游故障 |
| `APIConnectionError` | — | 传输失败(DNS / 连接 / TLS) |
| `APITimeoutError` | — | 请求超时(同时也是 `APIConnectionError`) |
`APIStatusError` 可匹配任何状态错误;`CrawlSnapError` 接口可匹配 SDK 返回的任何内容。
## 分页
`ScanIter` 会自动为您追踪游标。在 Go 1.23+ 中使用 range 遍历它:
```
for sub, err := range client.SubdoSnap.ScanIter(ctx, "example.com") {
if err != nil {
log.Fatal(err)
}
fmt.Println(sub["subdomain"])
}
```
如需手动分页,请先使用 `Scan`,然后使用返回的 `Cursor` 调用 `ScanWithCursor`。
## API 版本控制
每个产品均独立进行版本控制。直接调用会使用该产品的**稳定默认**版本(`crawlsnap.DefaultVersion`),当您升级 SDK 时,该版本永远不会自行变动。您可以将某个产品固定到特定版本,而不影响其他产品:
```
client.VectorSnap.IP(ctx, "8.8.8.8") // stable default version
client.VectorSnap.V1().IP(ctx, "8.8.8.8") // explicitly VectorSnap v1
client.PulseSnap.Domain(ctx, "example.com") // unaffected — PulseSnap default
```
## 配置
```
client, err := crawlsnap.NewClient("sk-cs-...",
crawlsnap.WithBaseURL("https://api.crawlsnap.com"), // or $CRAWLSNAP_BASE_URL
crawlsnap.WithTimeout(30*time.Second),
crawlsnap.WithMaxRetries(3), // 429 / 5xx / connection
crawlsnap.WithHTTPClient(myHTTPClient), // advanced
)
```
重试机制采用带抖动的指数退避策略,并在遇到 429 错误时遵从 `Retry-After` 响应头。
## 原始响应
在获取类型化返回结果的同时,捕获完整的封装信息(状态、标头、请求 ID):
```
var raw crawlsnap.RawResponse
ip, err := client.VectorSnap.IP(ctx, "8.8.8.8", crawlsnap.WithRawResponse(&raw))
// raw.StatusCode, raw.RequestID, raw.Headers, raw.IsSuccess, raw.Data
```
## 开发
`models/` 中的类型化模型是根据公开的 OpenAPI 契约生成的;facade 为手写代码。在契约变更后重新生成模型:
```
./scripts/regenerate.sh # re-bundles the contract and regenerates models/ only
go test ./...
```
## 发布
发布版本即为 git 标签——推送 `vX.Y.Z` 标签会将该模块发布到 Go 代理(无需单独上传到注册中心)。使用以下辅助工具:
```
./scripts/release.sh 0.2.0 # bumps version.go, runs checks, commits, tags, pushes, gh release
```
标签是不可变的:要修复错误的发布,请发布一个新的补丁版本。`v2` 及以上的版本还需要在 `go.mod` 中添加 `/v2` 模块路径后缀。
## 许可证
[MIT](LICENSE)
标签:API客户端, EVTX分析, Go, Ruby工具, 威胁情报, 开发者工具, 数据智能, 日志审计