K-hermes 9271bf62b2 文档: 重新编写完整的README.md
由Claude Code生成的专业文档,包含:
- 核心特性和技术栈说明
- 快速开始指南(Docker部署)
- 完整的API文档(6个端点)
- 配置说明和安全建议
- 使用示例(Python/Bash/JavaScript)
- 部署指南和故障排查
- FAQ和性能指标

文档基于实际代码分析,内容准确完整。
2026-08-14 10:03:59 +08:00

通用数据同步服务

一个基于 OpenResty/Lua 的轻量级数据同步服务,用于安全存储和管理 Cookie、Token、Credential 等敏感数据,支持自动过期检测和 Web 管理界面。

核心特性

  • 轻量高效:基于 OpenResty,单容器运行,内存占用 < 50MB
  • 安全可靠:密码保护 + CORS 支持 + Web 界面身份验证
  • 类型丰富:支持 cookie/token/credential/session/custom 等多种数据类型
  • 过期管理:自动过期检测 + 状态监控 + 通知提醒
  • 易于集成:提供浏览器油猴脚本、Python SDK、REST API
  • Web 管理:完整的 Web 管理界面,支持查看、复制、删除数据
  • 零依赖部署Docker Compose 一键启动,无需安装 Python/Flask

技术栈

  • Web 服务器OpenResty (Nginx + Lua)
  • 数据存储:文件系统 JSON 格式
  • 容器化Docker + Docker Compose
  • 前端界面:纯 HTML/CSS/JavaScript
  • 客户端Python 3.7+、Tampermonkey 油猴脚本
  • API 协议RESTful HTTP + JSON

快速开始

1. 使用 Docker 部署(推荐)

# 克隆或进入项目目录
cd /home/hermes/projects/data-sync-service

# 创建数据目录
mkdir -p data
chmod 777 data

# 启动服务
docker-compose up -d

# 验证服务
curl http://localhost:5001/health
# 预期输出: {"status":"ok"}

服务将在 http://localhost:5001 启动。

2. 访问 Web 管理界面

  1. 浏览器访问:http://localhost:5001/login
  2. 输入密码:admin123123123(生产环境请修改)
  3. 进入管理面板,查看所有同步的数据

3. 安装浏览器油猴脚本

  1. 安装 Tampermonkey 扩展
  2. 打开 client/userscript-template.js
  3. 复制内容并创建新脚本
  4. 修改配置中的 serverUrlpassword
  5. 保存并启用脚本

4. 一键同步数据

在支持的网站(通义听悟、微信公众号等):

  1. 登录你的账号
  2. 点击页面右侧悬浮的 🔄 同步数据 按钮
  3. 选择 立即同步
  4. 看到 成功提示

API 文档

健康检查

检查服务运行状态。

GET /health

响应示例

{
  "status": "ok"
}

上传/更新数据

上传或更新指定标签的数据。

POST /api/data
Content-Type: application/json

请求体

{
  "password": "admin123123123",
  "tag": "tingwu:user@example.com",
  "type": "cookie",
  "data": {
    "cookies": [
      {
        "name": "session_id",
        "value": "abc123xyz",
        "domain": ".example.com",
        "path": "/",
        "secure": true,
        "httpOnly": false
      }
    ],
    "raw_cookie": "session_id=abc123xyz; token=...",
    "user_agent": "Mozilla/5.0 ..."
  },
  "metadata": {
    "expires_in": 604800,
    "note": "通义听悟账号",
    "login_url": "https://tingwu.aliyun.com/"
  }
}

字段说明

  • password:服务密码(必填)
  • tag:数据标签,格式:项目名:账号名(必填)
  • type:数据类型,可选值:cookie/token/credential/session/custom(必填)
  • data:实际数据内容(必填,格式根据类型自定义)
  • metadata.expires_in:过期时间(秒),如 604800 = 7天
  • metadata.note:备注说明
  • metadata.login_url:登录页面 URL

响应示例

{
  "success": true,
  "message": "Data saved",
  "tag": "tingwu:user@example.com",
  "timestamp": "2026-08-14 12:00:00"
}

获取数据

通过标签获取存储的数据。

GET /api/data/:tag
X-Password: admin123123123

响应示例

{
  "tag": "tingwu:user@example.com",
  "type": "cookie",
  "data": {
    "cookies": [...],
    "raw_cookie": "...",
    "user_agent": "..."
  },
  "metadata": {
    "created_at": "2026-08-14 10:00:00",
    "updated_at": "2026-08-14 12:00:00",
    "expires_at": "2026-08-21 12:00:00",
    "expires_in": 604800,
    "note": "通义听悟账号",
    "login_url": "https://tingwu.aliyun.com/"
  }
}

列出所有数据

获取所有存储数据的索引列表。

GET /api/data

响应示例

{
  "tags": {
    "tingwu:user@example.com": {
      "tag": "tingwu:user@example.com",
      "type": "cookie",
      "file": "tingwu_user_example_com.json",
      "created_at": "2026-08-14 10:00:00",
      "updated_at": "2026-08-14 12:00:00",
      "expires_at": "2026-08-21 12:00:00",
      "status": "valid"
    },
    "wechat:admin": {
      "tag": "wechat:admin",
      "type": "cookie",
      "file": "wechat_admin.json",
      "created_at": "2026-08-13 15:30:00",
      "updated_at": "2026-08-14 08:00:00",
      "expires_at": "2026-08-15 08:00:00",
      "status": "expiring_soon"
    }
  }
}

状态说明

  • valid:正常有效(距离过期 > 2天)
  • expiring_soon:即将过期(距离过期 < 2天)
  • expired:已过期
  • no_expiry:无过期时间

删除数据

删除指定标签的数据。

DELETE /api/data/:tag
X-Password: admin123123123

响应示例

{
  "success": true,
  "message": "Data deleted",
  "tag": "tingwu:user@example.com"
}

获取复制配置

获取用于油猴脚本配置的格式化文本。

GET /api/data/copy/:tag

响应示例

{
  "copy_text": "{\"serverUrl\":\"http://47.122.126.244:5001\",\"password\":\"admin123123123\",\"tag\":\"tingwu:user@example.com\",\"type\":\"cookie\"}",
  "formatted": "```json\n{...}\n```"
}

配置说明

修改服务密码

编辑 nginx/nginx.conf,全局替换默认密码:

cd /home/hermes/projects/data-sync-service
sed -i 's/admin123123123/YOUR_SECURE_PASSWORD/g' nginx/nginx.conf
docker-compose restart

同时需要更新:

  • Python 客户端:修改 scripts/utils.py 中的 PASSWORD
  • 油猴脚本:修改 CONFIG.password
  • Web 管理界面登录密码

修改服务端口

编辑 docker-compose.yml

services:
  nginx:
    ports:
      - "8080:80"  # 修改为你需要的端口

重启服务:

docker-compose up -d

添加新的项目支持

编辑 client/userscript-template.js,在 PROJECT_PATTERNS 中添加:

const PROJECT_PATTERNS = {
    // 现有配置...
    
    'example.com': {
        project: 'example',
        accountSelector: '.user-email, .account-name',
        loginUrl: 'https://example.com/login'
    }
};

同时在 @match 指令中添加匹配规则:

// @match        https://example.com/*

使用示例

Python 客户端示例

import sys
sys.path.append('/home/hermes/projects/data-sync-service/scripts')

from utils import upload_data, get_data, list_all_tags, load_cookies_from_sync

# 1. 上传 Cookie 数据
success = upload_data(
    tag="myapp:user@example.com",
    data_type="cookie",
    data={
        "cookies": [...],
        "raw_cookie": "session=abc123; token=xyz789"
    },
    expires_in=604800,  # 7天
    note="我的应用账号",
    login_url="https://myapp.com/login"
)

# 2. 获取数据
data = get_data("myapp:user@example.com")
if data:
    print(f"类型: {data['type']}")
    print(f"创建时间: {data['metadata']['created_at']}")
    print(f"过期时间: {data['metadata']['expires_at']}")

# 3. 便捷方式加载 Cookie
cookies = load_cookies_from_sync("tingwu:user@example.com")
if cookies:
    # 转换为 requests 可用格式
    cookie_dict = {c['name']: c['value'] for c in cookies}
    
    import requests
    response = requests.get(
        "https://tingwu.aliyun.com/api/endpoint",
        cookies=cookie_dict
    )

# 4. 列出所有数据
tags = list_all_tags()
for item in tags.values():
    print(f"{item['tag']} - {item['status']}")

Bash/cURL 示例

# 上传数据
curl -X POST http://localhost:5001/api/data \
  -H "Content-Type: application/json" \
  -d '{
    "password": "admin123123123",
    "tag": "test:demo",
    "type": "token",
    "data": {
      "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_type": "Bearer"
    },
    "metadata": {
      "expires_in": 3600,
      "note": "测试 Token"
    }
  }'

# 获取数据
curl http://localhost:5001/api/data/test:demo \
  -H "X-Password: admin123123123"

# 列出所有数据
curl http://localhost:5001/api/data

# 删除数据
curl -X DELETE http://localhost:5001/api/data/test:demo \
  -H "X-Password: admin123123123"

JavaScript/Fetch 示例

// 上传数据
async function uploadData(tag, type, data) {
    const response = await fetch('http://localhost:5001/api/data', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            password: 'admin123123123',
            tag: tag,
            type: type,
            data: data,
            metadata: {
                expires_in: 604800,
                note: '通过 JS 上传'
            }
        })
    });
    
    return await response.json();
}

// 获取数据
async function getData(tag) {
    const response = await fetch(`http://localhost:5001/api/data/${tag}`, {
        headers: {
            'X-Password': 'admin123123123'
        }
    });
    
    return await response.json();
}

// 使用示例
const result = await uploadData('myapp:user', 'cookie', {
    cookies: document.cookie.split(';').map(c => {
        const [name, value] = c.trim().split('=');
        return { name, value };
    })
});

console.log('上传结果:', result);

定时过期检测

设置定时任务

过期检测脚本会扫描所有数据,标记即将过期(< 2天)和已过期的数据,并输出通知信息。

手动运行

python3 /home/hermes/projects/data-sync-service/scripts/check_expiry.py

使用 cron 定时运行

# 编辑 crontab
crontab -e

# 添加定时任务(每天上午 9 点检查)
0 9 * * * cd /home/hermes/projects/data-sync-service && python3 scripts/check_expiry.py

检测输出示例

❌ 数据已过期

Tag: wechat:admin
类型: cookie
过期时间: 2026-08-13 08:00:00

请重新登录同步:
https://mp.weixin.qq.com/

配置信息(点击复制):
```json
{
  "serverUrl": "http://47.122.126.244:5001",
  "password": "admin123123123",
  "tag": "wechat:admin",
  "type": "cookie"
}

⚠️ 数据即将过期

Tag: tingwu:user@example.com 类型: cookie 剩余时间: 1.5 天 过期时间: 2026-08-15 18:00:00

建议重新登录同步: https://tingwu.aliyun.com/

📊 数据状态统计 已过期: 1 个 ⚠️ 即将过期: 1 个 正常: 3 个


---

## 部署指南

### 生产环境部署

1. **修改默认密码**(重要!)
   ```bash
   cd /home/hermes/projects/data-sync-service
   sed -i 's/admin123123123/YOUR_STRONG_PASSWORD/g' nginx/nginx.conf
   docker-compose restart
  1. 配置 HTTPS(推荐)

    使用 Nginx 反向代理:

    # /etc/nginx/sites-available/data-sync
    server {
        listen 443 ssl http2;
        server_name sync.yourdomain.com;
    
        ssl_certificate /etc/ssl/certs/your-cert.pem;
        ssl_certificate_key /etc/ssl/private/your-key.pem;
    
        location / {
            proxy_pass http://127.0.0.1:5001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  2. 配置防火墙

    # Ubuntu/Debian
    sudo ufw allow 5001/tcp
    sudo ufw enable
    
    # 或限制 IP 访问
    sudo ufw allow from 192.168.1.0/24 to any port 5001
    
  3. 数据备份

    # 手动备份
    tar -czf data-backup-$(date +%Y%m%d).tar.gz data/
    
    # 定时备份(添加到 crontab
    0 2 * * * cd /home/hermes/projects/data-sync-service && tar -czf backups/data-$(date +\%Y\%m\%d).tar.gz data/
    

外网访问配置

修改客户端配置中的 serverUrl

  • Python 客户端:scripts/utils.pySERVER_URL
  • 油猴脚本:client/userscript-template.jsCONFIG.serverUrl
# scripts/utils.py
SERVER_URL = "https://sync.yourdomain.com"
// client/userscript-template.js
const CONFIG = {
    serverUrl: 'https://sync.yourdomain.com',
    password: 'YOUR_SECURE_PASSWORD'
};

目录结构

/home/hermes/projects/data-sync-service/
├── docker-compose.yml          # Docker Compose 配置
├── nginx/
│   └── nginx.conf              # OpenResty/Nginx 配置(核心 API 实现)
├── web/
│   ├── index.html              # Web 管理界面
│   └── login.html              # 登录页面
├── data/                       # 数据存储目录(挂载到容器)
│   ├── index.json              # 数据索引文件
│   ├── tingwu_*.json           # 数据文件(tag → 文件名映射)
│   └── *.json                  # 其他数据文件
├── scripts/                    # 工具脚本
│   ├── check_expiry.py         # 过期检测脚本
│   ├── clean_expired.py        # 清理过期数据
│   ├── migrate.py              # 数据迁移工具
│   └── utils.py                # Python SDK 工具库
├── client/
│   └── userscript-template.js  # Tampermonkey 油猴脚本模板
├── clients/
│   └── client-example.py       # Python 客户端使用示例
├── README.md                   # 本文档
├── DEPLOYMENT.md               # 详细部署指南
└── .gitignore                  # Git 忽略配置

故障排查

服务无法启动

# 查看容器日志
docker-compose logs -f

# 检查端口占用
sudo lsof -i:5001
# 或
netstat -tlnp | grep 5001

# 检查数据目录权限
ls -la data/
chmod 777 data/

API 返回 401 Unauthorized

  • 检查请求中的密码是否正确
  • POST 请求:检查 JSON body 中的 password 字段
  • GET/DELETE 请求:检查 HTTP 头 X-Password 是否设置

数据无法保存

# 检查磁盘空间
df -h

# 检查数据目录权限
ls -la data/
chmod 777 data/

# 进入容器检查
docker exec -it data-sync-service sh
ls -la /data

油猴脚本无反应

  1. 打开浏览器开发者工具(F12)查看控制台错误
  2. 确认当前网站 URL 匹配 @match 规则
  3. 检查 CONFIG.serverUrl 是否可访问
  4. 确认服务器防火墙/CORS 配置

Web 界面无法登录

  • 确认密码是否为 nginx/nginx.conf 中配置的密码
  • 检查浏览器 Cookie 是否被禁用
  • 清除浏览器缓存和 Cookie 后重试

性能指标

  • 内存占用~20-50MBOpenResty 容器)
  • 磁盘占用~10KB/数据项(JSON 格式)
  • 响应时间< 10ms(本地文件读写)
  • 并发能力1000+ req/sNginx/Lua
  • 启动时间< 2秒

安全建议

  1. 生产环境必须修改默认密码
  2. 使用 HTTPS 加密传输(通过 Nginx 反向代理)
  3. 限制 IP 访问范围(防火墙 + Nginx allow/deny
  4. 定期备份数据目录
  5. 不要在公网暴露 5001 端口(使用反向代理)
  6. 定期清理过期数据(运行 clean_expired.py
  7. 审计数据访问日志(查看 Docker 日志)

与其他项目集成

在自动化脚本中使用

#!/usr/bin/env python3
import sys
sys.path.append('/home/hermes/projects/data-sync-service/scripts')
from utils import load_cookies_from_sync, load_token_from_sync

# 从同步服务加载 Cookie
cookies = load_cookies_from_sync("tingwu:user@example.com")

if cookies:
    # 使用 Cookie 进行自动化操作
    import requests
    session = requests.Session()
    for cookie in cookies:
        session.cookies.set(cookie['name'], cookie['value'], domain=cookie.get('domain'))
    
    # 发起请求
    response = session.get("https://tingwu.aliyun.com/api/v1/tasks")
    print(response.json())
else:
    print("Cookie 已过期,请重新同步")
    sys.exit(1)

降级方案

当同步服务不可用时,可以降级到本地文件:

def load_cookies_with_fallback(tag):
    """优先从同步服务加载,失败时使用本地文件"""
    from utils import load_cookies_from_sync
    import json
    
    # 尝试从同步服务加载
    cookies = load_cookies_from_sync(tag)
    if cookies:
        return cookies
    
    # 降级到本地文件
    local_path = f"/path/to/local/{tag.replace(':', '_')}.json"
    try:
        with open(local_path, 'r') as f:
            data = json.load(f)
            return data.get('cookies', [])
    except:
        return None

支持的项目

已内置支持

  1. 通义听悟tingwu.aliyun.com

    • 自动检测账号邮箱
    • 同步所有 Cookie
    • 7天过期提醒
  2. 微信公众号mp.weixin.qq.com

    • 自动检测账号昵称
    • 同步登录 Cookie
    • 7天过期提醒

自定义项目

参考 添加新的项目支持 章节。


常见问题(FAQ

Q: 数据存储在哪里?
A: 数据以 JSON 格式存储在 data/ 目录下,每个 tag 对应一个文件。

Q: 支持多少个 tag
A: 无限制,每个 tag 对应一个独立的 JSON 文件。

Q: 可以存储哪些类型的数据?
A: 任何 JSON 可序列化的数据,常见类型包括:cookie、token、credential、session、API key、配置信息等。

Q: 如何备份数据?
A: 直接备份 data/ 目录即可:tar -czf backup.tar.gz data/

Q: 支持集群部署吗?
A: 当前版本基于文件存储,不支持集群。如需集群部署,建议改为使用 Redis 或数据库存储。

Q: 如何迁移到新服务器?
A: 复制整个项目目录,确保 data/ 目录权限为 777,然后 docker-compose up -d

Q: 密码存储安全吗?
A: 密码以明文存储在 nginx.conf 中,建议使用环境变量或外部密钥管理服务。

Q: 支持多用户吗?
A: 当前版本为单用户设计(共享密码),如需多用户支持,需要修改 Nginx 配置添加用户认证系统。


更新日志

v1.0.0 (2026-08-14)

  • 重构为 OpenResty/Lua 架构,移除 Flask 依赖
  • 新增 Web 管理界面(带身份验证)
  • 新增数据状态实时检测(valid/expiring_soon/expired
  • 新增一键复制配置功能
  • 优化 Docker 镜像大小(50MB
  • 改进 CORS 配置
  • 🐛 修复索引结构(改为对象格式)
  • 📝 完善 API 文档和使用示例

许可证

本项目仅供个人学习和内部使用,请勿用于非法用途。使用本服务存储和传输敏感数据时,请确保符合相关法律法规。


贡献

欢迎提交 Issue 和 Pull Request

作者K-hermes
项目地址/home/hermes/projects/data-sync-service


相关文档

S
Description
通用数据同步服务 - 基于OpenResty的RESTful API
Readme
201 KiB
Languages
JavaScript 38.4%
HTML 28.5%
Python 27%
Shell 6.1%