基于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使用,可以把接收来的短信自动发送到地址上查看