公益站死了,干脆整理一份国模免费渠道大全(授人以渔)

前言 众所周知,我的 Hello AI 公益站最近 503 了。倒不是模型渠道用完,而是服务器实在没办法挡住某些人的 Ddos。有些人可能知道,我最近办了一场国模狂欢节,那么,渠道是怎么来的呢? 答案只有一个:2API (官网免费对话逆向成 API) 现在公益站死了,但我可以授人以渔,总结一下国模 ...
公益站死了,干脆整理一份国模免费渠道大全(授人以渔)
公益站死了,干脆整理一份国模免费渠道大全(授人以渔)

前言

众所周知,我的 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
image

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

example0

用 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/v1

如果失效,可以用这个项目:GitHub - CJackHwang/ds2api: Deepseek to API - 客户端转 API 全栈开源工具,高性能,多账号轮询,支持纯 vercel、docker 部署使用。Google、Claude、ChatGPT 多接口格式兼容・GitHub

DouBao

没研究过,可以参考以下项目:GitHub - lza6/doubao-2api: 无头浏览器 (Playwright) 逆向 a_bogus 风控签名、静态设备指纹、动态 msToken 刷新、高级反检测伪装 (playwright-stealth)、需自备 Cookie (支持多账号轮询)、兼容 OpenAI 格式 API、原生流式输出、有状态会话保持、Docker 一键部署・GitHub

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 位参与者

阅读完整话题

来源: linux.do查看原文