ewhooks 是一个轻便的 WebHook 转接器系统,支持动态路由、变量替换和数据映射。
- 🚀 动态路由: 通过 URL 路径动态选择配置文件
- 🔄 灵活转发: 支持 HTTP GET 和 HTTP POST 方法
- 📝 变量替换: 从请求体、请求头、查询参数和环境变量中提取数据
- 🔐 安全防护: 禁止直接访问配置文件
- ⚡ 数据映射: 灵活的请求体转换和重组
yarn installcp .env.example .env编辑 .env 文件设置端口和其他环境变量:
PORT=3000
TOKEN=your_secret_tokenyarn start
# 或
yarn dev服务将在 http://localhost:3000 启动。
在 adapter/ 目录下创建 JSON 配置文件,例如 adapter/mywebhook.json:
{
"to": "https://target.com/webhook",
"method": "POST",
"headers": {
"Authorization": "Bearer {{env.TOKEN}}"
},
"body": {
"message": "{{body.text}}",
"user": "{{body.user.name}}"
}
}curl -X POST http://localhost:3000/adapter/mywebhook \
-H "Content-Type: application/json" \
-d '{"text": "Hello", "user": {"name": "Alice"}}'请求将被转发到配置的目标 URL,数据会根据配置进行转换。
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
to |
string | ✅ | 转发目标 URL |
method |
string | ❌ | HTTP 方法,默认使用原始请求方法 |
headers |
object | ❌ | 额外的请求头,支持变量替换 |
body |
object | ❌ | 数据映射,不设置则转发原始数据 |
使用 {{source.path}} 语法从不同来源提取数据:
{
"body": {
"message": "{{body.text}}",
"nested": "{{body.user.profile.email}}"
}
}请求:
{"text": "Hello", "user": {"profile": {"email": "user@example.com"}}}转发:
{"message": "Hello", "nested": "user@example.com"}{
"headers": {
"X-Forwarded-Auth": "{{headers.Authorization}}"
}
}{
"body": {
"token": "{{query.token}}"
}
}请求: POST /adapter/mywebhook?token=abc123
{
"headers": {
"Authorization": "Bearer {{env.TOKEN}}"
}
}adapter/simple.json:
{
"to": "https://webhook.site/xxx"
}原始请求数据会直接转发,不做任何修改。
adapter/transform.json:
{
"to": "https://api.example.com/notify",
"method": "POST",
"headers": {
"Authorization": "Bearer {{env.API_KEY}}",
"X-Source": "{{headers.User-Agent}}"
},
"body": {
"notification": {
"title": "{{body.title}}",
"message": "{{body.content}}",
"user": "{{body.user.name}}"
},
"metadata": {
"timestamp": "{{body.timestamp}}",
"source": "webhook-adapter"
}
}
}adapter/combined.json:
{
"to": "https://api.example.com/events",
"body": {
"event": "{{body.event_type}}",
"user": "{{body.user}}",
"api_key": "{{env.API_KEY}}",
"source_ip": "{{headers.X-Forwarded-For}}",
"ref": "{{query.ref}}"
}
}POST /adapter/:name
:name: 配置文件名(不含.json后缀)- 支持所有 HTTP 方法
响应:
200-299: 转发成功,返回目标服务器响应404: 配置文件不存在500: 配置文件格式错误502: 转发失败
GET /health
响应:
{
"status": "ok",
"timestamp": "2024-01-01T00:00:00.000Z"
}⚠️ 配置文件 (adapter/*.json) 不能通过 HTTP 直接访问- 🔒 敏感信息(Token、API Key)应存储在环境变量中
- 📝 所有请求和转发操作都会记录日志
查看控制台日志,每个请求都会记录:
[2024-01-01T00:00:00.000Z] 收到请求: POST /adapter/example
[2024-01-01T00:00:00.001Z] 转发成功: example -> 状态码 200
如果变量路径不存在,会使用空字符串替换,不会报错。
支持 HTTP GET, HTTP POST 标准
MIT