基于node.js搭建,后端用任意语言都行
服务器:
安装依赖:
npm init -y npm install express body-parser dotenv
后端代码:
server.js
const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs').promises;
const path = require('path');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 3000;
// 日志存储配置
const LOG_DIR = 'logs';
const LOG_FILE = path.join(LOG_DIR, 'webhook_logs.json');
// 初始化日志目录
async function initLogDir() {
try {
await fs.access(LOG_DIR);
} catch {
await fs.mkdir(LOG_DIR);
await fs.writeFile(LOG_FILE, '[]');
}
}
// 保存日志
async function saveLog(data) {
try {
const logs = await readLogs();
logs.unshift({
id: Date.now(),
timestamp: new Date().toISOString(),
...data
});
await fs.writeFile(LOG_FILE, JSON.stringify(logs.slice(0, 100), null, 2));
} catch (error) {
console.error('保存日志失败:', error);
}
}
// 读取日志
async function readLogs() {
try {
const data = await fs.readFile(LOG_FILE, 'utf8');
return JSON.parse(data);
} catch {
return [];
}
}
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// 记录所有请求
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next();
});
// Webhook接收端点
app.post('/webhook', async (req, res) => {
try {
const webhookData = {
headers: req.headers,
body: req.body,
query: req.query,
receivedAt: new Date().toISOString()
};
// 保存接收到的数据
await saveLog(webhookData);
console.log('收到Webhook请求:', {
time: webhookData.receivedAt,
body: webhookData.body
});
res.status(200).json({
status: 'success',
message: 'Webhook received successfully'
});
} catch (error) {
console.error('处理Webhook失败:', error);
res.status(500).json({
status: 'error',
message: error.message
});
}
});
// 查看日志的API端点
app.get('/logs', async (req, res) => {
try {
const page = parseInt(req.query.page) || 1;
const limit = parseInt(req.query.limit) || 10;
const logs = await readLogs();
const startIndex = (page - 1) * limit;
const endIndex = page * limit;
res.json({
data: logs.slice(startIndex, endIndex),
total: logs.length,
page,
limit
});
} catch (error) {
res.status(500).json({
status: 'error',
message: error.message
});
}
});
// 查看单条日志详情
app.get('/logs/:id', async (req, res) => {
try {
const logs = await readLogs();
const log = logs.find(l => l.id === parseInt(req.params.id));
if (!log) {
return res.status(404).json({
status: 'error',
message: 'Log not found'
});
}
res.json(log);
} catch (error) {
res.status(500).json({
status: 'error',
message: error.message
});
}
});
// 健康检查端点
app.get('/health', (req, res) => {
res.status(200).json({
status: 'healthy',
time: new Date().toISOString()
});
});
// 启动服务器
async function startServer() {
await initLogDir();
app.listen(port, () => {
console.log(`Webhook服务器已启动: http://localhost:${port}`);
});
}
startServer();
使用curl发送测试请求:
curl -X POST http://localhost:3000/webhook \
-H "Content-Type: application/json" \
-d '{"message": "测试消息", "type": "test"}'
客户端:
查看发来的数据
curl "http://localhost:3000/logs?page=1&limit=10"
配合手机端app使用,可以把接收来的短信自动发送到地址上查看