@iflyrpa/actions 4.0.0-beta.6 → 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 +279 -82
- package/dist/bundle.js.map +1 -1
- package/dist/index.js +278 -81
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +278 -81
- 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,6 +11893,23 @@ var __webpack_exports__ = {};
|
|
|
11896
11893
|
}, "微信账号有效性检测完成!");
|
|
11897
11894
|
};
|
|
11898
11895
|
const XhsSessionCheck = async (_task, params)=>{
|
|
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
|
+
}
|
|
11899
11913
|
const check = {
|
|
11900
11914
|
isValidSession: false,
|
|
11901
11915
|
isValidWebSession: false
|
|
@@ -11932,7 +11946,32 @@ var __webpack_exports__ = {};
|
|
|
11932
11946
|
if (cookie.name && cookie.value) acc[cookie.name] = cookie.value;
|
|
11933
11947
|
return acc;
|
|
11934
11948
|
}, {});
|
|
11935
|
-
|
|
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
|
+
}
|
|
11974
|
+
const baseInfoStart = Date.now();
|
|
11936
11975
|
const _baseInfo = http.api({
|
|
11937
11976
|
method: "get",
|
|
11938
11977
|
baseURL: "https://creator.xiaohongshu.com",
|
|
@@ -11941,23 +11980,43 @@ var __webpack_exports__ = {};
|
|
|
11941
11980
|
}, {
|
|
11942
11981
|
retries: 3,
|
|
11943
11982
|
retryDelay: 20,
|
|
11944
|
-
timeout:
|
|
11945
|
-
}).catch((e)=>
|
|
11983
|
+
timeout: 5000
|
|
11984
|
+
}).catch((e)=>{
|
|
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 接口请求失败", {
|
|
11990
|
+
accountId: params.accountId,
|
|
11991
|
+
duration: Date.now() - baseInfoStart,
|
|
11992
|
+
code: e?.code,
|
|
11993
|
+
message: e?.message,
|
|
11994
|
+
data: e?.data,
|
|
11995
|
+
extra: e?.extra,
|
|
11996
|
+
proxyInfo: http.proxyInfo,
|
|
11997
|
+
clientTimestamp,
|
|
11998
|
+
serverDate,
|
|
11999
|
+
serverTimestamp,
|
|
12000
|
+
timeDriftMs,
|
|
12001
|
+
isLikelyClockDrift: null !== timeDriftMs && Math.abs(timeDriftMs) > 300000
|
|
12002
|
+
});
|
|
12003
|
+
return e.data;
|
|
12004
|
+
});
|
|
11946
12005
|
const _web_session = http.api({
|
|
11947
12006
|
method: "get",
|
|
11948
12007
|
url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
|
|
11949
12008
|
}, {
|
|
11950
12009
|
retries: 3,
|
|
11951
12010
|
retryDelay: 20,
|
|
11952
|
-
timeout:
|
|
12011
|
+
timeout: 5000
|
|
11953
12012
|
});
|
|
11954
12013
|
const [baseInfo, web_session] = await Promise.all([
|
|
11955
12014
|
_baseInfo,
|
|
11956
12015
|
_web_session
|
|
11957
12016
|
]);
|
|
11958
12017
|
if (baseInfo?.code === 0) check.isValidSession = true;
|
|
11959
|
-
if (
|
|
11960
|
-
baseInfo?.code, web_session
|
|
12018
|
+
if (web_session?.code === 0) check.isValidWebSession = true;
|
|
12019
|
+
baseInfo?.code, web_session?.code;
|
|
11961
12020
|
const message = `小红书账号有效性检测成功${_task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
11962
12021
|
return (0, share_namespaceObject.success)(check, message);
|
|
11963
12022
|
};
|
|
@@ -14492,7 +14551,10 @@ var __webpack_exports__ = {};
|
|
|
14492
14551
|
task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
14493
14552
|
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
14494
14553
|
if (needsVerification(decision)) {
|
|
14495
|
-
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}`);
|
|
14496
14558
|
return;
|
|
14497
14559
|
}
|
|
14498
14560
|
if (!response || !response.data) return;
|
|
@@ -14519,38 +14581,116 @@ var __webpack_exports__ = {};
|
|
|
14519
14581
|
});
|
|
14520
14582
|
return (0, share_namespaceObject.response)(0, message, data);
|
|
14521
14583
|
}
|
|
14522
|
-
|
|
14523
|
-
|
|
14524
|
-
|
|
14525
|
-
|
|
14526
|
-
|
|
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
|
+
}
|
|
14527
14630
|
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
14528
|
-
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket
|
|
14529
|
-
|
|
14530
|
-
|
|
14531
|
-
|
|
14532
|
-
|
|
14533
|
-
|
|
14534
|
-
|
|
14535
|
-
|
|
14536
|
-
|
|
14537
|
-
|
|
14538
|
-
|
|
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 生成成功");
|
|
14539
14650
|
const publishQuery = {
|
|
14540
14651
|
...publishParams,
|
|
14541
14652
|
a_bogus: ""
|
|
14542
14653
|
};
|
|
14543
14654
|
const queryString = new URLSearchParams(publishQuery).toString();
|
|
14544
|
-
|
|
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
|
+
}
|
|
14545
14667
|
publishQuery.a_bogus = aBogus;
|
|
14546
14668
|
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
14547
|
-
|
|
14548
|
-
|
|
14549
|
-
|
|
14550
|
-
|
|
14551
|
-
|
|
14552
|
-
|
|
14553
|
-
|
|
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
|
+
}
|
|
14554
14694
|
task.logger.info("发布数据", {
|
|
14555
14695
|
data: JSON.stringify(publishData)
|
|
14556
14696
|
});
|
|
@@ -23157,6 +23297,33 @@ var __webpack_exports__ = {};
|
|
|
23157
23297
|
const encode_mnsv2 = __webpack_require__("./src/utils/xhs_ob/x_s.encoder.js");
|
|
23158
23298
|
const xiaohongshuLogin_rpa_server_scanRetryMaxCount = 60;
|
|
23159
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
|
+
}
|
|
23160
23327
|
const xiaohongshuLogin_rpa_server_rpaServer = async (task, params)=>{
|
|
23161
23328
|
const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
|
|
23162
23329
|
const reporter = task.reportService?.reportLoginStatus ?? (()=>Promise.resolve());
|
|
@@ -23357,21 +23524,29 @@ var __webpack_exports__ = {};
|
|
|
23357
23524
|
};
|
|
23358
23525
|
}
|
|
23359
23526
|
case types_ExecutionState.SUCCESS:
|
|
23360
|
-
|
|
23361
|
-
|
|
23362
|
-
|
|
23363
|
-
|
|
23364
|
-
|
|
23365
|
-
}
|
|
23366
|
-
|
|
23367
|
-
|
|
23368
|
-
|
|
23369
|
-
|
|
23370
|
-
|
|
23371
|
-
|
|
23372
|
-
|
|
23373
|
-
}
|
|
23374
|
-
|
|
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
|
+
}
|
|
23375
23550
|
default:
|
|
23376
23551
|
return {
|
|
23377
23552
|
code: 500,
|
|
@@ -23572,6 +23747,14 @@ var __webpack_exports__ = {};
|
|
|
23572
23747
|
const fileName = (0, share_namespaceObject.getFilenameFromUrl)(url);
|
|
23573
23748
|
const localUrl = await (0, share_namespaceObject.downloadImage)(url, external_node_path_default().join(tmpCachePath, fileName));
|
|
23574
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;
|
|
23575
23758
|
const MAX_RETRIES = uploadInfos.length;
|
|
23576
23759
|
let attempt = 0;
|
|
23577
23760
|
while(attempt < MAX_RETRIES){
|
|
@@ -23593,7 +23776,10 @@ var __webpack_exports__ = {};
|
|
|
23593
23776
|
});
|
|
23594
23777
|
return {
|
|
23595
23778
|
ossFileId,
|
|
23596
|
-
ossToken
|
|
23779
|
+
ossToken,
|
|
23780
|
+
width,
|
|
23781
|
+
height,
|
|
23782
|
+
originSize
|
|
23597
23783
|
};
|
|
23598
23784
|
} catch (error) {
|
|
23599
23785
|
attempt++;
|
|
@@ -23601,7 +23787,10 @@ var __webpack_exports__ = {};
|
|
|
23601
23787
|
}
|
|
23602
23788
|
return {
|
|
23603
23789
|
ossFileId: "",
|
|
23604
|
-
ossToken: ""
|
|
23790
|
+
ossToken: "",
|
|
23791
|
+
width,
|
|
23792
|
+
height,
|
|
23793
|
+
originSize
|
|
23605
23794
|
};
|
|
23606
23795
|
};
|
|
23607
23796
|
const coverInfos = await Promise.all(params.banners.map((it, idx)=>uploadFile(it, idx)));
|
|
@@ -23666,8 +23855,16 @@ var __webpack_exports__ = {};
|
|
|
23666
23855
|
},
|
|
23667
23856
|
image_info: {
|
|
23668
23857
|
images: coverInfos.map((it)=>({
|
|
23669
|
-
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
|
+
}),
|
|
23670
23865
|
file_id: it.ossFileId,
|
|
23866
|
+
width: it.width,
|
|
23867
|
+
height: it.height,
|
|
23671
23868
|
metadata: {
|
|
23672
23869
|
source: -1
|
|
23673
23870
|
},
|