Skip to content

Commit 110d7fd

Browse files
authored
Merge pull request #63 from MaekBlack/main
feat: webhook 工具 & json handler 工具
2 parents 4c7bf79 + c4660f6 commit 110d7fd

8 files changed

Lines changed: 293 additions & 0 deletions

File tree

8.79 KB
Binary file not shown.

tools/tool_json_handler/README.md

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# JSON 路径处理工具
2+
一个基于 `jsonpath_ng` 的安全、高效的 JSON 数据路径查询与操作工具库。它封装了标准的 jsonpath 语法,提供数据查询、更新、删除等核心操作,并内置缓存机制以提升性能。
3+
4+
## 一、项目介绍
5+
6+
### 1.1 核心功能
7+
- **精准查询**: 使用标准的 jsonpath 表达式从复杂的嵌套 JSON 结构中提取数据。
8+
- **数据更新**: 定位并修改 JSON 数据中指定路径节点的值。
9+
- **节点删除**: 安全地删除 JSON 数据中符合路径表达式的节点。
10+
- **健壮性保障**: 全面的输入验证和异常捕获,所有错误以字符串形式返回,避免程序崩溃。
11+
- **性能优化**: 内置路径表达式编译缓存,对重复查询场景性能提升显著。
12+
13+
### 1.2 适用场景
14+
- 从 API 响应或配置文件中提取特定字段。
15+
- 批量修改或清理 JSON 数据结构(如日志、数据记录)。
16+
- 在数据处理流水线中,作为 JSON 内容转换的中间件。
17+
- 开发需要动态解析和操作 JSON 的脚本或工具。
18+
19+
## 二、环境准备
20+
21+
### 2.1 依赖库
22+
- **Python**: 3.7 或更高版本。
23+
- **jsonpath_ng**: >= 1.5.0 (核心依赖,提供 JSONPath 解析能力)。
24+
- **json**: Python 标准库,无需单独安装。
25+
26+
### 2.2 安装依赖
27+
使用 pip 安装必需的第三方库:
28+
```bash
29+
pip install jsonpath_ng>=1.5.0
30+
```
31+
32+
## 三、使用说明
33+
34+
### 3.1 函数定义
35+
核心函数为 `execute_jsonpath_operation`,位于 `jsonpath_util.py` 文件中。
36+
```python
37+
from jsonpath_util import execute_jsonpath_operation
38+
```
39+
40+
### 3.2 参数说明
41+
42+
| 参数名 | 类型 | 必需 | 默认值 | 描述 | 有效值/范围 | 示例 |
43+
|--------|------|------|--------|------|------------|------|
44+
| `json_content` | `str` ||| 待处理的 JSON 数据字符串。必须是有效的 JSON 格式。 | 任意有效的 JSON 字符串 | `‘{“name”: “Test”}’` |
45+
| `path_expression` | `str` ||| 用于定位数据的 jsonpath 表达式。 | 标准 JSONPath 语法 | ``$.store.book[*].title`` |
46+
| `operation_type` | `str` || `”query”` | 指定要执行的操作类型。 | `”query”`, `”update”`, `”delete”` | `”update”` |
47+
| `new_value` | `Any` || `None` |`operation_type=”update”` 时,用于替换匹配节点的新值。 | 任何 Python 可 JSON 序列化的数据类型 | `30`, `”new”`, `[1,2]` |
48+
49+
**参数关系说明**:
50+
- `new_value` 仅在 `operation_type=”update”` 时为有效参数,否则会被忽略。
51+
- `path_expression` 支持标准 JSONPath 语法,包括根节点 (`$`)、子节点 (`.`/`[]`)、递归下降 (`..`)、通配符 (`*`)、数组索引/切片 (`[n]`, `[start:end]`)、过滤表达式 (`?(expression)`)。
52+
53+
### 3.3 代码示例
54+
55+
#### 示例 1:基础查询操作
56+
**场景**:从一个在线书店的库存 JSON 中提取所有书籍的标题。
57+
58+
```python
59+
import json
60+
from jsonpath_util import execute_jsonpath_operation
61+
62+
# 原始 JSON 数据字符串
63+
json_str = """
64+
{
65+
"store": {
66+
"book": [
67+
{"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95},
68+
{"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "price": 22.99},
69+
{"category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99}
70+
],
71+
"bicycle": {"color": "red", "price": 19.95}
72+
}
73+
}
74+
"""
75+
76+
# 1. 使用 jsonpath 表达式查找所有书籍标题
77+
result = execute_jsonpath_operation(json_str, "$.store.book[*].title", "query")
78+
79+
# 2. 打印结果
80+
print("所有书籍标题:")
81+
for title in result:
82+
print(f"- {title}")
83+
84+
# 预期输出:
85+
# 所有书籍标题:
86+
# - Sayings of the Century
87+
# - The Lord of the Rings
88+
# - Moby Dick
89+
```
90+
91+
#### 示例 2:更新操作
92+
**场景**:更新用户配置文件中特定字段的值。
93+
94+
```python
95+
from jsonpath_util import execute_jsonpath_operation
96+
97+
# 用户配置 JSON
98+
user_config = '{"username": "zhangsan", "settings": {"theme": "light", "notifications": true, "language": "zh-CN"}}'
99+
100+
# 将主题从 “light” 更新为 “dark”
101+
updated_config = execute_jsonpath_operation(
102+
json_content=user_config,
103+
path_expression="$.settings.theme", # 定位到 theme 字段
104+
operation_type="update",
105+
new_value="dark" # 新的值
106+
)
107+
108+
print("更新后的配置:")
109+
print(json.dumps(updated_config, indent=2, ensure_ascii=False)) # 美化输出
110+
111+
# 预期输出(格式化后):
112+
# {
113+
# “username”: “zhangsan”,
114+
# “settings”: {
115+
# “theme”: “dark”,
116+
# “notifications”: true,
117+
# “language”: “zh-CN”
118+
# }
119+
# }
120+
```
121+
122+
#### 示例 3:删除操作
123+
**场景**:从数据记录中移除敏感信息(如身份证号)。
124+
125+
```python
126+
from jsonpath_util import execute_jsonpath_operation
127+
128+
# 包含敏感信息的记录
129+
data_record = ‘{“id”: 101, “name”: “李四”, “id_card”: “110101199001011234”, “department”: “技术部”}’
130+
131+
# 删除 id_card 字段
132+
cleaned_record = execute_jsonpath_operation(
133+
json_content=data_record,
134+
path_expression="$.id_card", # 定位到要删除的字段
135+
operation_type="delete"
136+
)
137+
138+
print(“脱敏后的记录:”)
139+
print(json.dumps(cleaned_record, indent=2ensure_ascii=False))
140+
141+
# 预期输出:
142+
# {
143+
# “id”: 101,
144+
# “name”: “李四”,
145+
# “department”: “技术部”
146+
# }
147+
```

tools/tool_json_handler/data.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: JSON 处理
2+
tags:
3+
- 消息推送
4+
title: JSON 处理
5+
description: 利用 jsonpath_ng 处理 JSON 内容的工具

tools/tool_json_handler/logo.png

33.9 KB
Loading
15 KB
Binary file not shown.

tools/tool_webhook/README.md

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# Webhook 请求工具
2+
3+
一个安全、可靠且功能完善的 Python HTTP 客户端模块,专为发送 Webhook 请求而设计。它提供了简单的 API、内置的安全防护(如 SSRF 防御)以及完善的错误处理机制,适用于生产环境。
4+
5+
## 一、项目介绍
6+
7+
### 1.1 核心功能
8+
- **安全可靠**:内置 SSRF(服务端请求伪造)防护,禁止访问私有 IP 和危险端口,默认强制使用 HTTPS。
9+
- **功能全面**:支持常见的 HTTP 方法(GET, POST, PUT, DELETE, PATCH),可自定义请求头、查询参数和多种格式的请求体(JSON/字符串)。
10+
- **容错性强**:具备连接超时控制、自动重试(针对特定方法和状态码)以及统一的异常捕获机制。
11+
- **易于集成**:返回标准化的结果字典,包含状态码、内容、响应头、耗时及明确的错误信息,无需处理底层异常。
12+
13+
### 1.2 适用场景
14+
- 向第三方服务发送 Webhook 通知(如支付回调、状态更新)。
15+
- 作为微服务间轻量级的 HTTP 通信客户端。
16+
- 需要高安全性和稳定性的外部 API 调用。
17+
- 快速构建需要 HTTP 请求功能的脚本或工具。
18+
19+
## 二、环境准备
20+
21+
### 2.1 依赖库
22+
- **Python**: 3.7+
23+
- **requests**: >= 2.25.0
24+
25+
### 2.2 安装依赖
26+
```bash
27+
pip install requests
28+
```
29+
30+
## 三、快速开始
31+
32+
### 3.1 基础使用示例
33+
以下示例展示了如何发送一个简单的 POST 请求到 Webhook 端点。
34+
35+
```python
36+
# 导入函数
37+
from your_module import send_webhook_request
38+
39+
# 定义目标 URL 和请求数据
40+
webhook_url = "https://api.example.com/webhook"
41+
payload = {"event": "user_created", "user_id": 12345}
42+
43+
# 发送请求
44+
result = send_webhook_request(
45+
url=webhook_url,
46+
method="POST",
47+
body=payload,
48+
headers={"Content-Type": "application/json", "X-Signature": "your_signature"}
49+
)
50+
51+
# 检查请求结果
52+
if result["success"]:
53+
print(f"✅ 请求成功!状态码: {result['status_code']}")
54+
print(f"响应内容: {result['content']}")
55+
print(f"耗时: {result['elapsed']}")
56+
else:
57+
print(f"❌ 请求失败!")
58+
print(f"错误信息: {result['error']}")
59+
print(f"HTTP状态码: {result['status_code']}")
60+
61+
# 预期输出(成功时):
62+
# ✅ 请求成功!状态码: 200
63+
# 响应内容: {'status': 'ok', 'received': True}
64+
# 耗时: 0.356 秒
65+
```
66+
67+
## 四、使用说明
68+
69+
### 4.1 函数定义
70+
```python
71+
def send_webhook_request(
72+
url: str,
73+
method: str = "POST",
74+
headers: Optional[dict[str, str]] = None,
75+
body: Optional[dict[str, Any] | list[Any] | str] = None,
76+
params: Optional[dict[str, str]] = None,
77+
timeout: int = 30,
78+
max_retries: int = 3,
79+
verify_ssl: bool = True,
80+
auth: Optional[tuple[str, str]] = None,
81+
allow_http: bool = False,
82+
) -> dict[str, Any]:
83+
```
84+
85+
### 4.2 参数说明
86+
87+
| 参数名 | 类型 | 必需 | 默认值 | 描述 | 有效值/范围 | 示例 |
88+
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
89+
| `url` | `str` ||| 目标 URL 地址。 | 有效的 HTTP/HTTPS URL 字符串。 | `"https://api.example.com/event"` |
90+
| `method` | `str` || `"POST"` | HTTP 请求方法。 | `"GET"`, `"POST"`, `"PUT"`, `"DELETE"`, `"PATCH"` | `"GET"` |
91+
| `headers` | `dict` || `None` | 自定义 HTTP 请求头。键和值会自动转换为字符串。 | 任意字典,如 `{"Key": "Value"}`| `{"Content-Type": "application/json"}` |
92+
| `body` | `dict`, `list`, `str` || `None` | HTTP 请求体。<br>1. **`dict/list`**: 自动序列化为 JSON。<br>2. **`str`**: 作为原始字符串发送。 | 字典、列表或字符串。 | `{"data": "test"}` |
93+
| `params` | `dict` || `None` | URL 查询参数字典。会自动附加到 URL 后。键和值会自动转换为字符串。 | 任意字典。 | `{"page": "1", "limit": "10"}` |
94+
| `timeout` | `int` || `30` | 请求超时时间(秒)。 | `1``300` 之间的整数。 | `10` |
95+
| `max_retries` | `int` || `3` | 最大重试次数。仅对幂等方法(GET, PUT, DELETE等)和特定错误状态码有效。 | `0``5` 之间的整数。 | `2` |
96+
| `verify_ssl` | `bool` || `True` | 是否验证服务器的 SSL 证书。**生产环境建议保持 `True`**| `True``False` | `False` (仅用于测试) |
97+
| `auth` | `tuple` || `None` | HTTP 基础认证凭据,格式为 `(username, password)`| 包含两个字符串的元组。 | `("admin", "secret")` |
98+
| `allow_http` | `bool` || `False` | 是否允许使用不安全的 HTTP 协议。**出于安全考虑,默认为 `False`**| `True``False` | `True` |
99+
100+
#### 参数关系与注意事项:
101+
1. **`body``headers['Content-Type']`**
102+
-`body``dict``list` 时,如果没有指定 `Content-Type` 头,函数会自动添加 `Content-Type: application/json`
103+
-`body``str` 时,请务必手动设置正确的 `Content-Type`(如 `text/plain`)。
104+
105+
2. **`allow_http``url` 协议**
106+
-`allow_http=False`(默认)时,如果 `url``http://` 开头,函数将返回错误。
107+
- 仅在测试或可信的内部网络环境中,才应设置 `allow_http=True`
108+
109+
3. **`max_retries` 的重试策略**
110+
- 仅对 `method``"GET"`, `"PUT"`, `"DELETE"` 等幂等方法生效。
111+
- 仅对 HTTP 状态码为 `429`, `500`, `502`, `503`, `504` 的响应进行重试。
112+
- `POST` 方法默认**不会**自动重试,以避免重复提交。
113+
114+
### 4.3 返回值说明
115+
函数总是返回一个字典,结构如下:
116+
```python
117+
{
118+
"status_code": Optional[int], # HTTP响应状态码,失败时为None
119+
"content": Optional[Union[str, dict]], # 响应内容。如果是JSON,已解析为字典。
120+
"response_headers": Optional[dict], # 响应头字典
121+
"elapsed": float, # 请求总耗时(秒),保留3位小数
122+
"error": Optional[str], # 错误信息。成功时为None。
123+
"success": bool # 请求是否成功(HTTP状态码为2xx)
124+
}
125+
```
126+
127+
**判断请求结果的正确方式:**
128+
```python
129+
result = send_webhook_request(...)
130+
if result["success"]:
131+
# 处理成功响应
132+
data = result["content"]
133+
else:
134+
# 处理失败,`error`字段会告诉你原因
135+
log_error(result["error"], result["status_code"])
136+
```

tools/tool_webhook/data.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: Webhook 触发数据推送
2+
tags:
3+
- 消息推送
4+
title: Webhook 触发数据推送
5+
description: 调用指定的外部系统 Webhook 接口,向目标 URL 发送 HTTP 请求,用于触发外部系统的数据推送、事件通知或业务流程。

tools/tool_webhook/logo.png

25.4 KB
Loading

0 commit comments

Comments
 (0)