@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 CHANGED
@@ -8733,8 +8733,10 @@ var __webpack_exports__ = {};
8733
8733
  navigator: ()=>_navigator,
8734
8734
  origin: ()=>utils_origin
8735
8735
  });
8736
- var package_namespaceObject = JSON.parse('{"i8":"1.0.0-beta.0"}');
8737
- var package_namespaceObject_0 = JSON.parse('{"i8":"4.0.0-beta.7"}');
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
- await updateTaskState?.({
28657
- state: types_TaskState.SUCCESS,
28658
- result: {
28659
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()).replace(/\\"/g, ""),
28660
- token,
28661
- userInfo: userInfo
28662
- }
28663
- });
28664
- return {
28665
- code: 0,
28666
- message: "成功",
28667
- data: {
28668
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()).replace(/\\"/g, ""),
28669
- token,
28670
- userInfo
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 commonCookies = {
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: params.cookies?.map((it)=>({
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 logger = _task.logger;
30640
- const startedAt = Date.now();
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
- logger?.warn("[XhsSessionCheck] 缺失关键 cookie a1,提前返回", {
30659
- accountId: params.accountId,
30660
- cookieNames
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
- const loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
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: 3000
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
- logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
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: 3000
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 (0 === web_session.code) check.isValidWebSession = true;
30761
- const _isSuccess = baseInfo?.code === web_session.code;
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.info(`需要验证: ${JSON.stringify(decision)}`);
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
- const webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
34820
- const ticket = webProtectData.ticket;
34821
- const ts_sign = webProtectData.ts_sign;
34822
- const ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
34823
- const certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
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}, ts_sign: ${ts_sign}, ec_privateKey: ${ec_privateKey}, certificate: ${certificate}, ree_public_key: ${ree_public_key}`);
34826
- const bdTicketGuardClientData = getBdV2({
34827
- ticket,
34828
- ts_sign: ts_sign,
34829
- ec_privateKey: ec_privateKey,
34830
- certificate: certificate,
34831
- bd_ticket_guard_ree_public_key: ree_public_key
34832
- });
34833
- task.logger.info("bdTicketGuardClientData", {
34834
- bdTicketGuardClientData
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
- const aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
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
- const csrfToken = mock_generateCsrfTokenAdvanced({
34845
- cookies: params.cookies,
34846
- url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
34847
- method: "POST",
34848
- userAgent
34849
- });
34850
- const sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
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
- await updateTaskState?.({
43658
- state: types_TaskState.SUCCESS,
43659
- result: {
43660
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
43661
- userInfo: userInfo
43662
- }
43663
- });
43664
- return {
43665
- code: 0,
43666
- message: "成功",
43667
- data: {
43668
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
43669
- userInfo
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: '{"mimeType":"image/png"}',
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
  },