@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/bundle.js
CHANGED
|
@@ -8733,8 +8733,10 @@ var __webpack_exports__ = {};
|
|
|
8733
8733
|
navigator: ()=>_navigator,
|
|
8734
8734
|
origin: ()=>utils_origin
|
|
8735
8735
|
});
|
|
8736
|
-
var package_namespaceObject =
|
|
8737
|
-
|
|
8736
|
+
var package_namespaceObject = {
|
|
8737
|
+
i8: "0.1.2"
|
|
8738
|
+
};
|
|
8739
|
+
var package_namespaceObject_0 = JSON.parse('{"i8":"4.0.1-beta.0"}');
|
|
8738
8740
|
const external_node_fs_namespaceObject = require("node:fs");
|
|
8739
8741
|
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
8740
8742
|
const external_node_http_namespaceObject = require("node:http");
|
|
@@ -23366,7 +23368,8 @@ var __webpack_exports__ = {};
|
|
|
23366
23368
|
url: error.config?.url,
|
|
23367
23369
|
isProxyRequest: !!(error.config && (error.config.httpAgent || error.config.httpsAgent)),
|
|
23368
23370
|
params: error.config?.params,
|
|
23369
|
-
data: error.config?.data
|
|
23371
|
+
data: error.config?.data,
|
|
23372
|
+
serverDate: error.response?.headers?.date
|
|
23370
23373
|
}
|
|
23371
23374
|
};
|
|
23372
23375
|
if (foundError) Object.assign(errorResponse, foundError);
|
|
@@ -23444,7 +23447,7 @@ var __webpack_exports__ = {};
|
|
|
23444
23447
|
try {
|
|
23445
23448
|
this.proxyInfo = agent ? `${agent.ip}:${agent.port}` : void 0;
|
|
23446
23449
|
const controller = new AbortController();
|
|
23447
|
-
const timeoutId = setTimeout(()=>controller.abort(), reqTimeout);
|
|
23450
|
+
const timeoutId = setTimeout(()=>controller.abort(), reqTimeout + 500);
|
|
23448
23451
|
const response = await this.apiClient({
|
|
23449
23452
|
...config,
|
|
23450
23453
|
timeout: reqTimeout,
|
|
@@ -23468,7 +23471,7 @@ var __webpack_exports__ = {};
|
|
|
23468
23471
|
599
|
|
23469
23472
|
].includes(handledError.code);
|
|
23470
23473
|
if (Rtimes < retries && isRetry) {
|
|
23471
|
-
this.logger?.info(`进入第${Rtimes + 1}
|
|
23474
|
+
this.logger?.info(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}`);
|
|
23472
23475
|
await new Promise((resolve)=>setTimeout(resolve, retryDelay));
|
|
23473
23476
|
return sessionRt(Rtimes + 1);
|
|
23474
23477
|
}
|
|
@@ -28653,23 +28656,26 @@ var __webpack_exports__ = {};
|
|
|
28653
28656
|
};
|
|
28654
28657
|
}
|
|
28655
28658
|
case types_ExecutionState.SUCCESS:
|
|
28656
|
-
|
|
28657
|
-
|
|
28658
|
-
|
|
28659
|
-
|
|
28660
|
-
|
|
28661
|
-
|
|
28662
|
-
|
|
28663
|
-
|
|
28664
|
-
|
|
28665
|
-
|
|
28666
|
-
|
|
28667
|
-
|
|
28668
|
-
|
|
28669
|
-
|
|
28670
|
-
|
|
28671
|
-
|
|
28672
|
-
|
|
28659
|
+
{
|
|
28660
|
+
const cookie = JSON.stringify(await task.steelBrowserContext?.cookies());
|
|
28661
|
+
await updateTaskState?.({
|
|
28662
|
+
state: types_TaskState.SUCCESS,
|
|
28663
|
+
result: {
|
|
28664
|
+
cookie,
|
|
28665
|
+
token,
|
|
28666
|
+
userInfo: userInfo
|
|
28667
|
+
}
|
|
28668
|
+
});
|
|
28669
|
+
return {
|
|
28670
|
+
code: 0,
|
|
28671
|
+
message: "成功",
|
|
28672
|
+
data: {
|
|
28673
|
+
cookie,
|
|
28674
|
+
token,
|
|
28675
|
+
userInfo
|
|
28676
|
+
}
|
|
28677
|
+
};
|
|
28678
|
+
}
|
|
28673
28679
|
default:
|
|
28674
28680
|
return {
|
|
28675
28681
|
code: 500,
|
|
@@ -29026,20 +29032,11 @@ var __webpack_exports__ = {};
|
|
|
29026
29032
|
};
|
|
29027
29033
|
const rpa_rpaAction = async (task, params)=>{
|
|
29028
29034
|
const tmpCachePath = task.getTmpPath();
|
|
29029
|
-
const
|
|
29030
|
-
path: "/",
|
|
29031
|
-
secure: true,
|
|
29032
|
-
domain: "baijiahao.baidu.com",
|
|
29033
|
-
url: "https://baijiahao.baidu.com",
|
|
29034
|
-
httpOnly: true
|
|
29035
|
-
};
|
|
29035
|
+
const validCookies = (params.cookies || []).filter((it)=>it.name && it.value && "undefined" !== it.value);
|
|
29036
29036
|
const page = await task.createPage({
|
|
29037
29037
|
show: task.debug,
|
|
29038
29038
|
url: params.url || "https://baijiahao.baidu.com/builder/rc/edit?type=news&is_from_cms=1",
|
|
29039
|
-
cookies:
|
|
29040
|
-
...it,
|
|
29041
|
-
...commonCookies
|
|
29042
|
-
})) || []
|
|
29039
|
+
cookies: validCookies
|
|
29043
29040
|
});
|
|
29044
29041
|
page.setDefaultTimeout(60000);
|
|
29045
29042
|
page.setDefaultNavigationTimeout(60000);
|
|
@@ -30572,6 +30569,8 @@ var __webpack_exports__ = {};
|
|
|
30572
30569
|
}
|
|
30573
30570
|
new Xhshow();
|
|
30574
30571
|
const sessionCheck_xsEncrypt = new Xhshow();
|
|
30572
|
+
let lastEnvLogTime = 0;
|
|
30573
|
+
const ENV_LOG_INTERVAL_MS = 5000;
|
|
30575
30574
|
const SessionCheckResultSchema = classic_schemas_object({
|
|
30576
30575
|
isValidSession: classic_schemas_boolean()
|
|
30577
30576
|
});
|
|
@@ -30636,35 +30635,33 @@ var __webpack_exports__ = {};
|
|
|
30636
30635
|
}, "微信账号有效性检测完成!");
|
|
30637
30636
|
};
|
|
30638
30637
|
const XhsSessionCheck = async (_task, params)=>{
|
|
30639
|
-
const
|
|
30640
|
-
const
|
|
30638
|
+
const now = Date.now();
|
|
30639
|
+
const shouldLogEnv = now - lastEnvLogTime >= ENV_LOG_INTERVAL_MS;
|
|
30640
|
+
if (shouldLogEnv) {
|
|
30641
|
+
lastEnvLogTime = now;
|
|
30642
|
+
_task.logger?.debug("[XhsSessionCheck] 环境信息", {
|
|
30643
|
+
processType: process.type,
|
|
30644
|
+
pid: process.pid,
|
|
30645
|
+
nodeVersion: process.version,
|
|
30646
|
+
platform: process.platform,
|
|
30647
|
+
memoryUsage: {
|
|
30648
|
+
heapUsed: `${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} MB`,
|
|
30649
|
+
heapTotal: `${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} MB`
|
|
30650
|
+
},
|
|
30651
|
+
accountId: params.accountId,
|
|
30652
|
+
hasProxy: !!(params.proxyLoc || params.localIP)
|
|
30653
|
+
});
|
|
30654
|
+
}
|
|
30641
30655
|
const check = {
|
|
30642
30656
|
isValidSession: false,
|
|
30643
30657
|
isValidWebSession: false
|
|
30644
30658
|
};
|
|
30645
|
-
const cookieNames = params.cookies.map((it)=>it.name);
|
|
30646
|
-
logger?.info("[XhsSessionCheck] 开始执行小红书账号有效性检测", {
|
|
30647
|
-
accountId: params.accountId,
|
|
30648
|
-
proxyLoc: params.proxyLoc,
|
|
30649
|
-
localIP: params.localIP,
|
|
30650
|
-
willUseProxyAgent: !!params.localIP,
|
|
30651
|
-
cookieCount: params.cookies.length,
|
|
30652
|
-
cookieNames,
|
|
30653
|
-
hasA1: cookieNames.includes("a1"),
|
|
30654
|
-
hasWebSession: cookieNames.includes("web_session")
|
|
30655
|
-
});
|
|
30656
30659
|
const a1Cookie = params.cookies.find((it)=>"a1" === it.name)?.value;
|
|
30657
|
-
if (!a1Cookie) {
|
|
30658
|
-
|
|
30659
|
-
|
|
30660
|
-
|
|
30661
|
-
|
|
30662
|
-
return {
|
|
30663
|
-
code: 414,
|
|
30664
|
-
message: "账号数据异常,请重新绑定账号后重试。",
|
|
30665
|
-
data: check
|
|
30666
|
-
};
|
|
30667
|
-
}
|
|
30660
|
+
if (!a1Cookie) return {
|
|
30661
|
+
code: 414,
|
|
30662
|
+
message: "账号数据异常,请重新绑定账号后重试。",
|
|
30663
|
+
data: check
|
|
30664
|
+
};
|
|
30668
30665
|
const headers = {
|
|
30669
30666
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
30670
30667
|
referer: "https://creator.xiaohongshu.com/new/home?source=official"
|
|
@@ -30691,7 +30688,31 @@ var __webpack_exports__ = {};
|
|
|
30691
30688
|
if (cookie.name && cookie.value) acc[cookie.name] = cookie.value;
|
|
30692
30689
|
return acc;
|
|
30693
30690
|
}, {});
|
|
30694
|
-
|
|
30691
|
+
let loginBaseXsHeader;
|
|
30692
|
+
try {
|
|
30693
|
+
loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
|
|
30694
|
+
} catch (signError) {
|
|
30695
|
+
_task.logger?.error("[XhsSessionCheck] 签名生成失败 - 环境快照", {
|
|
30696
|
+
accountId: params.accountId,
|
|
30697
|
+
error: signError instanceof Error ? signError.message : String(signError),
|
|
30698
|
+
stack: _task.debug ? signError instanceof Error ? signError.stack : void 0 : void 0,
|
|
30699
|
+
hasA1: !!recordCookie.a1,
|
|
30700
|
+
env: {
|
|
30701
|
+
processType: process.type,
|
|
30702
|
+
memoryUsage: {
|
|
30703
|
+
heapUsed: `${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} MB`,
|
|
30704
|
+
heapTotal: `${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} MB`
|
|
30705
|
+
},
|
|
30706
|
+
hasProxy: !!(params.proxyLoc || params.localIP),
|
|
30707
|
+
timeSinceLastLog: Date.now() - lastEnvLogTime
|
|
30708
|
+
}
|
|
30709
|
+
});
|
|
30710
|
+
return {
|
|
30711
|
+
code: 500,
|
|
30712
|
+
message: "账号签名生成失败,请稍后重试。",
|
|
30713
|
+
data: check
|
|
30714
|
+
};
|
|
30715
|
+
}
|
|
30695
30716
|
const baseInfoStart = Date.now();
|
|
30696
30717
|
const _baseInfo = http.api({
|
|
30697
30718
|
method: "get",
|
|
@@ -30701,75 +30722,44 @@ var __webpack_exports__ = {};
|
|
|
30701
30722
|
}, {
|
|
30702
30723
|
retries: 3,
|
|
30703
30724
|
retryDelay: 20,
|
|
30704
|
-
timeout:
|
|
30705
|
-
}).then((res)=>{
|
|
30706
|
-
logger?.info("[XhsSessionCheck] creator base 接口请求成功", {
|
|
30707
|
-
accountId: params.accountId,
|
|
30708
|
-
duration: Date.now() - baseInfoStart,
|
|
30709
|
-
code: res?.code,
|
|
30710
|
-
msg: res?.msg,
|
|
30711
|
-
proxyInfo: http.proxyInfo
|
|
30712
|
-
});
|
|
30713
|
-
return res;
|
|
30725
|
+
timeout: 5000
|
|
30714
30726
|
}).catch((e)=>{
|
|
30715
|
-
|
|
30727
|
+
const clientTimestamp = Date.now();
|
|
30728
|
+
const serverDate = e?.extra?.serverDate;
|
|
30729
|
+
const serverTimestamp = serverDate ? new Date(serverDate).getTime() : null;
|
|
30730
|
+
const timeDriftMs = serverTimestamp ? clientTimestamp - serverTimestamp : null;
|
|
30731
|
+
_task.logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
|
|
30716
30732
|
accountId: params.accountId,
|
|
30717
30733
|
duration: Date.now() - baseInfoStart,
|
|
30718
30734
|
code: e?.code,
|
|
30719
30735
|
message: e?.message,
|
|
30720
30736
|
data: e?.data,
|
|
30721
30737
|
extra: e?.extra,
|
|
30722
|
-
proxyInfo: http.proxyInfo
|
|
30738
|
+
proxyInfo: http.proxyInfo,
|
|
30739
|
+
clientTimestamp,
|
|
30740
|
+
serverDate,
|
|
30741
|
+
serverTimestamp,
|
|
30742
|
+
timeDriftMs,
|
|
30743
|
+
isLikelyClockDrift: null !== timeDriftMs && Math.abs(timeDriftMs) > 300000
|
|
30723
30744
|
});
|
|
30724
30745
|
return e.data;
|
|
30725
30746
|
});
|
|
30726
|
-
const webSessionStart = Date.now();
|
|
30727
30747
|
const _web_session = http.api({
|
|
30728
30748
|
method: "get",
|
|
30729
30749
|
url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
|
|
30730
30750
|
}, {
|
|
30731
30751
|
retries: 3,
|
|
30732
30752
|
retryDelay: 20,
|
|
30733
|
-
timeout:
|
|
30734
|
-
}).then((res)=>{
|
|
30735
|
-
logger?.info("[XhsSessionCheck] edith unread_count 接口请求成功", {
|
|
30736
|
-
accountId: params.accountId,
|
|
30737
|
-
duration: Date.now() - webSessionStart,
|
|
30738
|
-
code: res?.code,
|
|
30739
|
-
msg: res?.msg,
|
|
30740
|
-
proxyInfo: http.proxyInfo
|
|
30741
|
-
});
|
|
30742
|
-
return res;
|
|
30743
|
-
}).catch((e)=>{
|
|
30744
|
-
logger?.warn("[XhsSessionCheck] edith unread_count 接口请求失败", {
|
|
30745
|
-
accountId: params.accountId,
|
|
30746
|
-
duration: Date.now() - webSessionStart,
|
|
30747
|
-
code: e?.code,
|
|
30748
|
-
message: e?.message,
|
|
30749
|
-
data: e?.data,
|
|
30750
|
-
extra: e?.extra,
|
|
30751
|
-
proxyInfo: http.proxyInfo
|
|
30752
|
-
});
|
|
30753
|
-
throw e;
|
|
30753
|
+
timeout: 5000
|
|
30754
30754
|
});
|
|
30755
30755
|
const [baseInfo, web_session] = await Promise.all([
|
|
30756
30756
|
_baseInfo,
|
|
30757
30757
|
_web_session
|
|
30758
30758
|
]);
|
|
30759
30759
|
if (baseInfo?.code === 0) check.isValidSession = true;
|
|
30760
|
-
if (
|
|
30761
|
-
|
|
30760
|
+
if (web_session?.code === 0) check.isValidWebSession = true;
|
|
30761
|
+
baseInfo?.code, web_session?.code;
|
|
30762
30762
|
const message = `小红书账号有效性检测成功${_task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
30763
|
-
logger?.info("[XhsSessionCheck] 检测完成", {
|
|
30764
|
-
accountId: params.accountId,
|
|
30765
|
-
totalDuration: Date.now() - startedAt,
|
|
30766
|
-
baseInfoCode: baseInfo?.code,
|
|
30767
|
-
webSessionCode: web_session?.code,
|
|
30768
|
-
isValidSession: check.isValidSession,
|
|
30769
|
-
isValidWebSession: check.isValidWebSession,
|
|
30770
|
-
codeAligned: _isSuccess,
|
|
30771
|
-
proxyInfo: http.proxyInfo
|
|
30772
|
-
});
|
|
30773
30763
|
return success(check, message);
|
|
30774
30764
|
};
|
|
30775
30765
|
const BjhSessionCheck = async (_task, params)=>{
|
|
@@ -34789,7 +34779,10 @@ var __webpack_exports__ = {};
|
|
|
34789
34779
|
task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
34790
34780
|
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
34791
34781
|
if (needsVerification(decision)) {
|
|
34792
|
-
task.logger.
|
|
34782
|
+
task.logger.warn(`检测到需要验证: ${JSON.stringify(decision)}`);
|
|
34783
|
+
task.logger.warn(`验证类型: ${decision?.verify_ways?.join(", ")}`);
|
|
34784
|
+
task.logger.warn(`验证标题: ${decision?.verify_title}`);
|
|
34785
|
+
task.logger.warn(`验证描述: ${decision?.verify_desc}`);
|
|
34793
34786
|
return;
|
|
34794
34787
|
}
|
|
34795
34788
|
if (!response || !response.data) return;
|
|
@@ -34816,38 +34809,116 @@ var __webpack_exports__ = {};
|
|
|
34816
34809
|
});
|
|
34817
34810
|
return utils_response(0, message, data);
|
|
34818
34811
|
}
|
|
34819
|
-
|
|
34820
|
-
|
|
34821
|
-
|
|
34822
|
-
|
|
34823
|
-
|
|
34812
|
+
let webProtectData;
|
|
34813
|
+
try {
|
|
34814
|
+
webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
|
|
34815
|
+
if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
|
|
34816
|
+
task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
|
|
34817
|
+
return utils_response(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
|
|
34818
|
+
}
|
|
34819
|
+
} catch (error) {
|
|
34820
|
+
task.logger.error(`解析 webProtectData 失败: ${error}`);
|
|
34821
|
+
return utils_response(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
|
|
34822
|
+
}
|
|
34823
|
+
let ticket = webProtectData.ticket;
|
|
34824
|
+
let ts_sign = webProtectData.ts_sign;
|
|
34825
|
+
const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
|
|
34826
|
+
if (serverDataCookie) try {
|
|
34827
|
+
const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
|
|
34828
|
+
if (decoded.ticket && decoded.ts_sign) {
|
|
34829
|
+
if (decoded.ticket !== ticket) task.logger.info("使用 cookie 中的最新 ticket(web_protect 已过期)");
|
|
34830
|
+
ticket = decoded.ticket;
|
|
34831
|
+
ts_sign = decoded.ts_sign;
|
|
34832
|
+
}
|
|
34833
|
+
} catch (error) {
|
|
34834
|
+
task.logger.warn(`解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
|
|
34835
|
+
}
|
|
34836
|
+
let ec_privateKey;
|
|
34837
|
+
try {
|
|
34838
|
+
ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
|
|
34839
|
+
if (!ec_privateKey) {
|
|
34840
|
+
task.logger.error("ec_privateKey 为空");
|
|
34841
|
+
return utils_response(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
|
|
34842
|
+
}
|
|
34843
|
+
} catch (error) {
|
|
34844
|
+
task.logger.error(`解析 ec_privateKey 失败: ${error}`);
|
|
34845
|
+
return utils_response(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
|
|
34846
|
+
}
|
|
34847
|
+
let certificate;
|
|
34848
|
+
try {
|
|
34849
|
+
certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
|
|
34850
|
+
if (!certificate) {
|
|
34851
|
+
task.logger.error("certificate 为空");
|
|
34852
|
+
return utils_response(414, "安全参数 certificate 缺失,请重新获取后重试", "");
|
|
34853
|
+
}
|
|
34854
|
+
} catch (error) {
|
|
34855
|
+
task.logger.error(`解析 certificate 失败: ${error}`);
|
|
34856
|
+
return utils_response(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
|
|
34857
|
+
}
|
|
34824
34858
|
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
34825
|
-
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket
|
|
34826
|
-
|
|
34827
|
-
|
|
34828
|
-
|
|
34829
|
-
|
|
34830
|
-
|
|
34831
|
-
|
|
34832
|
-
|
|
34833
|
-
|
|
34834
|
-
|
|
34835
|
-
|
|
34859
|
+
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket?.substring(0, 20)}..., ts_sign: ${ts_sign}, ree_public_key: ${ree_public_key?.substring(0, 20)}...`);
|
|
34860
|
+
let bdTicketGuardClientData;
|
|
34861
|
+
try {
|
|
34862
|
+
bdTicketGuardClientData = getBdV2({
|
|
34863
|
+
ticket,
|
|
34864
|
+
ts_sign: ts_sign,
|
|
34865
|
+
ec_privateKey: ec_privateKey,
|
|
34866
|
+
certificate: certificate,
|
|
34867
|
+
bd_ticket_guard_ree_public_key: ree_public_key
|
|
34868
|
+
});
|
|
34869
|
+
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
34870
|
+
task.logger.error(`bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
34871
|
+
return utils_response(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
34872
|
+
}
|
|
34873
|
+
} catch (error) {
|
|
34874
|
+
task.logger.error(`生成 bdTicketGuardClientData 失败: ${error}`);
|
|
34875
|
+
return utils_response(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
|
|
34876
|
+
}
|
|
34877
|
+
task.logger.info("bdTicketGuardClientData 生成成功");
|
|
34836
34878
|
const publishQuery = {
|
|
34837
34879
|
...publishParams,
|
|
34838
34880
|
a_bogus: ""
|
|
34839
34881
|
};
|
|
34840
34882
|
const queryString = new URLSearchParams(publishQuery).toString();
|
|
34841
|
-
|
|
34883
|
+
let aBogus;
|
|
34884
|
+
try {
|
|
34885
|
+
aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
|
|
34886
|
+
if (!aBogus || aBogus.length < 10) {
|
|
34887
|
+
task.logger.error(`a_bogus 生成异常,长度过短: ${aBogus}`);
|
|
34888
|
+
return utils_response(414, "安全参数 a_bogus 生成失败,请重试", "");
|
|
34889
|
+
}
|
|
34890
|
+
task.logger.info(`a_bogus 生成成功: ${aBogus.substring(0, 20)}...`);
|
|
34891
|
+
} catch (error) {
|
|
34892
|
+
task.logger.error(`生成 a_bogus 失败: ${error}`);
|
|
34893
|
+
return utils_response(414, "安全参数 a_bogus 生成异常,请重试", "");
|
|
34894
|
+
}
|
|
34842
34895
|
publishQuery.a_bogus = aBogus;
|
|
34843
34896
|
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
34844
|
-
|
|
34845
|
-
|
|
34846
|
-
|
|
34847
|
-
|
|
34848
|
-
|
|
34849
|
-
|
|
34850
|
-
|
|
34897
|
+
let csrfToken;
|
|
34898
|
+
try {
|
|
34899
|
+
csrfToken = mock_generateCsrfTokenAdvanced({
|
|
34900
|
+
cookies: params.cookies,
|
|
34901
|
+
url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
|
|
34902
|
+
method: "POST",
|
|
34903
|
+
userAgent
|
|
34904
|
+
});
|
|
34905
|
+
if (!csrfToken || csrfToken.length < 10) {
|
|
34906
|
+
task.logger.error(`csrfToken 生成异常,长度过短: ${csrfToken}`);
|
|
34907
|
+
return utils_response(414, "安全参数 csrfToken 生成失败,请重试", "");
|
|
34908
|
+
}
|
|
34909
|
+
task.logger.info(`csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
|
|
34910
|
+
} catch (error) {
|
|
34911
|
+
task.logger.error(`生成 csrfToken 失败: ${error}`);
|
|
34912
|
+
return utils_response(414, "安全参数 csrfToken 生成异常,请重试", "");
|
|
34913
|
+
}
|
|
34914
|
+
let sessionDtrait;
|
|
34915
|
+
try {
|
|
34916
|
+
sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
|
|
34917
|
+
task.logger.info(`sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
|
|
34918
|
+
} catch (error) {
|
|
34919
|
+
task.logger.error(`生成 sessionDtrait 失败: ${error}`);
|
|
34920
|
+
return utils_response(414, "安全参数 sessionDtrait 生成异常,请重试", "");
|
|
34921
|
+
}
|
|
34851
34922
|
task.logger.info("发布数据", {
|
|
34852
34923
|
data: JSON.stringify(publishData)
|
|
34853
34924
|
});
|
|
@@ -43454,6 +43525,33 @@ var __webpack_exports__ = {};
|
|
|
43454
43525
|
const encode_mnsv2 = __webpack_require__("./src/utils/xhs_ob/x_s.encoder.js");
|
|
43455
43526
|
const xiaohongshuLogin_rpa_server_scanRetryMaxCount = 60;
|
|
43456
43527
|
const xiaohongshuLogin_rpa_server_waitQrcodeResultMaxTime = 2000 * xiaohongshuLogin_rpa_server_scanRetryMaxCount;
|
|
43528
|
+
async function collectCookiesWithA1(task) {
|
|
43529
|
+
const hasA1 = (cookies)=>cookies.some((c)=>"a1" === c.name && !!c.value);
|
|
43530
|
+
let cookies = await task.steelBrowserContext?.cookies() ?? [];
|
|
43531
|
+
if (hasA1(cookies)) return cookies;
|
|
43532
|
+
task.logger?.warn("[XhsLogin] 首次抓取缺失 a1,尝试补救……");
|
|
43533
|
+
try {
|
|
43534
|
+
const page = task.steelBrowserContext?.pages?.()[0];
|
|
43535
|
+
if (page) {
|
|
43536
|
+
await page.goto("https://www.xiaohongshu.com", {
|
|
43537
|
+
waitUntil: "domcontentloaded",
|
|
43538
|
+
timeout: 15000
|
|
43539
|
+
});
|
|
43540
|
+
for(let i = 0; i < 10; i++){
|
|
43541
|
+
cookies = await task.steelBrowserContext?.cookies() ?? [];
|
|
43542
|
+
if (hasA1(cookies)) {
|
|
43543
|
+
task.logger?.info(`[XhsLogin] a1 补救成功,第 ${i + 1} 次轮询命中`);
|
|
43544
|
+
return cookies;
|
|
43545
|
+
}
|
|
43546
|
+
await new Promise((resolve)=>setTimeout(resolve, 500));
|
|
43547
|
+
}
|
|
43548
|
+
}
|
|
43549
|
+
} catch (err) {
|
|
43550
|
+
task.logger?.warn("[XhsLogin] a1 补救访问主站失败", err);
|
|
43551
|
+
}
|
|
43552
|
+
cookies = await task.steelBrowserContext?.cookies() ?? [];
|
|
43553
|
+
return cookies;
|
|
43554
|
+
}
|
|
43457
43555
|
const xiaohongshuLogin_rpa_server_rpaServer = async (task, params)=>{
|
|
43458
43556
|
const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
|
|
43459
43557
|
const reporter = task.reportService?.reportLoginStatus ?? (()=>Promise.resolve());
|
|
@@ -43654,21 +43752,29 @@ var __webpack_exports__ = {};
|
|
|
43654
43752
|
};
|
|
43655
43753
|
}
|
|
43656
43754
|
case types_ExecutionState.SUCCESS:
|
|
43657
|
-
|
|
43658
|
-
|
|
43659
|
-
|
|
43660
|
-
|
|
43661
|
-
|
|
43662
|
-
}
|
|
43663
|
-
|
|
43664
|
-
|
|
43665
|
-
|
|
43666
|
-
|
|
43667
|
-
|
|
43668
|
-
|
|
43669
|
-
|
|
43670
|
-
}
|
|
43671
|
-
|
|
43755
|
+
{
|
|
43756
|
+
const cookies = await collectCookiesWithA1(task);
|
|
43757
|
+
const hasA1 = cookies.some((c)=>"a1" === c.name && !!c.value);
|
|
43758
|
+
if (!hasA1) task.logger?.warn("[XhsLogin] 登录成功但缺失关键 cookie a1,后续检测可能失败", {
|
|
43759
|
+
cookieNames: cookies.map((c)=>c.name)
|
|
43760
|
+
});
|
|
43761
|
+
const cookieStr = JSON.stringify(cookies);
|
|
43762
|
+
await updateTaskState?.({
|
|
43763
|
+
state: types_TaskState.SUCCESS,
|
|
43764
|
+
result: {
|
|
43765
|
+
cookie: cookieStr,
|
|
43766
|
+
userInfo: userInfo
|
|
43767
|
+
}
|
|
43768
|
+
});
|
|
43769
|
+
return {
|
|
43770
|
+
code: 0,
|
|
43771
|
+
message: "成功",
|
|
43772
|
+
data: {
|
|
43773
|
+
cookie: cookieStr,
|
|
43774
|
+
userInfo
|
|
43775
|
+
}
|
|
43776
|
+
};
|
|
43777
|
+
}
|
|
43672
43778
|
default:
|
|
43673
43779
|
return {
|
|
43674
43780
|
code: 500,
|
|
@@ -43869,6 +43975,14 @@ var __webpack_exports__ = {};
|
|
|
43869
43975
|
const fileName = getFilenameFromUrl(url);
|
|
43870
43976
|
const localUrl = await downloadImage(url, external_node_path_default().join(tmpCachePath, fileName));
|
|
43871
43977
|
const fileBuffer = external_node_fs_default().readFileSync(localUrl);
|
|
43978
|
+
let width = 0;
|
|
43979
|
+
let height = 0;
|
|
43980
|
+
try {
|
|
43981
|
+
const dimensions = imageSize(fileBuffer);
|
|
43982
|
+
width = dimensions.width ?? 0;
|
|
43983
|
+
height = dimensions.height ?? 0;
|
|
43984
|
+
} catch {}
|
|
43985
|
+
const originSize = fileBuffer.byteLength / 1024;
|
|
43872
43986
|
const MAX_RETRIES = uploadInfos.length;
|
|
43873
43987
|
let attempt = 0;
|
|
43874
43988
|
while(attempt < MAX_RETRIES){
|
|
@@ -43890,7 +44004,10 @@ var __webpack_exports__ = {};
|
|
|
43890
44004
|
});
|
|
43891
44005
|
return {
|
|
43892
44006
|
ossFileId,
|
|
43893
|
-
ossToken
|
|
44007
|
+
ossToken,
|
|
44008
|
+
width,
|
|
44009
|
+
height,
|
|
44010
|
+
originSize
|
|
43894
44011
|
};
|
|
43895
44012
|
} catch (error) {
|
|
43896
44013
|
attempt++;
|
|
@@ -43898,7 +44015,10 @@ var __webpack_exports__ = {};
|
|
|
43898
44015
|
}
|
|
43899
44016
|
return {
|
|
43900
44017
|
ossFileId: "",
|
|
43901
|
-
ossToken: ""
|
|
44018
|
+
ossToken: "",
|
|
44019
|
+
width,
|
|
44020
|
+
height,
|
|
44021
|
+
originSize
|
|
43902
44022
|
};
|
|
43903
44023
|
};
|
|
43904
44024
|
const coverInfos = await Promise.all(params.banners.map((it, idx)=>uploadFile(it, idx)));
|
|
@@ -43963,8 +44083,16 @@ var __webpack_exports__ = {};
|
|
|
43963
44083
|
},
|
|
43964
44084
|
image_info: {
|
|
43965
44085
|
images: coverInfos.map((it)=>({
|
|
43966
|
-
extra_info_json:
|
|
44086
|
+
extra_info_json: JSON.stringify({
|
|
44087
|
+
mimeType: "image/png",
|
|
44088
|
+
image_metadata: {
|
|
44089
|
+
bg_color: "",
|
|
44090
|
+
origin_size: it.originSize
|
|
44091
|
+
}
|
|
44092
|
+
}),
|
|
43967
44093
|
file_id: it.ossFileId,
|
|
44094
|
+
width: it.width,
|
|
44095
|
+
height: it.height,
|
|
43968
44096
|
metadata: {
|
|
43969
44097
|
source: -1
|
|
43970
44098
|
},
|