前言
众所周知,我的 Hello AI 公益站最近 503 了。倒不是模型渠道用完,而是服务器实在没办法挡住某些人的 Ddos。有些人可能知道,我最近办了一场国模狂欢节,那么,渠道是怎么来的呢?
答案只有一个:2API (官网免费对话逆向成 API)
现在公益站死了,但我可以授人以渔,总结一下国模 2API 方法大全。你只要有一台服务器,一个域名,一个 CF 账号,就可以自己拥有 API(这也是另一种公益站吧)
Kimi
总结
Cloudflare Worker 脚本。
部署方法
新建一个 Cloudflare Workers,输入以下代码
// Cloudflare Worker - Kimi K2 OpenAI API 兼容代理
// 环境变量: UPSTREAM_HOST (可选,默认 https://kimi-k2.ai)
const DEFAULT_UPSTREAM_HOST = "https://kimi-k2.ai";
/**
* 生成随机 IP 地址
* 使用常见的住宅/商业 IP 段,避免数据中心 IP 段
*/
function generateRandomIP() {
// 常见的住宅/商业 IP 段前缀 (中国和国际)
const ipPrefixes = [
// 中国电信
[113, 116], [114, 80], [115, 192], [116, 224], [117, 136],
[118, 112], [119, 96], [120, 192], [121, 32], [122, 192],
// 中国联通
[112, 64], [113, 0], [116, 112], [119, 112], [120, 64],
// 中国移动
[111, 0], [112, 0], [117, 128], [120, 128], [183, 192],
// 美国常见段
[24, 0], [50, 0], [68, 0], [71, 0], [72, 0], [73, 0],
[76, 0], [96, 0], [98, 0], [99, 0], [107, 0], [108, 0]
];
const prefix = ipPrefixes[Math.floor(Math.random() * ipPrefixes.length)];
const octet3 = Math.floor(Math.random() * 256);
const octet4 = Math.floor(Math.random() * 254) + 1; // 避免 0 和 255
return `${prefix[0]}.${prefix[1] + Math.floor(Math.random() * 16)}.${octet3}.${octet4}`;
}
/**
* 生成包含伪造 IP 的请求头
*/
function generateSpoofedHeaders(baseHeaders = {}) {
const fakeIP = generateRandomIP();
console.log(`[IP伪造] 使用伪造 IP: ${fakeIP}`);
return {
...baseHeaders,
"X-Forwarded-For": fakeIP,
"X-Real-IP": fakeIP,
"CF-Connecting-IP": fakeIP,
"X-Originating-IP": fakeIP,
"True-Client-IP": fakeIP,
"X-Client-IP": fakeIP,
"Forwarded": `for=${fakeIP}`
};
}
/**
* 获取认证 Cookies
*/
async function getAuthCookies(upstreamHost) {
console.log("[认证] 正在尝试获取认证 Cookies...");
const headers = generateSpoofedHeaders({
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"referer": `${upstreamHost}/zh/chat`
});
const response = await fetch(`${upstreamHost}/api/auth/session`, { headers });
console.log(`[认证] 收到上游 Cookies 响应, 状态码: ${response.status}`);
const cookies = response.headers.get("set-cookie");
if (!cookies) {
console.error("[认证] 错误: 未在响应头中找到 'set-cookie'");
return null;
}
const csrfMatch = cookies.match(/__Host-authjs\.csrf-token=([^;]+)/);
const callbackMatch = cookies.match(/__Secure-authjs\.callback-url=([^;]+)/);
const authData = {
csrf: csrfMatch ? csrfMatch[1] : null,
callback: callbackMatch ? callbackMatch[1] : null
};
if (authData.csrf && authData.callback) {
console.log("[认证] 成功解析 CSRF 和 Callback Cookies");
} else {
console.warn("[认证] 警告: 未能完整解析 Cookies:", authData);
}
return authData;
}
/**
* 生成 Session ID
*/
function generateSessionId() {
const sessionId = crypto.randomUUID();
console.log(`[工具] 生成新的 Session ID: ${sessionId}`);
return sessionId;
}
/**
* 将 OpenAI 格式请求转换为上游格式
*/
function convertToUpstreamFormat(openaiRequest) {
console.log("[转换] 正在将 OpenAI 格式转换为上游格式...");
return {
messages: openaiRequest.messages,
sessionId: generateSessionId(),
searchContext: ""
};
}
/**
* 将上游响应转换为 OpenAI 格式
*/
function convertToOpenAIFormat(upstreamResponse, model, stream = false) {
const id = `chatcmpl-${Date.now()}`;
const created = Math.floor(Date.now() / 1000);
if (stream) {
console.log("[转换] 正在将上游响应转换为 OpenAI 流式格式...");
const chunk = {
id,
object: "chat.completion.chunk",
created,
model,
choices: [{
index: 0,
delta: { content: upstreamResponse.content },
finish_reason: "stop"
}]
};
return `data: ${JSON.stringify(chunk)}\n\ndata: [DONE]\n\n`;
}
console.log("[转换] 正在将上游响应转换为 OpenAI JSON 格式...");
return {
id,
object: "chat.completion",
created,
model,
choices: [{
index: 0,
message: {
role: "assistant",
content: upstreamResponse.content
},
finish_reason: "stop"
}],
usage: upstreamResponse.usage || {
prompt_tokens: 0,
completion_tokens: 0,
total_tokens: 0
}
};
}
/**
* 处理聊天完成请求
*/
async function handleChatCompletion(request, upstreamHost) {
console.log("[聊天处理] 开始处理 /v1/chat/completions 请求...");
const openaiRequest = await request.json();
const stream = openaiRequest.stream === true;
const model = openaiRequest.model || "kimi-k2";
console.log(`[聊天处理] 请求参数: 模型=${model}, 是否流式=${stream}`);
const authCookies = await getAuthCookies(upstreamHost);
if (!authCookies || !authCookies.csrf || !authCookies.callback) {
console.error("[聊天处理] 错误: 获取认证 Cookies 失败, 中断请求");
return new Response(JSON.stringify({ error: "Failed to get auth cookies" }), {
status: 500,
headers: { "content-type": "application/json" }
});
}
const upstreamRequest = convertToUpstreamFormat(openaiRequest);
console.log(`[聊天处理] 准备向上游 ${upstreamHost}/api/chat 发送请求`);
const chatHeaders = generateSpoofedHeaders({
"content-type": "application/json",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"origin": upstreamHost,
"referer": `${upstreamHost}/zh/chat`,
"cookie": `__Host-authjs.csrf-token=${authCookies.csrf}; __Secure-authjs.callback-url=${authCookies.callback}`
});
const upstreamResponse = await fetch(`${upstreamHost}/api/chat`, {
method: "POST",
headers: chatHeaders,
body: JSON.stringify(upstreamRequest)
});
console.log(`[聊天处理] 收到上游响应, 状态码: ${upstreamResponse.status}`);
if (!upstreamResponse.ok) {
console.error(`[聊天处理] 错误: 上游请求失败, 状态码: ${upstreamResponse.status}`);
return new Response(JSON.stringify({ error: "Upstream request failed" }), {
status: upstreamResponse.status,
headers: { "content-type": "application/json" }
});
}
const upstreamData = await upstreamResponse.json();
console.log("[聊天处理] 成功解析上游 JSON 响应");
if (stream) {
console.log("[聊天处理] 正在以流式 (SSE) 格式返回响应");
const streamData = convertToOpenAIFormat(upstreamData, model, true);
return new Response(streamData, {
headers: {
"content-type": "text/event-stream",
"cache-control": "no-cache",
"connection": "keep-alive"
}
});
}
console.log("[聊天处理] 正在以 JSON 格式返回响应");
const openaiResponse = convertToOpenAIFormat(upstreamData, model, false);
return new Response(JSON.stringify(openaiResponse), {
headers: { "content-type": "application/json" }
});
}
/**
* 添加 CORS 响应头
*/
function addCorsHeaders(response) {
const newHeaders = new Headers(response.headers);
newHeaders.set("Access-Control-Allow-Origin", "*");
newHeaders.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
newHeaders.set("Access-Control-Allow-Headers", "Content-Type, Authorization");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders
});
}
/**
* 主请求处理函数
*/
async function handleRequest(request, env) {
const upstreamHost = env.UPSTREAM_HOST || DEFAULT_UPSTREAM_HOST;
const url = new URL(request.url);
console.log(`[入口] 收到新请求: ${request.method} ${url.pathname}`);
// 处理 CORS 预检请求
if (request.method === "OPTIONS") {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type, Authorization",
"Access-Control-Max-Age": "86400"
}
});
}
let response;
// 健康检查端点
if (url.pathname === "/health" && request.method === "GET") {
console.log("[路由] 匹配到: /health (GET)");
response = new Response(JSON.stringify({
status: "healthy",
timestamp: new Date().toISOString(),
upstreamHost: upstreamHost
}), {
headers: { "content-type": "application/json" }
});
return addCorsHeaders(response);
}
// 聊天完成端点
if (url.pathname === "/v1/chat/completions" && request.method === "POST") {
console.log("[路由] 匹配到: /v1/chat/completions (POST)");
response = await handleChatCompletion(request, upstreamHost);
return addCorsHeaders(response);
}
// 模型列表端点
if (url.pathname === "/v1/models" && request.method === "GET") {
console.log("[路由] 匹配到: /v1/models (GET)");
response = new Response(JSON.stringify({
object: "list",
data: [{
id: "kimi-k2",
object: "model",
created: Math.floor(Date.now() / 1000),
owned_by: "kimi"
}]
}), {
headers: { "content-type": "application/json" }
});
return addCorsHeaders(response);
}
console.log(`[路由] 未找到匹配路由: ${url.pathname}, 返回 404`);
return new Response("Not Found", { status: 404 });
}
// Cloudflare Worker 导出
export default {
async fetch(request, env, ctx) {
return handleRequest(request, env);
}
};
使用方法
API 密钥随便填(不会用的请先学一下其他帖子)
Qwen
总结:一个 Docker 2API 项目,需要一台具有公网 IP 的服务器并将 8000 端口开放
部署方法
运行命令
docker run -it -d --init --name qwen-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/qwen-free-api:latest
使用方法
从 通义千问 登录
进入通义千问随便发起一个对话,然后 F12 打开开发者工具,从 Application > Cookies 中找到 tongyi_sso_ticket 的值,这将作为 Authorization 的 Bearer Token 值。
用 Authorization 的 Bearer Token 作为 API 密钥使用 API

url:yourip:8000/v1
如果失效,可以使用这个项目: GitHub - smanx/qwen2api: A proxy service that converts Qwen Chat to an OpenAI-compatible API. · GitHub
GLM AI
总结:一个 Docker 2API 项目,需要一台具有公网 IP 的服务器并将 8000 端口开放
部署方法
运行命令
docker run -it -d --init --name glm-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/glm-free-api:latest
使用方法
从 智谱清言 获取 refresh_token
进入智谱清言随便发起一个对话,然后 F12 打开开发者工具,从 Application > Cookies 中找到 chatglm_refresh_token 的值,这将作为 Authorization 的 Bearer Token 值:Authorization: Bearer TOKEN
用 Authorization 的 Bearer Token 作为 API 密钥使用 API
url:yourip:8000/v1
讯飞星火(Spark)
总结:一个 Docker 2API 项目,需要一台具有公网 IP 的服务器并将 8000 端口开放
部署方法
运行命令
docker run -it -d --init --name spark-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/spark-free-api:latest
使用方法
从 xinghuo.xfyun.cn 获取 ssoSessionId, 进入 Spark 登录并发起一个对话,从 Cookie 获取 ssoSessionId 值,由于星火平台禁用 F12 开发者工具,请安装 Cookie-Editor 浏览器插件查看你的 Cookie。
这个值将作为 Authorization 的 Bearer Token 值:Authorization: Bearer TOKEN
注意:如果退出登录或重新登录将可能导致 ssoSessionId 失效!
智能体接入
从这里使用浏览器搜索功能找到你想要的智能体,复制它的 botId 作为 model 值。
多账号接入
你可以通过提供多个账号的 ssoSessionId 并使用 , 拼接提供:
Authorization: Bearer TOKEN1,TOKEN2,TOKEN3
用 Authorization 的 Bearer Token 作为 API 密钥使用 API
url:yourip:8000/v1
DeepSeek
部署方法
运行命令
docker run -it -d --init --name deepseek-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/deepseek-free-api:latest # 或将token配置在环境变量 docker run -it -d --init --name deepseek-free-api -p 8000:8000 -e TZ=Asia/Shanghai -e DEEP_SEEK_CHAT_AUTHORIZATION=xxx vinlic/deepseek-free-api:latest
使用方法
从 DeepSeek 获取 userToken value
进入 DeepSeek 随便发起一个对话,然后 F12 打开开发者工具,从 Application > LocalStorage 中找到 userToken 中的 value 值,这将作为 Authorization 的 Bearer Token 值:Authorization: Bearer TOKEN
用 Authorization 的 Bearer Token 作为 API 密钥使用 API
多账号接入
目前同个账号同时只能有一路输出,你可以通过提供多个账号的 userToken value 并使用 , 拼接提供:
Authorization: Bearer TOKEN1,TOKEN2,TOKEN3
每次请求服务会从中挑选一个。
环境变量(可选)
环境变量 是否必填 说明 DEEP_SEEK_CHAT_AUTHORIZATION 否 当配置了 token 则使用 token,未配置则需要在请求头中传递 Authorization url:yourip:8000/v1DouBao
Other
这有一些其他项目,早已失效 / 太冷门,可以拿去氛围式编程试一下。
Moonshot AI(Kimi.ai)接口转 API kimi-free-api
阶跃星辰 (跃问 StepChat) 接口转 API step-free-api
秘塔 AI (Metaso) 接口转 API metaso-free-api (当前不可用)
字节跳动(豆包)接口转 API doubao-free-api (当前不可用)
字节跳动(即梦 AI)接口转 API jimeng-free-api
讯飞星火(Spark)接口转 API spark-free-api
MiniMax(海螺 AI)接口转 API hailuo-free-api
聆心智能 (Emohaa) 接口转 API emohaa-free-api(当前不可用)
30 个帖子 - 30 位参与者
