@iflyrpa/actions 4.0.0-beta.8 → 5.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.js +275 -147
- package/dist/bundle.js.map +1 -1
- package/dist/index.js +272 -146
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +272 -146
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -5489,7 +5489,7 @@ var __webpack_exports__ = {};
|
|
|
5489
5489
|
});
|
|
5490
5490
|
const package_json_namespaceObject = require("@iflyrpa/share/package.json");
|
|
5491
5491
|
var package_json_default = /*#__PURE__*/ __webpack_require__.n(package_json_namespaceObject);
|
|
5492
|
-
var package_namespaceObject = JSON.parse('{"i8":"4.0.
|
|
5492
|
+
var package_namespaceObject = JSON.parse('{"i8":"4.0.1-beta.0"}');
|
|
5493
5493
|
const share_namespaceObject = require("@iflyrpa/share");
|
|
5494
5494
|
const external_node_fs_namespaceObject = require("node:fs");
|
|
5495
5495
|
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
@@ -5590,7 +5590,8 @@ var __webpack_exports__ = {};
|
|
|
5590
5590
|
url: error.config?.url,
|
|
5591
5591
|
isProxyRequest: !!(error.config && (error.config.httpAgent || error.config.httpsAgent)),
|
|
5592
5592
|
params: error.config?.params,
|
|
5593
|
-
data: error.config?.data
|
|
5593
|
+
data: error.config?.data,
|
|
5594
|
+
serverDate: error.response?.headers?.date
|
|
5594
5595
|
}
|
|
5595
5596
|
};
|
|
5596
5597
|
if (foundError) Object.assign(errorResponse, foundError);
|
|
@@ -5668,7 +5669,7 @@ var __webpack_exports__ = {};
|
|
|
5668
5669
|
try {
|
|
5669
5670
|
this.proxyInfo = agent ? `${agent.ip}:${agent.port}` : void 0;
|
|
5670
5671
|
const controller = new AbortController();
|
|
5671
|
-
const timeoutId = setTimeout(()=>controller.abort(), reqTimeout);
|
|
5672
|
+
const timeoutId = setTimeout(()=>controller.abort(), reqTimeout + 500);
|
|
5672
5673
|
const response = await this.apiClient({
|
|
5673
5674
|
...config,
|
|
5674
5675
|
timeout: reqTimeout,
|
|
@@ -5692,7 +5693,7 @@ var __webpack_exports__ = {};
|
|
|
5692
5693
|
599
|
|
5693
5694
|
].includes(handledError.code);
|
|
5694
5695
|
if (Rtimes < retries && isRetry) {
|
|
5695
|
-
this.logger?.info(`进入第${Rtimes + 1}
|
|
5696
|
+
this.logger?.info(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}`);
|
|
5696
5697
|
await new Promise((resolve)=>setTimeout(resolve, retryDelay));
|
|
5697
5698
|
return sessionRt(Rtimes + 1);
|
|
5698
5699
|
}
|
|
@@ -9909,23 +9910,26 @@ var __webpack_exports__ = {};
|
|
|
9909
9910
|
};
|
|
9910
9911
|
}
|
|
9911
9912
|
case types_ExecutionState.SUCCESS:
|
|
9912
|
-
|
|
9913
|
-
|
|
9914
|
-
|
|
9915
|
-
|
|
9916
|
-
|
|
9917
|
-
|
|
9918
|
-
|
|
9919
|
-
|
|
9920
|
-
|
|
9921
|
-
|
|
9922
|
-
|
|
9923
|
-
|
|
9924
|
-
|
|
9925
|
-
|
|
9926
|
-
|
|
9927
|
-
|
|
9928
|
-
|
|
9913
|
+
{
|
|
9914
|
+
const cookie = JSON.stringify(await task.steelBrowserContext?.cookies());
|
|
9915
|
+
await updateTaskState?.({
|
|
9916
|
+
state: share_namespaceObject.TaskState.SUCCESS,
|
|
9917
|
+
result: {
|
|
9918
|
+
cookie,
|
|
9919
|
+
token,
|
|
9920
|
+
userInfo: userInfo
|
|
9921
|
+
}
|
|
9922
|
+
});
|
|
9923
|
+
return {
|
|
9924
|
+
code: 0,
|
|
9925
|
+
message: "成功",
|
|
9926
|
+
data: {
|
|
9927
|
+
cookie,
|
|
9928
|
+
token,
|
|
9929
|
+
userInfo
|
|
9930
|
+
}
|
|
9931
|
+
};
|
|
9932
|
+
}
|
|
9929
9933
|
default:
|
|
9930
9934
|
return {
|
|
9931
9935
|
code: 500,
|
|
@@ -10284,20 +10288,11 @@ var __webpack_exports__ = {};
|
|
|
10284
10288
|
};
|
|
10285
10289
|
const rpa_rpaAction = async (task, params)=>{
|
|
10286
10290
|
const tmpCachePath = task.getTmpPath();
|
|
10287
|
-
const
|
|
10288
|
-
path: "/",
|
|
10289
|
-
secure: true,
|
|
10290
|
-
domain: "baijiahao.baidu.com",
|
|
10291
|
-
url: "https://baijiahao.baidu.com",
|
|
10292
|
-
httpOnly: true
|
|
10293
|
-
};
|
|
10291
|
+
const validCookies = (params.cookies || []).filter((it)=>it.name && it.value && "undefined" !== it.value);
|
|
10294
10292
|
const page = await task.createPage({
|
|
10295
10293
|
show: task.debug,
|
|
10296
10294
|
url: params.url || "https://baijiahao.baidu.com/builder/rc/edit?type=news&is_from_cms=1",
|
|
10297
|
-
cookies:
|
|
10298
|
-
...it,
|
|
10299
|
-
...commonCookies
|
|
10300
|
-
})) || []
|
|
10295
|
+
cookies: validCookies
|
|
10301
10296
|
});
|
|
10302
10297
|
page.setDefaultTimeout(60000);
|
|
10303
10298
|
page.setDefaultNavigationTimeout(60000);
|
|
@@ -11832,6 +11827,8 @@ var __webpack_exports__ = {};
|
|
|
11832
11827
|
}
|
|
11833
11828
|
new Xhshow();
|
|
11834
11829
|
const sessionCheck_xsEncrypt = new Xhshow();
|
|
11830
|
+
let lastEnvLogTime = 0;
|
|
11831
|
+
const ENV_LOG_INTERVAL_MS = 5000;
|
|
11835
11832
|
const SessionCheckResultSchema = schemas_object({
|
|
11836
11833
|
isValidSession: schemas_boolean()
|
|
11837
11834
|
});
|
|
@@ -11896,35 +11893,33 @@ var __webpack_exports__ = {};
|
|
|
11896
11893
|
}, "微信账号有效性检测完成!");
|
|
11897
11894
|
};
|
|
11898
11895
|
const XhsSessionCheck = async (_task, params)=>{
|
|
11899
|
-
const
|
|
11900
|
-
const
|
|
11896
|
+
const now = Date.now();
|
|
11897
|
+
const shouldLogEnv = now - lastEnvLogTime >= ENV_LOG_INTERVAL_MS;
|
|
11898
|
+
if (shouldLogEnv) {
|
|
11899
|
+
lastEnvLogTime = now;
|
|
11900
|
+
_task.logger?.debug("[XhsSessionCheck] 环境信息", {
|
|
11901
|
+
processType: process.type,
|
|
11902
|
+
pid: process.pid,
|
|
11903
|
+
nodeVersion: process.version,
|
|
11904
|
+
platform: process.platform,
|
|
11905
|
+
memoryUsage: {
|
|
11906
|
+
heapUsed: `${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} MB`,
|
|
11907
|
+
heapTotal: `${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} MB`
|
|
11908
|
+
},
|
|
11909
|
+
accountId: params.accountId,
|
|
11910
|
+
hasProxy: !!(params.proxyLoc || params.localIP)
|
|
11911
|
+
});
|
|
11912
|
+
}
|
|
11901
11913
|
const check = {
|
|
11902
11914
|
isValidSession: false,
|
|
11903
11915
|
isValidWebSession: false
|
|
11904
11916
|
};
|
|
11905
|
-
const cookieNames = params.cookies.map((it)=>it.name);
|
|
11906
|
-
logger?.info("[XhsSessionCheck] 开始执行小红书账号有效性检测", {
|
|
11907
|
-
accountId: params.accountId,
|
|
11908
|
-
proxyLoc: params.proxyLoc,
|
|
11909
|
-
localIP: params.localIP,
|
|
11910
|
-
willUseProxyAgent: !!params.localIP,
|
|
11911
|
-
cookieCount: params.cookies.length,
|
|
11912
|
-
cookieNames,
|
|
11913
|
-
hasA1: cookieNames.includes("a1"),
|
|
11914
|
-
hasWebSession: cookieNames.includes("web_session")
|
|
11915
|
-
});
|
|
11916
11917
|
const a1Cookie = params.cookies.find((it)=>"a1" === it.name)?.value;
|
|
11917
|
-
if (!a1Cookie) {
|
|
11918
|
-
|
|
11919
|
-
|
|
11920
|
-
|
|
11921
|
-
|
|
11922
|
-
return {
|
|
11923
|
-
code: 414,
|
|
11924
|
-
message: "账号数据异常,请重新绑定账号后重试。",
|
|
11925
|
-
data: check
|
|
11926
|
-
};
|
|
11927
|
-
}
|
|
11918
|
+
if (!a1Cookie) return {
|
|
11919
|
+
code: 414,
|
|
11920
|
+
message: "账号数据异常,请重新绑定账号后重试。",
|
|
11921
|
+
data: check
|
|
11922
|
+
};
|
|
11928
11923
|
const headers = {
|
|
11929
11924
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
11930
11925
|
referer: "https://creator.xiaohongshu.com/new/home?source=official"
|
|
@@ -11951,7 +11946,31 @@ var __webpack_exports__ = {};
|
|
|
11951
11946
|
if (cookie.name && cookie.value) acc[cookie.name] = cookie.value;
|
|
11952
11947
|
return acc;
|
|
11953
11948
|
}, {});
|
|
11954
|
-
|
|
11949
|
+
let loginBaseXsHeader;
|
|
11950
|
+
try {
|
|
11951
|
+
loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
|
|
11952
|
+
} catch (signError) {
|
|
11953
|
+
_task.logger?.error("[XhsSessionCheck] 签名生成失败 - 环境快照", {
|
|
11954
|
+
accountId: params.accountId,
|
|
11955
|
+
error: signError instanceof Error ? signError.message : String(signError),
|
|
11956
|
+
stack: _task.debug ? signError instanceof Error ? signError.stack : void 0 : void 0,
|
|
11957
|
+
hasA1: !!recordCookie.a1,
|
|
11958
|
+
env: {
|
|
11959
|
+
processType: process.type,
|
|
11960
|
+
memoryUsage: {
|
|
11961
|
+
heapUsed: `${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} MB`,
|
|
11962
|
+
heapTotal: `${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} MB`
|
|
11963
|
+
},
|
|
11964
|
+
hasProxy: !!(params.proxyLoc || params.localIP),
|
|
11965
|
+
timeSinceLastLog: Date.now() - lastEnvLogTime
|
|
11966
|
+
}
|
|
11967
|
+
});
|
|
11968
|
+
return {
|
|
11969
|
+
code: 500,
|
|
11970
|
+
message: "账号签名生成失败,请稍后重试。",
|
|
11971
|
+
data: check
|
|
11972
|
+
};
|
|
11973
|
+
}
|
|
11955
11974
|
const baseInfoStart = Date.now();
|
|
11956
11975
|
const _baseInfo = http.api({
|
|
11957
11976
|
method: "get",
|
|
@@ -11961,75 +11980,44 @@ var __webpack_exports__ = {};
|
|
|
11961
11980
|
}, {
|
|
11962
11981
|
retries: 3,
|
|
11963
11982
|
retryDelay: 20,
|
|
11964
|
-
timeout:
|
|
11965
|
-
}).then((res)=>{
|
|
11966
|
-
logger?.info("[XhsSessionCheck] creator base 接口请求成功", {
|
|
11967
|
-
accountId: params.accountId,
|
|
11968
|
-
duration: Date.now() - baseInfoStart,
|
|
11969
|
-
code: res?.code,
|
|
11970
|
-
msg: res?.msg,
|
|
11971
|
-
proxyInfo: http.proxyInfo
|
|
11972
|
-
});
|
|
11973
|
-
return res;
|
|
11983
|
+
timeout: 5000
|
|
11974
11984
|
}).catch((e)=>{
|
|
11975
|
-
|
|
11985
|
+
const clientTimestamp = Date.now();
|
|
11986
|
+
const serverDate = e?.extra?.serverDate;
|
|
11987
|
+
const serverTimestamp = serverDate ? new Date(serverDate).getTime() : null;
|
|
11988
|
+
const timeDriftMs = serverTimestamp ? clientTimestamp - serverTimestamp : null;
|
|
11989
|
+
_task.logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
|
|
11976
11990
|
accountId: params.accountId,
|
|
11977
11991
|
duration: Date.now() - baseInfoStart,
|
|
11978
11992
|
code: e?.code,
|
|
11979
11993
|
message: e?.message,
|
|
11980
11994
|
data: e?.data,
|
|
11981
11995
|
extra: e?.extra,
|
|
11982
|
-
proxyInfo: http.proxyInfo
|
|
11996
|
+
proxyInfo: http.proxyInfo,
|
|
11997
|
+
clientTimestamp,
|
|
11998
|
+
serverDate,
|
|
11999
|
+
serverTimestamp,
|
|
12000
|
+
timeDriftMs,
|
|
12001
|
+
isLikelyClockDrift: null !== timeDriftMs && Math.abs(timeDriftMs) > 300000
|
|
11983
12002
|
});
|
|
11984
12003
|
return e.data;
|
|
11985
12004
|
});
|
|
11986
|
-
const webSessionStart = Date.now();
|
|
11987
12005
|
const _web_session = http.api({
|
|
11988
12006
|
method: "get",
|
|
11989
12007
|
url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
|
|
11990
12008
|
}, {
|
|
11991
12009
|
retries: 3,
|
|
11992
12010
|
retryDelay: 20,
|
|
11993
|
-
timeout:
|
|
11994
|
-
}).then((res)=>{
|
|
11995
|
-
logger?.info("[XhsSessionCheck] edith unread_count 接口请求成功", {
|
|
11996
|
-
accountId: params.accountId,
|
|
11997
|
-
duration: Date.now() - webSessionStart,
|
|
11998
|
-
code: res?.code,
|
|
11999
|
-
msg: res?.msg,
|
|
12000
|
-
proxyInfo: http.proxyInfo
|
|
12001
|
-
});
|
|
12002
|
-
return res;
|
|
12003
|
-
}).catch((e)=>{
|
|
12004
|
-
logger?.warn("[XhsSessionCheck] edith unread_count 接口请求失败", {
|
|
12005
|
-
accountId: params.accountId,
|
|
12006
|
-
duration: Date.now() - webSessionStart,
|
|
12007
|
-
code: e?.code,
|
|
12008
|
-
message: e?.message,
|
|
12009
|
-
data: e?.data,
|
|
12010
|
-
extra: e?.extra,
|
|
12011
|
-
proxyInfo: http.proxyInfo
|
|
12012
|
-
});
|
|
12013
|
-
throw e;
|
|
12011
|
+
timeout: 5000
|
|
12014
12012
|
});
|
|
12015
12013
|
const [baseInfo, web_session] = await Promise.all([
|
|
12016
12014
|
_baseInfo,
|
|
12017
12015
|
_web_session
|
|
12018
12016
|
]);
|
|
12019
12017
|
if (baseInfo?.code === 0) check.isValidSession = true;
|
|
12020
|
-
if (
|
|
12021
|
-
|
|
12018
|
+
if (web_session?.code === 0) check.isValidWebSession = true;
|
|
12019
|
+
baseInfo?.code, web_session?.code;
|
|
12022
12020
|
const message = `小红书账号有效性检测成功${_task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
12023
|
-
logger?.info("[XhsSessionCheck] 检测完成", {
|
|
12024
|
-
accountId: params.accountId,
|
|
12025
|
-
totalDuration: Date.now() - startedAt,
|
|
12026
|
-
baseInfoCode: baseInfo?.code,
|
|
12027
|
-
webSessionCode: web_session?.code,
|
|
12028
|
-
isValidSession: check.isValidSession,
|
|
12029
|
-
isValidWebSession: check.isValidWebSession,
|
|
12030
|
-
codeAligned: _isSuccess,
|
|
12031
|
-
proxyInfo: http.proxyInfo
|
|
12032
|
-
});
|
|
12033
12021
|
return (0, share_namespaceObject.success)(check, message);
|
|
12034
12022
|
};
|
|
12035
12023
|
const BjhSessionCheck = async (_task, params)=>{
|
|
@@ -14563,7 +14551,10 @@ var __webpack_exports__ = {};
|
|
|
14563
14551
|
task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
14564
14552
|
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
14565
14553
|
if (needsVerification(decision)) {
|
|
14566
|
-
task.logger.
|
|
14554
|
+
task.logger.warn(`检测到需要验证: ${JSON.stringify(decision)}`);
|
|
14555
|
+
task.logger.warn(`验证类型: ${decision?.verify_ways?.join(", ")}`);
|
|
14556
|
+
task.logger.warn(`验证标题: ${decision?.verify_title}`);
|
|
14557
|
+
task.logger.warn(`验证描述: ${decision?.verify_desc}`);
|
|
14567
14558
|
return;
|
|
14568
14559
|
}
|
|
14569
14560
|
if (!response || !response.data) return;
|
|
@@ -14590,38 +14581,116 @@ var __webpack_exports__ = {};
|
|
|
14590
14581
|
});
|
|
14591
14582
|
return (0, share_namespaceObject.response)(0, message, data);
|
|
14592
14583
|
}
|
|
14593
|
-
|
|
14594
|
-
|
|
14595
|
-
|
|
14596
|
-
|
|
14597
|
-
|
|
14584
|
+
let webProtectData;
|
|
14585
|
+
try {
|
|
14586
|
+
webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
|
|
14587
|
+
if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
|
|
14588
|
+
task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
|
|
14589
|
+
return (0, share_namespaceObject.response)(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
|
|
14590
|
+
}
|
|
14591
|
+
} catch (error) {
|
|
14592
|
+
task.logger.error(`解析 webProtectData 失败: ${error}`);
|
|
14593
|
+
return (0, share_namespaceObject.response)(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
|
|
14594
|
+
}
|
|
14595
|
+
let ticket = webProtectData.ticket;
|
|
14596
|
+
let ts_sign = webProtectData.ts_sign;
|
|
14597
|
+
const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
|
|
14598
|
+
if (serverDataCookie) try {
|
|
14599
|
+
const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
|
|
14600
|
+
if (decoded.ticket && decoded.ts_sign) {
|
|
14601
|
+
if (decoded.ticket !== ticket) task.logger.info("使用 cookie 中的最新 ticket(web_protect 已过期)");
|
|
14602
|
+
ticket = decoded.ticket;
|
|
14603
|
+
ts_sign = decoded.ts_sign;
|
|
14604
|
+
}
|
|
14605
|
+
} catch (error) {
|
|
14606
|
+
task.logger.warn(`解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
|
|
14607
|
+
}
|
|
14608
|
+
let ec_privateKey;
|
|
14609
|
+
try {
|
|
14610
|
+
ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
|
|
14611
|
+
if (!ec_privateKey) {
|
|
14612
|
+
task.logger.error("ec_privateKey 为空");
|
|
14613
|
+
return (0, share_namespaceObject.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
|
|
14614
|
+
}
|
|
14615
|
+
} catch (error) {
|
|
14616
|
+
task.logger.error(`解析 ec_privateKey 失败: ${error}`);
|
|
14617
|
+
return (0, share_namespaceObject.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
|
|
14618
|
+
}
|
|
14619
|
+
let certificate;
|
|
14620
|
+
try {
|
|
14621
|
+
certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
|
|
14622
|
+
if (!certificate) {
|
|
14623
|
+
task.logger.error("certificate 为空");
|
|
14624
|
+
return (0, share_namespaceObject.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
|
|
14625
|
+
}
|
|
14626
|
+
} catch (error) {
|
|
14627
|
+
task.logger.error(`解析 certificate 失败: ${error}`);
|
|
14628
|
+
return (0, share_namespaceObject.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
|
|
14629
|
+
}
|
|
14598
14630
|
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
14599
|
-
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket
|
|
14600
|
-
|
|
14601
|
-
|
|
14602
|
-
|
|
14603
|
-
|
|
14604
|
-
|
|
14605
|
-
|
|
14606
|
-
|
|
14607
|
-
|
|
14608
|
-
|
|
14609
|
-
|
|
14631
|
+
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket?.substring(0, 20)}..., ts_sign: ${ts_sign}, ree_public_key: ${ree_public_key?.substring(0, 20)}...`);
|
|
14632
|
+
let bdTicketGuardClientData;
|
|
14633
|
+
try {
|
|
14634
|
+
bdTicketGuardClientData = getBdV2({
|
|
14635
|
+
ticket,
|
|
14636
|
+
ts_sign: ts_sign,
|
|
14637
|
+
ec_privateKey: ec_privateKey,
|
|
14638
|
+
certificate: certificate,
|
|
14639
|
+
bd_ticket_guard_ree_public_key: ree_public_key
|
|
14640
|
+
});
|
|
14641
|
+
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
14642
|
+
task.logger.error(`bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
14643
|
+
return (0, share_namespaceObject.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
14644
|
+
}
|
|
14645
|
+
} catch (error) {
|
|
14646
|
+
task.logger.error(`生成 bdTicketGuardClientData 失败: ${error}`);
|
|
14647
|
+
return (0, share_namespaceObject.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
|
|
14648
|
+
}
|
|
14649
|
+
task.logger.info("bdTicketGuardClientData 生成成功");
|
|
14610
14650
|
const publishQuery = {
|
|
14611
14651
|
...publishParams,
|
|
14612
14652
|
a_bogus: ""
|
|
14613
14653
|
};
|
|
14614
14654
|
const queryString = new URLSearchParams(publishQuery).toString();
|
|
14615
|
-
|
|
14655
|
+
let aBogus;
|
|
14656
|
+
try {
|
|
14657
|
+
aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
|
|
14658
|
+
if (!aBogus || aBogus.length < 10) {
|
|
14659
|
+
task.logger.error(`a_bogus 生成异常,长度过短: ${aBogus}`);
|
|
14660
|
+
return (0, share_namespaceObject.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
|
|
14661
|
+
}
|
|
14662
|
+
task.logger.info(`a_bogus 生成成功: ${aBogus.substring(0, 20)}...`);
|
|
14663
|
+
} catch (error) {
|
|
14664
|
+
task.logger.error(`生成 a_bogus 失败: ${error}`);
|
|
14665
|
+
return (0, share_namespaceObject.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
|
|
14666
|
+
}
|
|
14616
14667
|
publishQuery.a_bogus = aBogus;
|
|
14617
14668
|
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
14618
|
-
|
|
14619
|
-
|
|
14620
|
-
|
|
14621
|
-
|
|
14622
|
-
|
|
14623
|
-
|
|
14624
|
-
|
|
14669
|
+
let csrfToken;
|
|
14670
|
+
try {
|
|
14671
|
+
csrfToken = mock_generateCsrfTokenAdvanced({
|
|
14672
|
+
cookies: params.cookies,
|
|
14673
|
+
url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
|
|
14674
|
+
method: "POST",
|
|
14675
|
+
userAgent
|
|
14676
|
+
});
|
|
14677
|
+
if (!csrfToken || csrfToken.length < 10) {
|
|
14678
|
+
task.logger.error(`csrfToken 生成异常,长度过短: ${csrfToken}`);
|
|
14679
|
+
return (0, share_namespaceObject.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
|
|
14680
|
+
}
|
|
14681
|
+
task.logger.info(`csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
|
|
14682
|
+
} catch (error) {
|
|
14683
|
+
task.logger.error(`生成 csrfToken 失败: ${error}`);
|
|
14684
|
+
return (0, share_namespaceObject.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
|
|
14685
|
+
}
|
|
14686
|
+
let sessionDtrait;
|
|
14687
|
+
try {
|
|
14688
|
+
sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
|
|
14689
|
+
task.logger.info(`sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
|
|
14690
|
+
} catch (error) {
|
|
14691
|
+
task.logger.error(`生成 sessionDtrait 失败: ${error}`);
|
|
14692
|
+
return (0, share_namespaceObject.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
|
|
14693
|
+
}
|
|
14625
14694
|
task.logger.info("发布数据", {
|
|
14626
14695
|
data: JSON.stringify(publishData)
|
|
14627
14696
|
});
|
|
@@ -23228,6 +23297,33 @@ var __webpack_exports__ = {};
|
|
|
23228
23297
|
const encode_mnsv2 = __webpack_require__("./src/utils/xhs_ob/x_s.encoder.js");
|
|
23229
23298
|
const xiaohongshuLogin_rpa_server_scanRetryMaxCount = 60;
|
|
23230
23299
|
const xiaohongshuLogin_rpa_server_waitQrcodeResultMaxTime = 2000 * xiaohongshuLogin_rpa_server_scanRetryMaxCount;
|
|
23300
|
+
async function collectCookiesWithA1(task) {
|
|
23301
|
+
const hasA1 = (cookies)=>cookies.some((c)=>"a1" === c.name && !!c.value);
|
|
23302
|
+
let cookies = await task.steelBrowserContext?.cookies() ?? [];
|
|
23303
|
+
if (hasA1(cookies)) return cookies;
|
|
23304
|
+
task.logger?.warn("[XhsLogin] 首次抓取缺失 a1,尝试补救……");
|
|
23305
|
+
try {
|
|
23306
|
+
const page = task.steelBrowserContext?.pages?.()[0];
|
|
23307
|
+
if (page) {
|
|
23308
|
+
await page.goto("https://www.xiaohongshu.com", {
|
|
23309
|
+
waitUntil: "domcontentloaded",
|
|
23310
|
+
timeout: 15000
|
|
23311
|
+
});
|
|
23312
|
+
for(let i = 0; i < 10; i++){
|
|
23313
|
+
cookies = await task.steelBrowserContext?.cookies() ?? [];
|
|
23314
|
+
if (hasA1(cookies)) {
|
|
23315
|
+
task.logger?.info(`[XhsLogin] a1 补救成功,第 ${i + 1} 次轮询命中`);
|
|
23316
|
+
return cookies;
|
|
23317
|
+
}
|
|
23318
|
+
await new Promise((resolve)=>setTimeout(resolve, 500));
|
|
23319
|
+
}
|
|
23320
|
+
}
|
|
23321
|
+
} catch (err) {
|
|
23322
|
+
task.logger?.warn("[XhsLogin] a1 补救访问主站失败", err);
|
|
23323
|
+
}
|
|
23324
|
+
cookies = await task.steelBrowserContext?.cookies() ?? [];
|
|
23325
|
+
return cookies;
|
|
23326
|
+
}
|
|
23231
23327
|
const xiaohongshuLogin_rpa_server_rpaServer = async (task, params)=>{
|
|
23232
23328
|
const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
|
|
23233
23329
|
const reporter = task.reportService?.reportLoginStatus ?? (()=>Promise.resolve());
|
|
@@ -23428,21 +23524,29 @@ var __webpack_exports__ = {};
|
|
|
23428
23524
|
};
|
|
23429
23525
|
}
|
|
23430
23526
|
case types_ExecutionState.SUCCESS:
|
|
23431
|
-
|
|
23432
|
-
|
|
23433
|
-
|
|
23434
|
-
|
|
23435
|
-
|
|
23436
|
-
}
|
|
23437
|
-
|
|
23438
|
-
|
|
23439
|
-
|
|
23440
|
-
|
|
23441
|
-
|
|
23442
|
-
|
|
23443
|
-
|
|
23444
|
-
}
|
|
23445
|
-
|
|
23527
|
+
{
|
|
23528
|
+
const cookies = await collectCookiesWithA1(task);
|
|
23529
|
+
const hasA1 = cookies.some((c)=>"a1" === c.name && !!c.value);
|
|
23530
|
+
if (!hasA1) task.logger?.warn("[XhsLogin] 登录成功但缺失关键 cookie a1,后续检测可能失败", {
|
|
23531
|
+
cookieNames: cookies.map((c)=>c.name)
|
|
23532
|
+
});
|
|
23533
|
+
const cookieStr = JSON.stringify(cookies);
|
|
23534
|
+
await updateTaskState?.({
|
|
23535
|
+
state: share_namespaceObject.TaskState.SUCCESS,
|
|
23536
|
+
result: {
|
|
23537
|
+
cookie: cookieStr,
|
|
23538
|
+
userInfo: userInfo
|
|
23539
|
+
}
|
|
23540
|
+
});
|
|
23541
|
+
return {
|
|
23542
|
+
code: 0,
|
|
23543
|
+
message: "成功",
|
|
23544
|
+
data: {
|
|
23545
|
+
cookie: cookieStr,
|
|
23546
|
+
userInfo
|
|
23547
|
+
}
|
|
23548
|
+
};
|
|
23549
|
+
}
|
|
23446
23550
|
default:
|
|
23447
23551
|
return {
|
|
23448
23552
|
code: 500,
|
|
@@ -23643,6 +23747,14 @@ var __webpack_exports__ = {};
|
|
|
23643
23747
|
const fileName = (0, share_namespaceObject.getFilenameFromUrl)(url);
|
|
23644
23748
|
const localUrl = await (0, share_namespaceObject.downloadImage)(url, external_node_path_default().join(tmpCachePath, fileName));
|
|
23645
23749
|
const fileBuffer = external_node_fs_default().readFileSync(localUrl);
|
|
23750
|
+
let width = 0;
|
|
23751
|
+
let height = 0;
|
|
23752
|
+
try {
|
|
23753
|
+
const dimensions = external_image_size_default()(fileBuffer);
|
|
23754
|
+
width = dimensions.width ?? 0;
|
|
23755
|
+
height = dimensions.height ?? 0;
|
|
23756
|
+
} catch {}
|
|
23757
|
+
const originSize = fileBuffer.byteLength / 1024;
|
|
23646
23758
|
const MAX_RETRIES = uploadInfos.length;
|
|
23647
23759
|
let attempt = 0;
|
|
23648
23760
|
while(attempt < MAX_RETRIES){
|
|
@@ -23664,7 +23776,10 @@ var __webpack_exports__ = {};
|
|
|
23664
23776
|
});
|
|
23665
23777
|
return {
|
|
23666
23778
|
ossFileId,
|
|
23667
|
-
ossToken
|
|
23779
|
+
ossToken,
|
|
23780
|
+
width,
|
|
23781
|
+
height,
|
|
23782
|
+
originSize
|
|
23668
23783
|
};
|
|
23669
23784
|
} catch (error) {
|
|
23670
23785
|
attempt++;
|
|
@@ -23672,7 +23787,10 @@ var __webpack_exports__ = {};
|
|
|
23672
23787
|
}
|
|
23673
23788
|
return {
|
|
23674
23789
|
ossFileId: "",
|
|
23675
|
-
ossToken: ""
|
|
23790
|
+
ossToken: "",
|
|
23791
|
+
width,
|
|
23792
|
+
height,
|
|
23793
|
+
originSize
|
|
23676
23794
|
};
|
|
23677
23795
|
};
|
|
23678
23796
|
const coverInfos = await Promise.all(params.banners.map((it, idx)=>uploadFile(it, idx)));
|
|
@@ -23737,8 +23855,16 @@ var __webpack_exports__ = {};
|
|
|
23737
23855
|
},
|
|
23738
23856
|
image_info: {
|
|
23739
23857
|
images: coverInfos.map((it)=>({
|
|
23740
|
-
extra_info_json:
|
|
23858
|
+
extra_info_json: JSON.stringify({
|
|
23859
|
+
mimeType: "image/png",
|
|
23860
|
+
image_metadata: {
|
|
23861
|
+
bg_color: "",
|
|
23862
|
+
origin_size: it.originSize
|
|
23863
|
+
}
|
|
23864
|
+
}),
|
|
23741
23865
|
file_id: it.ossFileId,
|
|
23866
|
+
width: it.width,
|
|
23867
|
+
height: it.height,
|
|
23742
23868
|
metadata: {
|
|
23743
23869
|
source: -1
|
|
23744
23870
|
},
|