---
title: ima2api
emoji: 🚀
colorFrom: blue
colorTo: indigo
sdk: docker
sdk_version: "1.0.0"
app_port: 7860
pinned: false
---
# ima2api
逆向 IMA App 的 AI API,封装为 **OpenAI Chat Completions** 和 **Anthropic Messages** 兼容格式,支持 **tool calling**(prompt 注入方式)。
一次抓包即可,之后都会自动刷新cookie。
## 快速开始
```bash
cd ima2api
npm install
python3 ima_runner.py
```
## 配置
编辑 `config.json`:
```json5
{
"server": { "port": 8080, "host": "0.0.0.0" },
"auth": {
// 从 IMA App 抓包获取的完整 Cookie
"cookie": "IMA-GUID=...;IMA-TOKEN=...;...",
"refresh_token": "抓包https://ima.qq.com/auth_login/refresh请求获取",
"registration_id": "抓包https://ima.qq.com/auth_login/refresh请求获取"
},
"api_keys": ["sk-ima-demo-key-change-me"],
"default_model": "glm-5.2"
}
```
### 获取 Cookie
1. 手机安装 IMA App,QQ/微信登录
2. 配置 HTTPS 代理(mitmproxy / Charles / Fiddler)
3. 发送任意消息,复制请求中的 `x-ima-cookie` 值
4. 填入 `config.json` → `auth.cookie`
5. 将 https://ima.qq.com/auth_login/refresh 这条请求里的refresh_token和registration_id也填入config.json (用于自动刷新cookie)
## API 端点
### OpenAI 兼容 (`/v1`)
```bash
# 模型列表
curl http://localhost:8080/v1/models -H "Authorization: Bearer YOUR_KEY"
# 普通对话
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"glm-5.2","messages":[{"role":"user","content":"你好"}]}'
# 流式
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-d '{"model":"glm-5.2","messages":[{"role":"user","content":"你好"}],"stream":true}'
# Tool calling
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-d '{
"model":"glm-5.2",
"messages":[{"role":"user","content":"执行 uname -a"}],
"tools":[{
"type":"function",
"function":{"name":"Bash","description":"执行命令","parameters":{"type":"object","properties":{"command":{"type":"string"}},"required":["command"]}}
}],
"tool_choice":"auto"
}'
# Tool 结果回传 (多轮)
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-d '{
"model":"glm-5.2",
"messages":[
{"role":"user","content":"执行 uname -a"},
{"role":"assistant","tool_calls":[{"id":"call_1","type":"function","function":{"name":"Bash","arguments":"{\"command\":\"uname -a\"}"}}]},
{"role":"tool","tool_call_id":"call_1","content":"Linux ..."}
]
}'
```
### Anthropic 兼容 (`/v1`)
```bash
# 流式对话
curl http://localhost:8080/v1/messages \
-H "Authorization: Bearer YOUR_KEY" \
-d '{"model":"glm-5.2","max_tokens":1024,"messages":[{"role":"user","content":"你好"}],"stream":true}'
# Tool use
curl http://localhost:8080/v1/messages \
-H "Authorization: Bearer YOUR_KEY" \
-d '{
"model":"glm-5.2",
"max_tokens":1024,
"messages":[{"role":"user","content":"执行 pwd"}],
"tools":[{"name":"Bash","description":"执行命令","input_schema":{"type":"object","properties":{"command":{"type":"string"}},"required":["command"]}}]
}'
```
## Tool Calling 机制
采用 **prompt 注入** 方式实现 function calling:
```
## CRITICAL — YOU MUST USE FUNCTION CALLING
执行 bash 命令
{"type":"object","properties":{"command":{"type":"string"}},"required":["command"]}
## HOW TO CALL A FUNCTION
输出 {"name":"...","arguments":{...}},然后立即停止。
```
工作流:
1. 客户端发送 `tools` 参数 → 服务器将工具定义注入 prompt
2. IMA 模型输出 `…` → 服务器解析为 `tool_calls` / `tool_use` 返回
3. 客户端本地执行工具 → 将结果回传
4. 服务器检测到 `tool_use` + `tool_result` → 用 `⚠️ 系统通知` 格式告知模型结果
5. 模型基于结果直接回答用户
特性:
- 最多展示 8 个工具(截断保护)
- Schema 自动压缩(去掉 `$schema`/`$defs`/`$ref` 等元数据)
- 自动检测中文用户 → 要求中文回复
- 会话自动复用(基于首条消息 hash)
## 可用模型
| 模型 ID | 底座 | 说明 |
|---------|------|------|
| `glm-5.2` | GLM-5.2 | 默认 |
| `glm-5.2-think` | GLM-5.2 | 思考模式 |
| `deepseek-v4-flash` | DeepSeek V4 | 快速 |
| `deepseek-v4-flash-think` | DeepSeek V4 | 思考模式 |
| `hy3-preview` | 混元 Hy3 | 预览 |
| `hy3-preview-think` | 混元 Hy3 | 思考模式 |
## 认证
- `Authorization: Bearer ` 或 `x-api-key: `
- 支持配置多个 API Key
## 客户端集成
### OpenAI SDK (Python)
```python
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="your-key")
response = client.chat.completions.create(
model="glm-5.2",
messages=[{"role": "user", "content": "你好"}],
tools=[{"type":"function","function":{"name":"Bash","description":"执行命令","parameters":{"type":"object","properties":{"command":{"type":"string"}},"required":["command"]}}}],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
```
### Anthropic SDK (Python)
```python
from anthropic import Anthropic
client = Anthropic(base_url="http://localhost:8080/v1", api_key="your-key")
with client.messages.stream(
model="glm-5.2",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}]
) as stream:
for text in stream.text_stream:
print(text, end="")
```
## 局限性
- IMA 模型需要 prompt 注入才能触发 tool calling(非原生支持)
- 流式输出中的 `` 块会被服务器端过滤(客户端不可见)
- IMA 会话限制约 20 轮,超出后需重新建立
## 保姆级部署教程(零基础上手)
本教程不需要编程基础,不需要安装任何软件,全程在手机和网页上完成。总耗时约 15 分钟。
---
### 准备工作:获取 IMA 的 Cookie
这一步是唯一需要花点时间的。你需要从手机上的 IMA App 抓取请求数据。
**你需要:** 一部安装了 IMA App 的手机(已用 QQ/微信登录)+ 一台电脑。
#### 1.1 安装抓包工具
在电脑上安装 **mitmproxy**(免费、开源):
- 打开 [mitmproxy.org](https://mitmproxy.org/),点击下载 Windows 安装包,一路「下一步」安装完成。
#### 1.2 配置手机代理
1. 确保手机和电脑在**同一个 WiFi** 下
2. 电脑上:Win+R → 输入 `cmd` → 回车,输入 `ipconfig`,找到 IPv4 地址(形如 `192.168.x.x`)
3. 手机上:设置 → WiFi → 点击当前连接的 WiFi → 代理 → 手动
- 服务器:填入电脑的 IPv4 地址,端口:`8080`
4. 手机浏览器打开 `mitm.it`,按提示安装 mitmproxy 的 CA 证书
- Android:选「用于 VPN 和应用」
- iOS:还需在 设置→通用→关于→证书信任设置 中开启信任
#### 1.3 抓取 Cookie
1. 电脑上 Win+R → `cmd` → 输入 `mitmweb` 回车(浏览器会自动打开 http://127.0.0.1:8081)
2. 手机上打开 IMA App,随便发一条消息(比如「你好」)
3. 回到电脑浏览器,在 mitmweb 界面找 `ima.qq.com` 开头的请求
4. 点开任意一条,在 Request Headers 中找到 **`x-ima-cookie`**,完整复制它的值
> 这个值很长,类似 `IMA-GUID=xxx;APP-VERSION=xxx;IMA-Q36=xxx;...;IMA-TOKEN=xxx;...`
#### 1.4 获取 refresh_token 和 registration_id
1. 在 mitmweb 页面的搜索框输入 `/auth_login/refresh`
2. 点开这个请求 → 点击 Request 标签 → 在内容区找:
- `refresh_token`:一串很长的字符串
- `registration_id`:另一串字符串
3. 分别复制保存
**把这三个值记在手边备用:** x-ima-cookie、refresh_token、registration_id。
> 抓完后记得**把手机代理关掉**(WiFi 设置里改回「无」),否则断开电脑后手机没法上网。
---
### 第一步:注册 Hugging Face
1. 打开 [huggingface.co/join](https://huggingface.co/join)
2. 输入邮箱和密码 → Next → 完成人机验证
3. 去邮箱点击确认链接激活账号
---
### 第二步:创建 Space
1. 打开 [huggingface.co/new-space](https://huggingface.co/new-space)
2. 填写:
- **Space name**:随便取,比如 `my-ima-api`(只能用英文字母、数字、短横线)
- **License**:选 `mit`
- **Space SDK**:选 **Docker**
- **Space Template**:选 **Blank**
- **Space Visibility**:选 **Private**(关键!不选这个别人能看见你的 API 地址)
3. 点 **Create Space** 按钮
---
### 第三步:上传文件
你现在在 Space 页面了。用网页拖拽上传,不需要装 Git。
1. 点击顶部 **Files** 标签页
2. 点击 **Add file** → **Upload files**
3. 把以下 4 个文件拖进去:`server.js`、`config.json`、`package.json`、`Dockerfile`
4. 往下滚,Commit message 随便填,点 **Commit to main**
> 不用上传 `ima_runner.py`,HF 上不需要它。
---
### 第四步:设置 Secrets(密码)
1. 在 Space 页面顶部点 **Settings** 标签页
2. 往下滚找到 **Repository Secrets**
3. 点 **New secret**,逐个添加:
| Name | Value |
|------|-------|
| `IMA_COOKIE` | 粘贴完整 x-ima-cookie |
| `IMA_REFRESH_TOKEN` | 粘贴 refresh_token |
| `IMA_REGISTRATION_ID` | 粘贴 registration_id |
| `IMA_API_KEYS` | 自己编一个密码,如 `sk-my-secret-key-2024` |
> `IMA_API_KEYS` 是你调用 API 用的「密码」。多个 key 用逗号分隔:`sk-key1,sk-key2`。
---
### 第五步:等待启动
1. 回到顶部点 **App** 标签页
2. 看到 "Building..." 等待 1-2 分钟,变成绿色 "Running" 即成功
3. 如果卡住,点右上角 → **Factory reboot**
---
### 第六步:测试
浏览器打开 `https://你的用户名-你的空间名.hf.space/`,看到 JSON 数据含 `"service": "ima2api"` 就说明成功。
---
### 第七步:接入 Claude Code / Codex
**Claude Code(终端):**
```bash
set ANTHROPIC_BASE_URL=https://你的用户名-你的空间名.hf.space/v1
set ANTHROPIC_API_KEY=sk-my-secret-key-2024
claude
```
**Codex(桌面版设置页):**
- Provider: Anthropic 或 OpenAI Compatible
- Base URL: `https://你的用户名-你的空间名.hf.space/v1`
- API Key: `sk-my-secret-key-2024`
- Model: `glm-5.2`
**Cherry Studio / ChatGPT-Next-Web:** 创建自定义 Provider,填入相同的 Base URL 和 API Key。
---
### 常见问题
**Q: 显示 "Running" 但访问报错?**
等 30 秒再试,启动后首次 token 刷新需要十几秒。
**Q: API 返回 401 Unauthorized?**
检查 Secrets 里的 `IMA_API_KEYS` 和请求里用的 key 是否完全一致。
**Q: 回复是乱码或空内容?**
Cookie 可能过期了,重新抓一次 IMA Cookie,更新 Secret 后点 Factory reboot。
**Q: Token 会自动刷新吗?**
会。server.js 内置定时刷新,无需额外操作。
**Q: 免费层够用吗?**
完全够。16GB 内存 + 2 CPU,个人使用远达不到限制。长时间不活动会休眠,下次访问自动唤醒(等几秒就好)。
---
### 本地开发仍可用
```bash
# 方式1:Python watchdog(token 刷新会重启 npm)
python ima_runner.py
# 方式2:纯 Node(HF 同款,token 热更新不重启)
npm start
```