Skip to content

Commit 2d1cabc

Browse files
committed
修复token有效性检测失效问题
1 parent 60bb490 commit 2d1cabc

File tree

3 files changed

+60
-49
lines changed

3 files changed

+60
-49
lines changed

package.json

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

src/api/controllers/chat.ts

Lines changed: 59 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ async function requestToken(refreshToken: string) {
5858
accessTokenRequestQueueMap[refreshToken] = [];
5959
logger.info(`Refresh token: ${refreshToken}`);
6060
const result = await (async () => {
61-
const [deviceId, token] = refreshToken.split('@');
61+
const [deviceId, token] = refreshToken.split("@");
6262
const result = await axios.post(
6363
"https://yuewen.cn/passport/proto.api.passport.v1.PassportService/RegisterDevice",
6464
{},
@@ -67,15 +67,15 @@ async function requestToken(refreshToken: string) {
6767
Cookie: `Oasis-Token=${token}`,
6868
Referer: "https://yuewen.cn/chats/new",
6969
...FAKE_HEADERS,
70-
"Oasis-Webid": deviceId
70+
"Oasis-Webid": deviceId,
7171
},
7272
timeout: 15000,
7373
validateStatus: () => true,
7474
}
7575
);
7676
const {
7777
accessToken: { raw: accessTokenRaw },
78-
refreshToken: { raw: refreshTokenRaw }
78+
refreshToken: { raw: refreshTokenRaw },
7979
} = checkResult(result, refreshToken);
8080
return {
8181
deviceId,
@@ -210,8 +210,8 @@ async function createCompletion(
210210
const refFileUrls = extractRefFileUrls(messages);
211211
const refs = refFileUrls.length
212212
? await Promise.all(
213-
refFileUrls.map((fileUrl) => uploadFile(fileUrl, refreshToken))
214-
)
213+
refFileUrls.map((fileUrl) => uploadFile(fileUrl, refreshToken))
214+
)
215215
: [];
216216

217217
// 创建会话
@@ -290,8 +290,8 @@ async function createCompletionStream(
290290
const refFileUrls = extractRefFileUrls(messages);
291291
const refs = refFileUrls.length
292292
? await Promise.all(
293-
refFileUrls.map((fileUrl) => uploadFile(fileUrl, refreshToken))
294-
)
293+
refFileUrls.map((fileUrl) => uploadFile(fileUrl, refreshToken))
294+
)
295295
: [];
296296

297297
// 创建会话
@@ -361,15 +361,22 @@ function extractRefFileUrls(messages: any[]) {
361361
// 只获取最新的消息
362362
const lastMessage = messages[messages.length - 1];
363363
if (_.isArray(lastMessage.content)) {
364-
lastMessage.content.forEach(v => {
365-
if (!_.isObject(v) || !['file', 'image_url'].includes(v['type']))
366-
return;
364+
lastMessage.content.forEach((v) => {
365+
if (!_.isObject(v) || !["file", "image_url"].includes(v["type"])) return;
367366
// step-free-api支持格式
368-
if (v['type'] == 'file' && _.isObject(v['file_url']) && _.isString(v['file_url']['url']))
369-
urls.push(v['file_url']['url']);
367+
if (
368+
v["type"] == "file" &&
369+
_.isObject(v["file_url"]) &&
370+
_.isString(v["file_url"]["url"])
371+
)
372+
urls.push(v["file_url"]["url"]);
370373
// 兼容gpt-4-vision-preview API格式
371-
else if (v['type'] == 'image_url' && _.isObject(v['image_url']) && _.isString(v['image_url']['url']))
372-
urls.push(v['image_url']['url']);
374+
else if (
375+
v["type"] == "image_url" &&
376+
_.isObject(v["image_url"]) &&
377+
_.isString(v["image_url"]["url"])
378+
)
379+
urls.push(v["image_url"]["url"]);
373380
});
374381
}
375382
logger.info("本次请求上传:" + urls.length + "个文件");
@@ -389,33 +396,37 @@ function extractRefFileUrls(messages: any[]) {
389396
function messagesPrepare(convId: string, messages: any[], refs: any[]) {
390397
// 检查最新消息是否含有"type": "image_url"或"type": "file",如果有则注入消息
391398
let latestMessage = messages[messages.length - 1];
392-
let hasFileOrImage = Array.isArray(latestMessage.content)
393-
&& latestMessage.content.some(v => (typeof v === 'object' && ['file', 'image_url'].includes(v['type'])));
399+
let hasFileOrImage =
400+
Array.isArray(latestMessage.content) &&
401+
latestMessage.content.some(
402+
(v) => typeof v === "object" && ["file", "image_url"].includes(v["type"])
403+
);
394404
if (hasFileOrImage) {
395405
let newFileMessage = {
396-
"content": "以上为历史消息,关注以下用户发送的文件和消息",
397-
"role": "system"
406+
content: "以上为历史消息,关注以下用户发送的文件和消息",
407+
role: "system",
398408
};
399409
messages.splice(messages.length - 1, 0, newFileMessage);
400410
logger.info("注入提升尾部文件注意力system prompt");
401411
} else {
402412
let newTextMessage = {
403-
"content": "以上为历史消息,关注以下用户消息",
404-
"role": "system"
413+
content: "以上为历史消息,关注以下用户消息",
414+
role: "system",
405415
};
406416
messages.splice(messages.length - 1, 0, newTextMessage);
407417
logger.info("注入提升尾部消息注意力system prompt");
408418
}
409419

410-
const content = messages.reduce((content, message) => {
411-
if (_.isArray(message.content)) {
412-
return message.content.reduce((_content, v) => {
413-
if (!_.isObject(v) || v["type"] != "text") return _content;
414-
return _content + `${message.role || "user"}:${v["text"] || ""}\n`;
415-
}, content);
416-
}
417-
return (content += `${message.role || "user"}:${message.content}\n`);
418-
}, "") + 'assistant:';
420+
const content =
421+
messages.reduce((content, message) => {
422+
if (_.isArray(message.content)) {
423+
return message.content.reduce((_content, v) => {
424+
if (!_.isObject(v) || v["type"] != "text") return _content;
425+
return _content + `${message.role || "user"}:${v["text"] || ""}\n`;
426+
}, content);
427+
}
428+
return (content += `${message.role || "user"}:${message.content}\n`);
429+
}, "") + "assistant:";
419430

420431
logger.info("\n对话合并:\n" + content);
421432
const json = JSON.stringify({
@@ -491,7 +502,11 @@ async function receiveStream(model: string, convId: string, stream: any) {
491502
} else if (result.textEvent && result.textEvent.text)
492503
data.choices[0].message.content += result.textEvent.text;
493504
else if (result.doneEvent) {
494-
data.choices[0].message.content = data.choices[0].message.content.replace(/<(web|url|unknown)_[0-9a-zA-Z]+>/g, '');
505+
data.choices[0].message.content =
506+
data.choices[0].message.content.replace(
507+
/<(web|url|unknown)_[0-9a-zA-Z]+>/g,
508+
""
509+
);
495510
data.choices[0].message.content += refContent
496511
? `\n\n搜索结果来自:\n${refContent.replace(/\n$/, "")}`
497512
: "";
@@ -503,15 +518,13 @@ async function receiveStream(model: string, convId: string, stream: any) {
503518
stream.on("data", (buffer: Buffer) => {
504519
// 接收数据头
505520
chunk = Buffer.concat([temp, chunk, buffer]);
506-
if(chunk.length < 5)
507-
return;
521+
if (chunk.length < 5) return;
508522
// 读取当前数据块大小
509523
const chunkSize = chunk.readUint32BE(1);
510524
// 根据当前大小接收完整数据块
511525
temp = chunk.subarray(chunkSize + 5);
512526
chunk = chunk.subarray(0, chunkSize + 5);
513-
if(chunk.length < chunkSize + 5)
514-
return;
527+
if (chunk.length < chunkSize + 5) return;
515528
parser(chunk.subarray(5));
516529
chunk = Buffer.from([]);
517530
});
@@ -649,15 +662,13 @@ function createTransStream(
649662
stream.on("data", (buffer: Buffer) => {
650663
// 接收数据头
651664
chunk = Buffer.concat([temp, chunk, buffer]);
652-
if(chunk.length < 5)
653-
return;
665+
if (chunk.length < 5) return;
654666
// 读取当前数据块大小
655667
const chunkSize = chunk.readUint32BE(1);
656668
// 根据当前大小接收完整数据块
657669
temp = chunk.subarray(chunkSize + 5);
658670
chunk = chunk.subarray(0, chunkSize + 5);
659-
if(chunk.length < chunkSize + 5)
660-
return;
671+
if (chunk.length < chunkSize + 5) return;
661672
parser(chunk.subarray(5));
662673
chunk = Buffer.from([]);
663674
});
@@ -778,7 +789,7 @@ async function uploadFile(fileUrl: string, refreshToken: string) {
778789
// 60秒超时
779790
timeout: 60000,
780791
headers: {
781-
'Content-Type': mimeType,
792+
"Content-Type": mimeType,
782793
Cookie: generateCookie(deviceId, token),
783794
"Oasis-Webid": deviceId,
784795
Referer: "https://yuewen.cn/chats/new",
@@ -791,7 +802,8 @@ async function uploadFile(fileUrl: string, refreshToken: string) {
791802
});
792803
const { id: fileId } = checkResult(result, refreshToken);
793804

794-
let fileStatus, needFurtherCall = true;
805+
let fileStatus,
806+
needFurtherCall = true;
795807
const startTime = util.unixTimestamp();
796808
while (needFurtherCall) {
797809
// 获取文件上传结果
@@ -818,7 +830,7 @@ async function uploadFile(fileUrl: string, refreshToken: string) {
818830
if (util.unixTimestamp() - startTime > 60)
819831
throw new APIException(EX.API_FILE_UPLOAD_TIMEOUT);
820832
}
821-
await new Promise(resolve => setTimeout(resolve, 5000));
833+
await new Promise((resolve) => setTimeout(resolve, 5000));
822834

823835
return {
824836
attachmentType: mimeType,
@@ -843,14 +855,16 @@ function tokenSplit(authorization: string) {
843855
* 获取Token存活状态
844856
*/
845857
async function getTokenLiveStatus(refreshToken: string) {
858+
const [deviceId, token] = refreshToken.split("@");
846859
const result = await axios.post(
847860
"https://yuewen.cn/passport/proto.api.passport.v1.PassportService/RegisterDevice",
848861
{},
849862
{
850863
headers: {
851-
Cookie: `Oasis-Token=${refreshToken}`,
864+
Cookie: `Oasis-Token=${token}`,
852865
Referer: "https://yuewen.cn/chats/new",
853866
...FAKE_HEADERS,
867+
"Oasis-Webid": deviceId,
854868
},
855869
timeout: 15000,
856870
validateStatus: () => true,
@@ -859,11 +873,10 @@ async function getTokenLiveStatus(refreshToken: string) {
859873
try {
860874
const {
861875
accessToken: { raw: accessTokenRaw },
862-
refreshToken: { raw: refreshTokenRaw }
876+
refreshToken: { raw: refreshTokenRaw },
863877
} = checkResult(result, refreshToken);
864-
return !!(accessTokenRaw && refreshTokenRaw)
865-
}
866-
catch(err) {
878+
return !!(accessTokenRaw && refreshTokenRaw);
879+
} catch (err) {
867880
return false;
868881
}
869882
}

src/api/routes/token.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import _ from 'lodash';
22

33
import Request from '@/lib/request/Request.ts';
4-
import Response from '@/lib/response/Response.ts';
54
import chat from '@/api/controllers/chat.ts';
6-
import logger from '@/lib/logger.ts';
75

86
export default {
97

0 commit comments

Comments
 (0)