Skip to main content
Glama
ant-cave

QQ空间 MCP Server

by ant-cave
README.md
# QQZone MCP Server

把 QQ 空间数据接口封装为 MCP 工具,支持 **扫码登录**、**Web 控制台**、**SSE 远程接入**。基于开源 [QzoneExporter](https://github.com/WuqianShaw/QzoneExporter) 验证过的接口参数重写,仅依赖 `mcp` + `requests`(Web 模式额外需要 `fastapi` + `uvicorn`)。

## 功能特性

- **8 个查询工具**:说说(分页/搜索)、资料卡、相册、留言板、空间统计
- **扫码登录**:WebUI 一键拉起 QQ 官方二维码,手机 QQ 扫码后 Cookie 自动写入,全程无需手动复制
- **Cookie Editor 支持**:续 Cookie 时可直接粘贴 Cookie Editor 扩展导出的 JSON
- **Web 控制台**:登录态查看、Cookie 续期、工具在线调用测试
- **安全设计**:Bearer Token 鉴权(恒定时间比较)、IP 防爆破(5 次错封 15 分钟)、仅监听 127.0.0.1、凭证文件权限 600

## 工具列表

| 工具 | 功能 |
|---|---|
| `whoami` | 检查 Cookie 登录态 |
| `set_cookie` | 更新 Cookie(过期后无需重启) |
| `profile` | 资料卡(昵称/签名/生日/所在地等) |
| `space_stats` | 日志/说说/相册数量 |
| `shuoshuo` | 分页读说说(可带评论) |
| `shuoshuo_search` | 按关键词搜索说说 |
| `albums` | 相册列表元数据 |
| `msgboard` | 留言板 |

## 快速开始

### 方式一:Web 控制台(推荐)

```bash
# 1. 安装
pip install "mcp>=1.2,<2" requests fastapi uvicorn
cp qqzone_mcp.py qq_login.py webapp.py ~/.qqzone-mcp/   # 目录自定,默认 ~/qqzone-mcp/

# 2. 启动(监听 127.0.0.1:8787)
python3 webapp.py --port 8787

# 3. 打开控制台
#    http://127.0.0.1:8787/qqzone/console(或按你的反代路径)
#    Token 首次启动自动生成,见 config.json 的 "token" 字段
```

控制台里点「获取二维码」→ 手机 QQ 扫描(摄像头对准屏幕,QQ 不允许识别相册/截图里的登录码)→ 确认登录 → Cookie 自动写入。

> 二维码约 2 分钟过期;QQ 风控禁止「识别图片」方式扫码,只能摄像头实时扫真实屏幕。

### 方式二:命令行安装(stdio 模式)

```bash
bash install.sh "p_uin=o...; skey=...; p_skey=..." 你的QQ号
```

## 接入 MCP 客户端

**stdio(本机):**

```json
{
  "mcpServers": {
    "qqzone": {
      "command": "~/.qqzone-mcp/venv/bin/python",
      "args": ["~/.qqzone-mcp/qqzone_mcp.py"]
    }
  }
}
```

**SSE(远程):** 启动 webapp 后,客户端连 `http://127.0.0.1:8787/sse`,请求头带 `Authorization: Bearer <token>`。

### 公网部署(Cloudflare Tunnel + nginx)

1. 服务只监听 `127.0.0.1`,务必走隧道/反代,不要直接暴露公网
2. nginx 按路径前缀分流(示例):

```nginx
location /qqzone/ {
    proxy_pass http://127.0.0.1:8693/;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
}
```

3. ⚠️ 若挂在子路径下,前端请求均使用相对路径,无需额外配置

### Cookie 过期怎么办

Cookie 无法服务端自动续期(QQ 风控设计如此),两种续法:

1. **扫码**:控制台「获取二维码」→ 摄像头扫屏幕,30 秒
2. **Cookie Editor**:浏览器装 Cookie Editor → 打开 qzone.qq.com → Export as JSON → 粘贴到控制台「续 Cookie」

`skey` 通常 1~3 天失效,`p_skey`(qzone 主要鉴权凭证)约 30~90 天;改密码/异地登录会立即作废。

## 安全须知

- Cookie 等同账号登录凭证:config.json 权限 600,注意服务器安全
- 所有 API 均需 Bearer Token,Token 在 config.json,泄露后删除该字段重启即重新生成
- 不要把 Token 硬编码进任何公开仓库/前端

## 文件说明

| 文件 | 说明 |
|---|---|
| `qqzone_mcp.py` | MCP Server 主体(stdio + `--http` 模式) |
| `qq_login.py` | QQ 扫码登录协议链(xlogin → ptqrshow → ptqrlogin → check_sig) |
| `webapp.py` | Web 控制台 + SSE(FastAPI) |
| `install.sh` | stdio 模式一键安装脚本 |

## 致谢

接口参数与分页逻辑参考自 [WuqianShaw/QzoneExporter](https://github.com/WuqianShaw/QzoneExporter)(GPL-3.0),本项目以 AGPL-3.0 发布,仅供个人学习研究。