Skip to content

Commit 3cb5790

Browse files
committed
跟进官方最新反逆向策略
1 parent 0be2d44 commit 3cb5790

File tree

4 files changed

+22
-53
lines changed

4 files changed

+22
-53
lines changed

35144cac553a7a2a.wasm

-17.2 KB
Binary file not shown.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "deepseek-free-api",
3-
"version": "0.0.13",
3+
"version": "0.0.14",
44
"description": "DeepSeek Free API Server",
55
"type": "module",
66
"main": "dist/index.js",

sha3_wasm_bg.7b9ca65ddd.wasm

26 KB
Binary file not shown.

src/api/controllers/chat.ts

Lines changed: 21 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { PassThrough } from "stream";
22
import _ from "lodash";
33
import axios, { AxiosResponse } from "axios";
4-
import { Worker } from 'worker_threads';
5-
import path from 'path';
64

75
import APIException from "@/lib/exceptions/APIException.ts";
86
import EX from "@/api/consts/exceptions.ts";
@@ -14,7 +12,7 @@ import util from "@/lib/util.ts";
1412
// 模型名称
1513
const MODEL_NAME = "deepseek-chat";
1614
// 插冷鸡WASM文件路径
17-
const WASM_PATH = './35144cac553a7a2a.wasm';
15+
const WASM_PATH = './sha3_wasm_bg.7b9ca65ddd.wasm';
1816
// access_token有效期
1917
const ACCESS_TOKEN_EXPIRES = 3600;
2018
// 最大重试次数
@@ -39,7 +37,7 @@ const FAKE_HEADERS = {
3937
"Sec-Fetch-Site": "same-origin",
4038
"User-Agent":
4139
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
42-
"X-App-Version": "20241018.0"
40+
"X-App-Version": "20241129.1"
4341
};
4442
const EVENT_COMMIT_ID = '41e9c7b1';
4543
// 当前IP地址
@@ -49,27 +47,6 @@ const accessTokenMap = new Map();
4947
// access_token请求队列映射
5048
const accessTokenRequestQueueMap: Record<string, Function[]> = {};
5149

52-
// 添加 worker 池
53-
const workerPool: (Worker & { inUse?: boolean })[] = [];
54-
const MAX_WORKERS = 4; // 可以根据需要调整
55-
56-
function getWorker() {
57-
// 从池中获取空闲worker或创建新worker
58-
let worker = workerPool.find(w => !w.inUse);
59-
if (!worker && workerPool.length < MAX_WORKERS) {
60-
worker = new Worker(path.join(path.resolve(), 'challenge-worker.js'));
61-
workerPool.push(worker);
62-
}
63-
if (worker) {
64-
worker.inUse = true;
65-
}
66-
return worker;
67-
}
68-
69-
function releaseWorker(worker: (Worker & { inUse?: boolean })) {
70-
worker.inUse = false;
71-
}
72-
7350
async function getIPAddress() {
7451
if (ipAddress) return ipAddress;
7552
const result = await axios.get('https://chat.deepseek.com/', {
@@ -202,28 +179,31 @@ async function createSession(model: string, refreshToken: string): Promise<strin
202179
* 相当于把计算量放在浏览器侧的话,用户分摊了这个计算量
203180
* 但是如果逆向在服务器上算,那这个成本都在服务器集中,并发一高就GG
204181
*/
205-
async function answerChallenge(response: any): Promise<any> {
182+
async function answerChallenge(response: any, targetPath: string): Promise<any> {
206183
const { algorithm, challenge, salt, difficulty, expire_at, signature } = response;
207184
const deepSeekHash = new DeepSeekHash();
208185
await deepSeekHash.init(WASM_PATH);
209186
const answer = deepSeekHash.calculateHash(algorithm, challenge, salt, difficulty, expire_at);
210-
return {
187+
return Buffer.from(JSON.stringify({
211188
algorithm,
212189
challenge,
213190
salt,
214191
answer,
215-
signature
216-
}
192+
signature,
193+
target_path: targetPath
194+
})).toString('base64');
217195
}
218196

219197
/**
220198
* 获取challenge响应
221199
*
222200
* @param refreshToken 用于刷新access_token的refresh_token
223201
*/
224-
async function getChallengeResponse(refreshToken: string) {
202+
async function getChallengeResponse(refreshToken: string, targetPath: string) {
225203
const token = await acquireToken(refreshToken);
226-
const result = await axios.get('https://chat.deepseek.com/api/v0/chat/challenge', {
204+
const result = await axios.post('https://chat.deepseek.com/api/v0/chat/create_pow_challenge', {
205+
target_path: targetPath
206+
}, {
227207
headers: {
228208
Authorization: `Bearer ${token}`,
229209
...FAKE_HEADERS,
@@ -283,19 +263,15 @@ async function createCompletion(
283263
}
284264
}
285265

286-
let challenge;
287-
if (isSearchModel || isThinkingModel) {
288-
const challengeResponse = await getChallengeResponse(refreshToken);
289-
challenge = await answerChallenge(challengeResponse);
290-
logger.info(`插冷鸡: ${JSON.stringify(challenge)}`);
291-
}
266+
const challengeResponse = await getChallengeResponse(refreshToken, '/api/v0/chat/completion');
267+
const challenge = await answerChallenge(challengeResponse, '/api/v0/chat/completion');
268+
logger.info(`插冷鸡: ${challenge}`);
292269

293270
const result = await axios.post(
294271
"https://chat.deepseek.com/api/v0/chat/completion",
295272
{
296273
chat_session_id: sessionId,
297274
parent_message_id: refParentMsgId || null,
298-
challenge_response: challenge,
299275
prompt,
300276
ref_file_ids: [],
301277
search_enabled: isSearchModel,
@@ -305,7 +281,8 @@ async function createCompletion(
305281
headers: {
306282
Authorization: `Bearer ${token}`,
307283
...FAKE_HEADERS,
308-
Cookie: generateCookie()
284+
Cookie: generateCookie(),
285+
'X-Ds-Pow-Response': challenge
309286
},
310287
// 120秒超时
311288
timeout: 120000,
@@ -394,12 +371,9 @@ async function createCompletionStream(
394371
}
395372
}
396373

397-
let challenge;
398-
if (isSearchModel || isThinkingModel) {
399-
const challengeResponse = await getChallengeResponse(refreshToken);
400-
challenge = await answerChallenge(challengeResponse);
401-
logger.info(`插冷鸡: ${JSON.stringify(challenge)}`);
402-
}
374+
const challengeResponse = await getChallengeResponse(refreshToken, '/api/v0/chat/completion');
375+
const challenge = await answerChallenge(challengeResponse, '/api/v0/chat/completion');
376+
logger.info(`插冷鸡: ${challenge}`);
403377

404378
// 创建会话
405379
const sessionId = refSessionId || await createSession(model, refreshToken);
@@ -412,7 +386,6 @@ async function createCompletionStream(
412386
chat_session_id: sessionId,
413387
parent_message_id: refParentMsgId || null,
414388
prompt,
415-
challenge_response: challenge,
416389
ref_file_ids: [],
417390
search_enabled: isSearchModel,
418391
thinking_enabled: isThinkingModel
@@ -421,7 +394,8 @@ async function createCompletionStream(
421394
headers: {
422395
Authorization: `Bearer ${token}`,
423396
...FAKE_HEADERS,
424-
Cookie: generateCookie()
397+
Cookie: generateCookie(),
398+
'X-Ds-Pow-Response': challenge
425399
},
426400
// 120秒超时
427401
timeout: 120000,
@@ -1254,11 +1228,6 @@ getIPAddress().then(() => {
12541228
logger.error('获取 IP 地址失败:', err);
12551229
});
12561230

1257-
// 在程序退出时清理workers
1258-
process.on('exit', () => {
1259-
workerPool.forEach(worker => worker.terminate());
1260-
});
1261-
12621231
export default {
12631232
createCompletion,
12641233
createCompletionStream,

0 commit comments

Comments
 (0)