HongShi AI正在绞尽脑汁想思路ING···
HongShiのAI摘要
GPT-4o

Deepinfra逆向思路+过程

前言

前几天在网上冲浪的时候发现一个网站,叫Deepinfra,点击去发现是一个AI的网站,有意思的是网站首页有一个对话页面,这个页面似乎是可以直接调用站内AI的,而且没有次数、内容限制。

于是我就打开F12,发了条消息打算抓一下然后有意思的就来了。

这个comletions直接请求https://api.deepinfra.com/v1/openai/chat/completions ,这个地址与OpenAI的标准格式有一些差距,而且我找了一大圈都没找到cookie或者别的用于鉴权的东西,似乎它前端没有做鉴权,我试着在python中把调用地址填好,编了一个key,居然调用成功了,还是流式的

那么事情很有意思了,其实到这一步就已经可以了,能直接去填一下模型名直接去用。但是我想要把它接入到我的API站里,那么我就要做点多余的事了。

目标:标准OpenAI格式调用,能通过/v1/models获取模型列表,自定义API KEY限制请求。

首先这个项目的基调已经定下了,是2api,那么我们就需要选一个合适的语言,方便部署的同时也要足够优雅,我选择了用Deno去写。

开写!

首先要获取模型列表,我原本打算照着请求一个个去薅,但是我突然发现他们有官方的API文档,就直接进去了,里面有首页能调用的模型,就直接copy过来用了。

1
2
3
4
5
6
7
8
9
const SUPPORTED_MODELS = [
{ id: "openai/gpt-oss-120b", object: "model" },
{ id: "moonshotai/Kimi-K2-Instruct", object: "model" },
{ id: "zai-org/GLM-4.5", object: "model" },
{ id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", object: "model" },
{ id: "deepseek-ai/DeepSeek-R1-0528-Turbo", object: "model" },
{ id: "deepseek-ai/DeepSeek-V3-0324-Turbo", object: "model" },
{ id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-Turbo", object: "model" }
];

模型列表搞定之后,就该整一下模型列表和completions接口了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
serve(async (req: Request) => {
const url = new URL(req.url);

if (req.method === "GET" && url.pathname === "/v1/models") {
return new Response(JSON.stringify({
object: "list",
data: SUPPORTED_MODELS
}), {
status: 200,
headers: { "Content-Type": "application/json" }
});
}

if (req.method === "POST" && url.pathname === "/v1/chat/completions") {
const body = await req.text();
const headers = new Headers(req.headers);

完事儿还有自定义key,不能是个东西就过来刷

1
2
3
4
5
6
const VALID_API_KEYS = ["sk-1", "sk-2"];
const auth = headers.get("Authorization");
const key = auth?.replace("Bearer ", "").trim();
if (!key || !VALID_API_KEYS.includes(key)) {
return new Response("Unauthorized", { status: 401 });
}

还有2api不可或缺的伪造请求头了。

1
2
3
4
5
6
7
const forwardHeaders: HeadersInit = {
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0",
"Origin": "https://deepinfra.com",
"Referer": "https://deepinfra.com/",
"x-deepinfra-source": "web-embed"
};

然后简单处理一下流式响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const stream = new ReadableStream({
async start(controller) {
const reader = response.body?.getReader();
const decoder = new TextDecoder();

while (reader) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
for (const line of chunk.split("\n")) {
if (line.startsWith("data: ")) {
const jsonText = line.slice(6);
if (jsonText === "[DONE]") break;
try {
const parsed = JSON.parse(jsonText);
const delta = parsed.choices[0].delta;
const reasoning = delta.reasoning_content ?? delta.content ?? "";
const output = `data: ${JSON.stringify({ choices: [{ delta: { content: reasoning } }] })}\n\n`;
controller.enqueue(new TextEncoder().encode(output));
} catch (_) {
}
}
}
}

controller.enqueue(new TextEncoder().encode("data: [DONE]\n\n"));
controller.close();
}
});

好啦!大功告成!该有的都有了,不该有的也有了(bushi)

接下来就是把它推到deno上运行了

如果您需要源码,请前往下面的链接获取。

[抛砖引玉]deepinfra2api,我人生中第一个2api - 开发调优 / 开发调优, Lv2 - LINUX DO