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。
快速开始
cd ima2api
npm install
python3 ima_runner.py
配置
编辑 config.json:
{
"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
- 手机安装 IMA App,QQ/微信登录
- 配置 HTTPS 代理(mitmproxy / Charles / Fiddler)
- 发送任意消息,复制请求中的
x-ima-cookie值 - 填入
config.json→auth.cookie - 将 https://ima.qq.com/auth_login/refresh 这条请求里的refresh_token和registration_id也填入config.json (用于自动刷新cookie)
API 端点
OpenAI 兼容 (/v1)
# 模型列表
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)
# 流式对话
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
<function name="Bash">
<description>执行 bash 命令</description>
<parameters>{"type":"object","properties":{"command":{"type":"string"}},"required":["command"]}</parameters>
</function>
## HOW TO CALL A FUNCTION
输出 <function_call>{"name":"...","arguments":{...}}</function_call>,然后立即停止。
工作流:
- 客户端发送
tools参数 → 服务器将工具定义注入 prompt - IMA 模型输出
<function_call>…</function_call>→ 服务器解析为tool_calls/tool_use返回 - 客户端本地执行工具 → 将结果回传
- 服务器检测到
tool_use+tool_result→ 用⚠️ 系统通知格式告知模型结果 - 模型基于结果直接回答用户
特性:
- 最多展示 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 <key>或x-api-key: <key>- 支持配置多个 API Key
客户端集成
OpenAI SDK (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)
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(非原生支持)
- 流式输出中的
<function_call>块会被服务器端过滤(客户端不可见) - IMA 会话限制约 20 轮,超出后需重新建立
保姆级部署教程(零基础上手)
本教程不需要编程基础,不需要安装任何软件,全程在手机和网页上完成。总耗时约 15 分钟。
准备工作:获取 IMA 的 Cookie
这一步是唯一需要花点时间的。你需要从手机上的 IMA App 抓取请求数据。
你需要: 一部安装了 IMA App 的手机(已用 QQ/微信登录)+ 一台电脑。
1.1 安装抓包工具
在电脑上安装 mitmproxy(免费、开源):
- 打开 mitmproxy.org,点击下载 Windows 安装包,一路「下一步」安装完成。
1.2 配置手机代理
- 确保手机和电脑在同一个 WiFi 下
- 电脑上:Win+R → 输入
cmd→ 回车,输入ipconfig,找到 IPv4 地址(形如192.168.x.x) - 手机上:设置 → WiFi → 点击当前连接的 WiFi → 代理 → 手动
- 服务器:填入电脑的 IPv4 地址,端口:
8080
- 服务器:填入电脑的 IPv4 地址,端口:
- 手机浏览器打开
mitm.it,按提示安装 mitmproxy 的 CA 证书- Android:选「用于 VPN 和应用」
- iOS:还需在 设置→通用→关于→证书信任设置 中开启信任
1.3 抓取 Cookie
- 电脑上 Win+R →
cmd→ 输入mitmweb回车(浏览器会自动打开 http://127.0.0.1:8081) - 手机上打开 IMA App,随便发一条消息(比如「你好」)
- 回到电脑浏览器,在 mitmweb 界面找
ima.qq.com开头的请求 - 点开任意一条,在 Request Headers 中找到 **
x-ima-cookie**,完整复制它的值
这个值很长,类似
IMA-GUID=xxx;APP-VERSION=xxx;IMA-Q36=xxx;...;IMA-TOKEN=xxx;...
1.4 获取 refresh_token 和 registration_id
- 在 mitmweb 页面的搜索框输入
/auth_login/refresh - 点开这个请求 → 点击 Request 标签 → 在内容区找:
refresh_token:一串很长的字符串registration_id:另一串字符串
- 分别复制保存
把这三个值记在手边备用: x-ima-cookie、refresh_token、registration_id。
抓完后记得把手机代理关掉(WiFi 设置里改回「无」),否则断开电脑后手机没法上网。
第一步:注册 Hugging Face
- 打开 huggingface.co/join
- 输入邮箱和密码 → Next → 完成人机验证
- 去邮箱点击确认链接激活账号
第二步:创建 Space
- 打开 huggingface.co/new-space
- 填写:
- Space name:随便取,比如
my-ima-api(只能用英文字母、数字、短横线) - License:选
mit - Space SDK:选 Docker
- Space Template:选 Blank
- Space Visibility:选 Private(关键!不选这个别人能看见你的 API 地址)
- Space name:随便取,比如
- 点 Create Space 按钮
第三步:上传文件
你现在在 Space 页面了。用网页拖拽上传,不需要装 Git。
- 点击顶部 Files 标签页
- 点击 Add file → Upload files
- 把以下 4 个文件拖进去:
server.js、config.json、package.json、Dockerfile - 往下滚,Commit message 随便填,点 Commit to main
不用上传
ima_runner.py,HF 上不需要它。
第四步:设置 Secrets(密码)
- 在 Space 页面顶部点 Settings 标签页
- 往下滚找到 Repository Secrets
- 点 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。
第五步:等待启动
- 回到顶部点 App 标签页
- 看到 "Building..." 等待 1-2 分钟,变成绿色 "Running" 即成功
- 如果卡住,点右上角 → Factory reboot
第六步:测试
浏览器打开 https://你的用户名-你的空间名.hf.space/,看到 JSON 数据含 "service": "ima2api" 就说明成功。
第七步:接入 Claude Code / Codex
Claude Code(终端):
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,个人使用远达不到限制。长时间不活动会休眠,下次访问自动唤醒(等几秒就好)。
本地开发仍可用
# 方式1:Python watchdog(token 刷新会重启 npm)
python ima_runner.py
# 方式2:纯 Node(HF 同款,token 热更新不重启)
npm start