SassafrasAI/intel471-rs
GitHub: SassafrasAI/intel471-rs
一个覆盖 Intel471 全部 13 个 API 服务的异步 Rust 客户端库,提供强类型访问、流式分页和 Monitor 管理能力。
Stars: 0 | Forks: 0
# intel471-rs
一个用于 [Intel471](https://intel471.com) 网络威胁情报平台的异步 Rust 客户端库。
## 概述
`intel471-rs` 提供了对 Intel471 API 的强类型、符合人体工程学的访问。它涵盖了所有 13 个 API 服务,支持流式分页、单一资源查询、monitor 的 CRUD 操作,并在适当的情况下支持原始响应处理。
该库使用 HTTP Basic Auth 以及您的 Verity API 应用程序凭证(client ID 和 client secret)进行身份验证,并支持为测试环境配置自定义 base URL。
## 安装说明
将该 crate 添加到您的 `Cargo.toml` 中:
```
[dependencies]
intel471-rs = "0.1"
```
或者通过 `cargo add` 安装:
```
cargo add intel471-rs
```
## 身份验证
Intel471 API 使用您的 Verity 应用程序凭证通过 HTTP Basic Auth 进行身份验证。在 Verity Developer Portal 中创建一个应用程序以获取 client ID 和 client secret,然后将它们分别作为用户名和密码传入:
```
use intel471_rs::Intel471Client;
let client = Intel471Client::new("client_id", "client_secret");
```
要使用自定义的 base URL:
```
let client = Intel471Client::with_base_url("client_id", "client_secret", "https://custom.api.example.com");
```
## 快速入门
```
use intel471_rs::Intel471Client;
use intel471_rs::models::actors::ActorStreamRequest;
#[tokio::main]
async fn main() -> Result<(), Box> {
let client = Intel471Client::new("client_id", "client_secret");
// Stream actors matching a search term
let mut stream = client.actors().stream(ActorStreamRequest {
actor: "Conti".to_string(),
from: None,
until: None,
forum: None,
server_type: None,
size: Some(10),
cursor: None,
})?;
while let Some(page) = stream.next_page().await? {
for actor in &page.actors {
println!("{}: {}", actor.id, actor.activity.first_seen_ts);
}
}
Ok(())
}
```
## API 覆盖范围
| 服务 | Client 访问器 | 主要方法 |
|---------|----------------|-------------|
| Actors | `client.actors()` | `stream`, `stream_page` |
| ASE | `client.ase()` | `list_monitors` |
| Brand Exposure | `client.brand_exposure()` | Monitor 的 CRUD、扫描数据 endpoint、配置 endpoint |
| Credentials | `client.credentials()` | Credential/set/occurrence 的流式获取和查询 |
| Entities | `client.entities()` | `stream`, `stream_page` |
| GIRS | `client.girs()` | `tree` |
| Indicators | `client.indicators()` | `stream`, `stream_page`, `get_by_id` |
| Malware Intel | `client.malware()` | `stream`, `get_by_id`, `list_malware`, `get_malware_family`, `download_file` |
| Observables | `client.observables()` | `stream`, `stream_page` |
| Reports | `client.reports()` | 用于 FINTel、Breach Alert、Geopol、Info、Spot、Malware、Vulnerability 报告的流式获取/详情 |
| Sources | `client.sources()` | 用于 data-leak-site 帖子、论坛帖子/消息、聊天消息的流式获取/详情 |
| TPRM | `client.tprm()` | Monitor 的 CRUD、扫描数据 endpoint、配置 endpoint |
| Watchers | `client.watchers()` | `alerts_stream`, `update_alert_status`, `watcher_groups`, `watchers` |
## 使用方法
### 带分页的流式处理
许多 Intel471 endpoint 通过基于游标的 API 返回分页结果。该库提供了两种模式:
- **`stream()`** 返回一个 `PaginatedStream`,用于自动的基于游标的分页。
- **`stream_page()`** 获取单页并直接返回响应。
```
use intel471_rs::Intel471Client;
use intel471_rs::models::actors::ActorStreamPage;
use intel471_rs::api::actors::ActorStreamRequest;
let client = Intel471Client::new("client_id", "client_secret");
// Automatic pagination
let mut stream = client.actors().stream(ActorStreamRequest {
actor: "Conti".to_string(),
from: Some(1700000000),
until: None,
forum: None,
server_type: None,
size: Some(10),
cursor: None,
})?;
while let Some(page) = stream.next_page().await? {
println!("Page with {} actors", page.actors.len());
}
// Collect all pages
let all_pages: Vec = client
.actors()
.stream(ActorStreamRequest {
actor: "Conti".to_string(),
from: None,
until: None,
forum: None,
server_type: None,
size: None,
cursor: None,
})?
.collect_all()
.await?;
```
### 单一资源查询
```
// Get a credential by ID
let credential = client.credentials().get_credential("credential-id").await?;
// Get an indicator by ID
let indicator = client.indicators().get_by_id("indicator-id").await?;
// Get a malware event by ID
let event = client.malware().get_by_id("event-id").await?;
// Get the GIRS tree
let tree = client.girs().tree().await?;
for gir in &tree.girs {
println!("{}: {}", gir.id.as_deref().unwrap_or("-"), gir.name.as_deref().unwrap_or("-"));
}
```
### Monitor 管理
Brand Exposure 和 TPRM 服务支持完整的 monitor 生命周期操作:
```
use intel471_rs::models::brand_exposure::{
CreateMonitorRequest, EditMonitorRequest, Frequency, Impact, ListMonitorsRequest,
};
// Create a monitor
let request = CreateMonitorRequest {
name: "example.com".to_string(),
targets: vec!["example.com".to_string()],
labels: vec!["brand-monitor".to_string()],
frequency: Frequency::daily,
impact: Impact::major,
alerts: None,
created_at: None,
disabled_modules: None,
event_types: None,
iteration: None,
start_at: None,
};
let response = client.brand_exposure().create_monitor(&request).await?;
// List monitors
let monitors = client.brand_exposure().list_monitors(ListMonitorsRequest {
last_run_after: None,
last_run_before: None,
}).await?;
// Edit a monitor
client.brand_exposure().edit_monitor(&response.id, &EditMonitorRequest {
name: "updated-name".to_string(),
targets: vec!["example.com".to_string()],
labels: vec!["brand-monitor".to_string()],
frequency: Frequency::daily,
impact: Impact::major,
alerts: None,
created_at: None,
disabled_modules: None,
event_types: None,
iteration: None,
start_at: None,
}).await?;
// Delete a monitor
client.brand_exposure().delete_monitor(&response.id).await?;
```
### 错误处理
该库提供了一个带有便捷方法的结构化错误类型:
```
use intel471_rs::Error;
match client.credentials().get_credential("invalid-id").await {
Ok(cred) => println!("{:?}", cred),
Err(Error::Api { status: 404, .. }) => println!("Not found"),
Err(Error::Api { status: 401, .. }) => println!("Unauthorized"),
Err(Error::Api { status: 403, .. }) => println!("Forbidden"),
Err(Error::Api { status: 429, .. }) => println!("Rate limited"),
Err(e) => println!("Other error: {}", e),
}
// Convenience methods
if let Err(e) = result {
if e.is_not_found() { /* handle 404 */ }
if e.is_unauthorized() { /* handle 401 */ }
if e.is_forbidden() { /* handle 403 */ }
if e.is_rate_limited() { /* handle 429/503 */ }
}
```
## Crate 功能特性
该库是基于以下组件构建的:
- **reqwest** — 带有原生 TLS 和 JSON 支持的 HTTP 客户端
- **serde** / **serde_json** — 序列化和反序列化
- **chrono** — 带有 Serde 支持的日期和时间处理
- **tokio** — 异步 runtime(用于测试的 dev-dependency)
## 最低支持的 Rust 版本
此 crate 需要 Rust 2024 edition(MSRV 1.85+)。
## 许可证
基于 [BSD 3-Clause License](LICENSE) 授权。
标签:Rust, 可视化界面, 威胁情报, 开发者工具, 异步编程, 网络客户端, 网络流量审计, 通知系统