@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.mjs CHANGED
@@ -5434,7 +5434,7 @@ function __webpack_require__(moduleId) {
5434
5434
  return module;
5435
5435
  };
5436
5436
  })();
5437
- var package_namespaceObject = JSON.parse('{"i8":"4.0.0-beta.7"}');
5437
+ var package_namespaceObject = JSON.parse('{"i8":"4.0.1-beta.0"}');
5438
5438
  var dist = __webpack_require__("../../node_modules/.pnpm/https-proxy-agent@7.0.6/node_modules/https-proxy-agent/dist/index.js");
5439
5439
  async function ProxyAgent(task, ip, adr, accountId, refresh) {
5440
5440
  const http = new Http({
@@ -5520,7 +5520,8 @@ class Http {
5520
5520
  url: error.config?.url,
5521
5521
  isProxyRequest: !!(error.config && (error.config.httpAgent || error.config.httpsAgent)),
5522
5522
  params: error.config?.params,
5523
- data: error.config?.data
5523
+ data: error.config?.data,
5524
+ serverDate: error.response?.headers?.date
5524
5525
  }
5525
5526
  };
5526
5527
  if (foundError) Object.assign(errorResponse, foundError);
@@ -5598,7 +5599,7 @@ class Http {
5598
5599
  try {
5599
5600
  this.proxyInfo = agent ? `${agent.ip}:${agent.port}` : void 0;
5600
5601
  const controller = new AbortController();
5601
- const timeoutId = setTimeout(()=>controller.abort(), reqTimeout);
5602
+ const timeoutId = setTimeout(()=>controller.abort(), reqTimeout + 500);
5602
5603
  const response = await this.apiClient({
5603
5604
  ...config,
5604
5605
  timeout: reqTimeout,
@@ -5622,7 +5623,7 @@ class Http {
5622
5623
  599
5623
5624
  ].includes(handledError.code);
5624
5625
  if (Rtimes < retries && isRetry) {
5625
- this.logger?.info(`进入第${Rtimes + 1}次重试!`);
5626
+ this.logger?.info(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}`);
5626
5627
  await new Promise((resolve)=>setTimeout(resolve, retryDelay));
5627
5628
  return sessionRt(Rtimes + 1);
5628
5629
  }
@@ -9837,23 +9838,26 @@ const rpaServer = async (task, params)=>{
9837
9838
  };
9838
9839
  }
9839
9840
  case types_ExecutionState.SUCCESS:
9840
- await updateTaskState?.({
9841
- state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
9842
- result: {
9843
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()).replace(/\\"/g, ""),
9844
- token,
9845
- userInfo: userInfo
9846
- }
9847
- });
9848
- return {
9849
- code: 0,
9850
- message: "成功",
9851
- data: {
9852
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()).replace(/\\"/g, ""),
9853
- token,
9854
- userInfo
9855
- }
9856
- };
9841
+ {
9842
+ const cookie = JSON.stringify(await task.steelBrowserContext?.cookies());
9843
+ await updateTaskState?.({
9844
+ state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
9845
+ result: {
9846
+ cookie,
9847
+ token,
9848
+ userInfo: userInfo
9849
+ }
9850
+ });
9851
+ return {
9852
+ code: 0,
9853
+ message: "成功",
9854
+ data: {
9855
+ cookie,
9856
+ token,
9857
+ userInfo
9858
+ }
9859
+ };
9860
+ }
9857
9861
  default:
9858
9862
  return {
9859
9863
  code: 500,
@@ -10210,20 +10214,11 @@ const mockAction = async (task, params)=>{
10210
10214
  };
10211
10215
  const rpa_rpaAction = async (task, params)=>{
10212
10216
  const tmpCachePath = task.getTmpPath();
10213
- const commonCookies = {
10214
- path: "/",
10215
- secure: true,
10216
- domain: "baijiahao.baidu.com",
10217
- url: "https://baijiahao.baidu.com",
10218
- httpOnly: true
10219
- };
10217
+ const validCookies = (params.cookies || []).filter((it)=>it.name && it.value && "undefined" !== it.value);
10220
10218
  const page = await task.createPage({
10221
10219
  show: task.debug,
10222
10220
  url: params.url || "https://baijiahao.baidu.com/builder/rc/edit?type=news&is_from_cms=1",
10223
- cookies: params.cookies?.map((it)=>({
10224
- ...it,
10225
- ...commonCookies
10226
- })) || []
10221
+ cookies: validCookies
10227
10222
  });
10228
10223
  page.setDefaultTimeout(60000);
10229
10224
  page.setDefaultNavigationTimeout(60000);
@@ -11756,6 +11751,8 @@ class Xhshow {
11756
11751
  }
11757
11752
  new Xhshow();
11758
11753
  const sessionCheck_xsEncrypt = new Xhshow();
11754
+ let lastEnvLogTime = 0;
11755
+ const ENV_LOG_INTERVAL_MS = 5000;
11759
11756
  const SessionCheckResultSchema = schemas_object({
11760
11757
  isValidSession: schemas_boolean()
11761
11758
  });
@@ -11820,35 +11817,33 @@ const WxSessionCheck = async (_task, params)=>{
11820
11817
  }, "微信账号有效性检测完成!");
11821
11818
  };
11822
11819
  const XhsSessionCheck = async (_task, params)=>{
11823
- const logger = _task.logger;
11824
- const startedAt = Date.now();
11820
+ const now = Date.now();
11821
+ const shouldLogEnv = now - lastEnvLogTime >= ENV_LOG_INTERVAL_MS;
11822
+ if (shouldLogEnv) {
11823
+ lastEnvLogTime = now;
11824
+ _task.logger?.debug("[XhsSessionCheck] 环境信息", {
11825
+ processType: process.type,
11826
+ pid: process.pid,
11827
+ nodeVersion: process.version,
11828
+ platform: process.platform,
11829
+ memoryUsage: {
11830
+ heapUsed: `${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} MB`,
11831
+ heapTotal: `${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} MB`
11832
+ },
11833
+ accountId: params.accountId,
11834
+ hasProxy: !!(params.proxyLoc || params.localIP)
11835
+ });
11836
+ }
11825
11837
  const check = {
11826
11838
  isValidSession: false,
11827
11839
  isValidWebSession: false
11828
11840
  };
11829
- const cookieNames = params.cookies.map((it)=>it.name);
11830
- logger?.info("[XhsSessionCheck] 开始执行小红书账号有效性检测", {
11831
- accountId: params.accountId,
11832
- proxyLoc: params.proxyLoc,
11833
- localIP: params.localIP,
11834
- willUseProxyAgent: !!params.localIP,
11835
- cookieCount: params.cookies.length,
11836
- cookieNames,
11837
- hasA1: cookieNames.includes("a1"),
11838
- hasWebSession: cookieNames.includes("web_session")
11839
- });
11840
11841
  const a1Cookie = params.cookies.find((it)=>"a1" === it.name)?.value;
11841
- if (!a1Cookie) {
11842
- logger?.warn("[XhsSessionCheck] 缺失关键 cookie a1,提前返回", {
11843
- accountId: params.accountId,
11844
- cookieNames
11845
- });
11846
- return {
11847
- code: 414,
11848
- message: "账号数据异常,请重新绑定账号后重试。",
11849
- data: check
11850
- };
11851
- }
11842
+ if (!a1Cookie) return {
11843
+ code: 414,
11844
+ message: "账号数据异常,请重新绑定账号后重试。",
11845
+ data: check
11846
+ };
11852
11847
  const headers = {
11853
11848
  cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
11854
11849
  referer: "https://creator.xiaohongshu.com/new/home?source=official"
@@ -11875,7 +11870,31 @@ const XhsSessionCheck = async (_task, params)=>{
11875
11870
  if (cookie.name && cookie.value) acc[cookie.name] = cookie.value;
11876
11871
  return acc;
11877
11872
  }, {});
11878
- const loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
11873
+ let loginBaseXsHeader;
11874
+ try {
11875
+ loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
11876
+ } catch (signError) {
11877
+ _task.logger?.error("[XhsSessionCheck] 签名生成失败 - 环境快照", {
11878
+ accountId: params.accountId,
11879
+ error: signError instanceof Error ? signError.message : String(signError),
11880
+ stack: _task.debug ? signError instanceof Error ? signError.stack : void 0 : void 0,
11881
+ hasA1: !!recordCookie.a1,
11882
+ env: {
11883
+ processType: process.type,
11884
+ memoryUsage: {
11885
+ heapUsed: `${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} MB`,
11886
+ heapTotal: `${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} MB`
11887
+ },
11888
+ hasProxy: !!(params.proxyLoc || params.localIP),
11889
+ timeSinceLastLog: Date.now() - lastEnvLogTime
11890
+ }
11891
+ });
11892
+ return {
11893
+ code: 500,
11894
+ message: "账号签名生成失败,请稍后重试。",
11895
+ data: check
11896
+ };
11897
+ }
11879
11898
  const baseInfoStart = Date.now();
11880
11899
  const _baseInfo = http.api({
11881
11900
  method: "get",
@@ -11885,75 +11904,44 @@ const XhsSessionCheck = async (_task, params)=>{
11885
11904
  }, {
11886
11905
  retries: 3,
11887
11906
  retryDelay: 20,
11888
- timeout: 3000
11889
- }).then((res)=>{
11890
- logger?.info("[XhsSessionCheck] creator base 接口请求成功", {
11891
- accountId: params.accountId,
11892
- duration: Date.now() - baseInfoStart,
11893
- code: res?.code,
11894
- msg: res?.msg,
11895
- proxyInfo: http.proxyInfo
11896
- });
11897
- return res;
11907
+ timeout: 5000
11898
11908
  }).catch((e)=>{
11899
- logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
11909
+ const clientTimestamp = Date.now();
11910
+ const serverDate = e?.extra?.serverDate;
11911
+ const serverTimestamp = serverDate ? new Date(serverDate).getTime() : null;
11912
+ const timeDriftMs = serverTimestamp ? clientTimestamp - serverTimestamp : null;
11913
+ _task.logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
11900
11914
  accountId: params.accountId,
11901
11915
  duration: Date.now() - baseInfoStart,
11902
11916
  code: e?.code,
11903
11917
  message: e?.message,
11904
11918
  data: e?.data,
11905
11919
  extra: e?.extra,
11906
- proxyInfo: http.proxyInfo
11920
+ proxyInfo: http.proxyInfo,
11921
+ clientTimestamp,
11922
+ serverDate,
11923
+ serverTimestamp,
11924
+ timeDriftMs,
11925
+ isLikelyClockDrift: null !== timeDriftMs && Math.abs(timeDriftMs) > 300000
11907
11926
  });
11908
11927
  return e.data;
11909
11928
  });
11910
- const webSessionStart = Date.now();
11911
11929
  const _web_session = http.api({
11912
11930
  method: "get",
11913
11931
  url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
11914
11932
  }, {
11915
11933
  retries: 3,
11916
11934
  retryDelay: 20,
11917
- timeout: 3000
11918
- }).then((res)=>{
11919
- logger?.info("[XhsSessionCheck] edith unread_count 接口请求成功", {
11920
- accountId: params.accountId,
11921
- duration: Date.now() - webSessionStart,
11922
- code: res?.code,
11923
- msg: res?.msg,
11924
- proxyInfo: http.proxyInfo
11925
- });
11926
- return res;
11927
- }).catch((e)=>{
11928
- logger?.warn("[XhsSessionCheck] edith unread_count 接口请求失败", {
11929
- accountId: params.accountId,
11930
- duration: Date.now() - webSessionStart,
11931
- code: e?.code,
11932
- message: e?.message,
11933
- data: e?.data,
11934
- extra: e?.extra,
11935
- proxyInfo: http.proxyInfo
11936
- });
11937
- throw e;
11935
+ timeout: 5000
11938
11936
  });
11939
11937
  const [baseInfo, web_session] = await Promise.all([
11940
11938
  _baseInfo,
11941
11939
  _web_session
11942
11940
  ]);
11943
11941
  if (baseInfo?.code === 0) check.isValidSession = true;
11944
- if (0 === web_session.code) check.isValidWebSession = true;
11945
- const _isSuccess = baseInfo?.code === web_session.code;
11942
+ if (web_session?.code === 0) check.isValidWebSession = true;
11943
+ baseInfo?.code, web_session?.code;
11946
11944
  const message = `小红书账号有效性检测成功${_task.debug ? ` ${http.proxyInfo}` : ""}`;
11947
- logger?.info("[XhsSessionCheck] 检测完成", {
11948
- accountId: params.accountId,
11949
- totalDuration: Date.now() - startedAt,
11950
- baseInfoCode: baseInfo?.code,
11951
- webSessionCode: web_session?.code,
11952
- isValidSession: check.isValidSession,
11953
- isValidWebSession: check.isValidWebSession,
11954
- codeAligned: _isSuccess,
11955
- proxyInfo: http.proxyInfo
11956
- });
11957
11945
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(check, message);
11958
11946
  };
11959
11947
  const BjhSessionCheck = async (_task, params)=>{
@@ -14482,7 +14470,10 @@ const mock_mockAction = async (task, params)=>{
14482
14470
  task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
14483
14471
  decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
14484
14472
  if (needsVerification(decision)) {
14485
- task.logger.info(`需要验证: ${JSON.stringify(decision)}`);
14473
+ task.logger.warn(`检测到需要验证: ${JSON.stringify(decision)}`);
14474
+ task.logger.warn(`验证类型: ${decision?.verify_ways?.join(", ")}`);
14475
+ task.logger.warn(`验证标题: ${decision?.verify_title}`);
14476
+ task.logger.warn(`验证描述: ${decision?.verify_desc}`);
14486
14477
  return;
14487
14478
  }
14488
14479
  if (!response || !response.data) return;
@@ -14509,38 +14500,116 @@ const mock_mockAction = async (task, params)=>{
14509
14500
  });
14510
14501
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, message, data);
14511
14502
  }
14512
- const webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
14513
- const ticket = webProtectData.ticket;
14514
- const ts_sign = webProtectData.ts_sign;
14515
- const ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
14516
- const certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
14503
+ let webProtectData;
14504
+ try {
14505
+ webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
14506
+ if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
14507
+ task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
14508
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
14509
+ }
14510
+ } catch (error) {
14511
+ task.logger.error(`解析 webProtectData 失败: ${error}`);
14512
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
14513
+ }
14514
+ let ticket = webProtectData.ticket;
14515
+ let ts_sign = webProtectData.ts_sign;
14516
+ const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
14517
+ if (serverDataCookie) try {
14518
+ const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
14519
+ if (decoded.ticket && decoded.ts_sign) {
14520
+ if (decoded.ticket !== ticket) task.logger.info("使用 cookie 中的最新 ticket(web_protect 已过期)");
14521
+ ticket = decoded.ticket;
14522
+ ts_sign = decoded.ts_sign;
14523
+ }
14524
+ } catch (error) {
14525
+ task.logger.warn(`解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
14526
+ }
14527
+ let ec_privateKey;
14528
+ try {
14529
+ ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
14530
+ if (!ec_privateKey) {
14531
+ task.logger.error("ec_privateKey 为空");
14532
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
14533
+ }
14534
+ } catch (error) {
14535
+ task.logger.error(`解析 ec_privateKey 失败: ${error}`);
14536
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
14537
+ }
14538
+ let certificate;
14539
+ try {
14540
+ certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
14541
+ if (!certificate) {
14542
+ task.logger.error("certificate 为空");
14543
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
14544
+ }
14545
+ } catch (error) {
14546
+ task.logger.error(`解析 certificate 失败: ${error}`);
14547
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
14548
+ }
14517
14549
  const ree_public_key = webProtectData.client_cert.replace("pub.", "");
14518
- task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket}, ts_sign: ${ts_sign}, ec_privateKey: ${ec_privateKey}, certificate: ${certificate}, ree_public_key: ${ree_public_key}`);
14519
- const bdTicketGuardClientData = getBdV2({
14520
- ticket,
14521
- ts_sign: ts_sign,
14522
- ec_privateKey: ec_privateKey,
14523
- certificate: certificate,
14524
- bd_ticket_guard_ree_public_key: ree_public_key
14525
- });
14526
- task.logger.info("bdTicketGuardClientData", {
14527
- bdTicketGuardClientData
14528
- });
14550
+ task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket?.substring(0, 20)}..., ts_sign: ${ts_sign}, ree_public_key: ${ree_public_key?.substring(0, 20)}...`);
14551
+ let bdTicketGuardClientData;
14552
+ try {
14553
+ bdTicketGuardClientData = getBdV2({
14554
+ ticket,
14555
+ ts_sign: ts_sign,
14556
+ ec_privateKey: ec_privateKey,
14557
+ certificate: certificate,
14558
+ bd_ticket_guard_ree_public_key: ree_public_key
14559
+ });
14560
+ if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
14561
+ task.logger.error(`bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
14562
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
14563
+ }
14564
+ } catch (error) {
14565
+ task.logger.error(`生成 bdTicketGuardClientData 失败: ${error}`);
14566
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
14567
+ }
14568
+ task.logger.info("bdTicketGuardClientData 生成成功");
14529
14569
  const publishQuery = {
14530
14570
  ...publishParams,
14531
14571
  a_bogus: ""
14532
14572
  };
14533
14573
  const queryString = new URLSearchParams(publishQuery).toString();
14534
- const aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
14574
+ let aBogus;
14575
+ try {
14576
+ aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
14577
+ if (!aBogus || aBogus.length < 10) {
14578
+ task.logger.error(`a_bogus 生成异常,长度过短: ${aBogus}`);
14579
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
14580
+ }
14581
+ task.logger.info(`a_bogus 生成成功: ${aBogus.substring(0, 20)}...`);
14582
+ } catch (error) {
14583
+ task.logger.error(`生成 a_bogus 失败: ${error}`);
14584
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
14585
+ }
14535
14586
  publishQuery.a_bogus = aBogus;
14536
14587
  const publishQueryParams = new URLSearchParams(publishQuery).toString();
14537
- const csrfToken = mock_generateCsrfTokenAdvanced({
14538
- cookies: params.cookies,
14539
- url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
14540
- method: "POST",
14541
- userAgent
14542
- });
14543
- const sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
14588
+ let csrfToken;
14589
+ try {
14590
+ csrfToken = mock_generateCsrfTokenAdvanced({
14591
+ cookies: params.cookies,
14592
+ url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
14593
+ method: "POST",
14594
+ userAgent
14595
+ });
14596
+ if (!csrfToken || csrfToken.length < 10) {
14597
+ task.logger.error(`csrfToken 生成异常,长度过短: ${csrfToken}`);
14598
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
14599
+ }
14600
+ task.logger.info(`csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
14601
+ } catch (error) {
14602
+ task.logger.error(`生成 csrfToken 失败: ${error}`);
14603
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
14604
+ }
14605
+ let sessionDtrait;
14606
+ try {
14607
+ sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
14608
+ task.logger.info(`sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
14609
+ } catch (error) {
14610
+ task.logger.error(`生成 sessionDtrait 失败: ${error}`);
14611
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
14612
+ }
14544
14613
  task.logger.info("发布数据", {
14545
14614
  data: JSON.stringify(publishData)
14546
14615
  });
@@ -23143,6 +23212,33 @@ const xiaohongshuLogin_rpa_rpaAction = async (task, _params)=>{
23143
23212
  const encode_mnsv2 = __webpack_require__("./src/utils/xhs_ob/x_s.encoder.js");
23144
23213
  const xiaohongshuLogin_rpa_server_scanRetryMaxCount = 60;
23145
23214
  const xiaohongshuLogin_rpa_server_waitQrcodeResultMaxTime = 2000 * xiaohongshuLogin_rpa_server_scanRetryMaxCount;
23215
+ async function collectCookiesWithA1(task) {
23216
+ const hasA1 = (cookies)=>cookies.some((c)=>"a1" === c.name && !!c.value);
23217
+ let cookies = await task.steelBrowserContext?.cookies() ?? [];
23218
+ if (hasA1(cookies)) return cookies;
23219
+ task.logger?.warn("[XhsLogin] 首次抓取缺失 a1,尝试补救……");
23220
+ try {
23221
+ const page = task.steelBrowserContext?.pages?.()[0];
23222
+ if (page) {
23223
+ await page.goto("https://www.xiaohongshu.com", {
23224
+ waitUntil: "domcontentloaded",
23225
+ timeout: 15000
23226
+ });
23227
+ for(let i = 0; i < 10; i++){
23228
+ cookies = await task.steelBrowserContext?.cookies() ?? [];
23229
+ if (hasA1(cookies)) {
23230
+ task.logger?.info(`[XhsLogin] a1 补救成功,第 ${i + 1} 次轮询命中`);
23231
+ return cookies;
23232
+ }
23233
+ await new Promise((resolve)=>setTimeout(resolve, 500));
23234
+ }
23235
+ }
23236
+ } catch (err) {
23237
+ task.logger?.warn("[XhsLogin] a1 补救访问主站失败", err);
23238
+ }
23239
+ cookies = await task.steelBrowserContext?.cookies() ?? [];
23240
+ return cookies;
23241
+ }
23146
23242
  const xiaohongshuLogin_rpa_server_rpaServer = async (task, params)=>{
23147
23243
  const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
23148
23244
  const reporter = task.reportService?.reportLoginStatus ?? (()=>Promise.resolve());
@@ -23343,21 +23439,29 @@ const xiaohongshuLogin_rpa_server_rpaServer = async (task, params)=>{
23343
23439
  };
23344
23440
  }
23345
23441
  case types_ExecutionState.SUCCESS:
23346
- await updateTaskState?.({
23347
- state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
23348
- result: {
23349
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
23350
- userInfo: userInfo
23351
- }
23352
- });
23353
- return {
23354
- code: 0,
23355
- message: "成功",
23356
- data: {
23357
- cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
23358
- userInfo
23359
- }
23360
- };
23442
+ {
23443
+ const cookies = await collectCookiesWithA1(task);
23444
+ const hasA1 = cookies.some((c)=>"a1" === c.name && !!c.value);
23445
+ if (!hasA1) task.logger?.warn("[XhsLogin] 登录成功但缺失关键 cookie a1,后续检测可能失败", {
23446
+ cookieNames: cookies.map((c)=>c.name)
23447
+ });
23448
+ const cookieStr = JSON.stringify(cookies);
23449
+ await updateTaskState?.({
23450
+ state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
23451
+ result: {
23452
+ cookie: cookieStr,
23453
+ userInfo: userInfo
23454
+ }
23455
+ });
23456
+ return {
23457
+ code: 0,
23458
+ message: "成功",
23459
+ data: {
23460
+ cookie: cookieStr,
23461
+ userInfo
23462
+ }
23463
+ };
23464
+ }
23361
23465
  default:
23362
23466
  return {
23363
23467
  code: 500,
@@ -23558,6 +23662,14 @@ const xiaohongshuPublish_mock_mockAction = async (task, params)=>{
23558
23662
  const fileName = (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.getFilenameFromUrl)(url);
23559
23663
  const localUrl = await (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.downloadImage)(url, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__["default"].join(tmpCachePath, fileName));
23560
23664
  const fileBuffer = __WEBPACK_EXTERNAL_MODULE_node_fs_5ea92f0c__["default"].readFileSync(localUrl);
23665
+ let width = 0;
23666
+ let height = 0;
23667
+ try {
23668
+ const dimensions = (0, __WEBPACK_EXTERNAL_MODULE_image_size_bc738ffb__["default"])(fileBuffer);
23669
+ width = dimensions.width ?? 0;
23670
+ height = dimensions.height ?? 0;
23671
+ } catch {}
23672
+ const originSize = fileBuffer.byteLength / 1024;
23561
23673
  const MAX_RETRIES = uploadInfos.length;
23562
23674
  let attempt = 0;
23563
23675
  while(attempt < MAX_RETRIES){
@@ -23579,7 +23691,10 @@ const xiaohongshuPublish_mock_mockAction = async (task, params)=>{
23579
23691
  });
23580
23692
  return {
23581
23693
  ossFileId,
23582
- ossToken
23694
+ ossToken,
23695
+ width,
23696
+ height,
23697
+ originSize
23583
23698
  };
23584
23699
  } catch (error) {
23585
23700
  attempt++;
@@ -23587,7 +23702,10 @@ const xiaohongshuPublish_mock_mockAction = async (task, params)=>{
23587
23702
  }
23588
23703
  return {
23589
23704
  ossFileId: "",
23590
- ossToken: ""
23705
+ ossToken: "",
23706
+ width,
23707
+ height,
23708
+ originSize
23591
23709
  };
23592
23710
  };
23593
23711
  const coverInfos = await Promise.all(params.banners.map((it, idx)=>uploadFile(it, idx)));
@@ -23652,8 +23770,16 @@ const xiaohongshuPublish_mock_mockAction = async (task, params)=>{
23652
23770
  },
23653
23771
  image_info: {
23654
23772
  images: coverInfos.map((it)=>({
23655
- extra_info_json: '{"mimeType":"image/png"}',
23773
+ extra_info_json: JSON.stringify({
23774
+ mimeType: "image/png",
23775
+ image_metadata: {
23776
+ bg_color: "",
23777
+ origin_size: it.originSize
23778
+ }
23779
+ }),
23656
23780
  file_id: it.ossFileId,
23781
+ width: it.width,
23782
+ height: it.height,
23657
23783
  metadata: {
23658
23784
  source: -1
23659
23785
  },