@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/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.0-beta.7"}');
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
- await updateTaskState?.({
9913
- state: share_namespaceObject.TaskState.SUCCESS,
9914
- result: {
9915
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()).replace(/\\"/g, ""),
9916
- token,
9917
- userInfo: userInfo
9918
- }
9919
- });
9920
- return {
9921
- code: 0,
9922
- message: "成功",
9923
- data: {
9924
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()).replace(/\\"/g, ""),
9925
- token,
9926
- userInfo
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 commonCookies = {
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: params.cookies?.map((it)=>({
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 logger = _task.logger;
11900
- const startedAt = Date.now();
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
- logger?.warn("[XhsSessionCheck] 缺失关键 cookie a1,提前返回", {
11919
- accountId: params.accountId,
11920
- cookieNames
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
- const loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
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: 3000
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
- logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
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: 3000
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 (0 === web_session.code) check.isValidWebSession = true;
12021
- const _isSuccess = baseInfo?.code === web_session.code;
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.info(`需要验证: ${JSON.stringify(decision)}`);
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
- const webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
14594
- const ticket = webProtectData.ticket;
14595
- const ts_sign = webProtectData.ts_sign;
14596
- const ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
14597
- const certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
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}, ts_sign: ${ts_sign}, ec_privateKey: ${ec_privateKey}, certificate: ${certificate}, ree_public_key: ${ree_public_key}`);
14600
- const bdTicketGuardClientData = getBdV2({
14601
- ticket,
14602
- ts_sign: ts_sign,
14603
- ec_privateKey: ec_privateKey,
14604
- certificate: certificate,
14605
- bd_ticket_guard_ree_public_key: ree_public_key
14606
- });
14607
- task.logger.info("bdTicketGuardClientData", {
14608
- bdTicketGuardClientData
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
- const aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
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
- const csrfToken = mock_generateCsrfTokenAdvanced({
14619
- cookies: params.cookies,
14620
- url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
14621
- method: "POST",
14622
- userAgent
14623
- });
14624
- const sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
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
- await updateTaskState?.({
23432
- state: share_namespaceObject.TaskState.SUCCESS,
23433
- result: {
23434
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
23435
- userInfo: userInfo
23436
- }
23437
- });
23438
- return {
23439
- code: 0,
23440
- message: "成功",
23441
- data: {
23442
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
23443
- userInfo
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: '{"mimeType":"image/png"}',
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
  },