HongShi AI正在绞尽脑汁想思路ING···
AI逆向AI逆向Deepinfra逆向思路+过程
HongShi前言
前几天在网上冲浪的时候发现一个网站,叫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