@iflyrpa/actions 4.1.0-beta.0 → 4.1.0-beta.2

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
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8d2e6460-75c8-5b65-9b60-d4269a0ff597")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="47f14957-3de9-5f22-92f5-89210082b96d")}catch(e){}}();
3
3
  import * as __WEBPACK_EXTERNAL_MODULE_crypto__ from "crypto";
4
4
  import * as __WEBPACK_EXTERNAL_MODULE_fs__ from "fs";
5
5
  import * as __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_package_json_58ae5f06__ from "@iflyrpa/share/package.json";
@@ -4352,7 +4352,7 @@ function __webpack_require__(moduleId) {
4352
4352
  return module;
4353
4353
  };
4354
4354
  })();
4355
- var package_namespaceObject = JSON.parse('{"i8":"4.1.0-beta.0"}');
4355
+ var package_namespaceObject = JSON.parse('{"i8":"4.1.0-beta.2"}');
4356
4356
  const USER_MESSAGE = {
4357
4357
  PROXY_UNAVAILABLE: "代理暂时不可用,请稍后重试或使用本地IP",
4358
4358
  NETWORK_ERROR: "网络异常,请稍后重试",
@@ -4386,6 +4386,11 @@ function classifyPublishError(handledError) {
4386
4386
  const RPA_ERROR_WEBHOOK_URL = "https://open.xfchat.iflytek.com/open-apis/bot/v2/hook/d202c0dc-5af5-40bc-83ed-abc677caa4a5";
4387
4387
  const ALARM_THROTTLE_MS = 60000;
4388
4388
  const lastSentAt = new Map();
4389
+ const THROTTLE_MAP_MAX_KEYS = 500;
4390
+ const pruneThrottleMap = (now)=>{
4391
+ if (lastSentAt.size < THROTTLE_MAP_MAX_KEYS) return;
4392
+ for (const [key, at] of lastSentAt)if (now - at >= ALARM_THROTTLE_MS) lastSentAt.delete(key);
4393
+ };
4389
4394
  const postFeishuWebhook = (webhookUrl, payload)=>__WEBPACK_EXTERNAL_MODULE_axios__["default"].post(webhookUrl, payload, {
4390
4395
  headers: {
4391
4396
  "Content-Type": "application/json"
@@ -4463,10 +4468,11 @@ const buildFeishuPostMessage = (report)=>{
4463
4468
  };
4464
4469
  const reportFeishuAlarm = (report)=>{
4465
4470
  try {
4466
- const key = `${report.platform}|${report.source}|${report.errorType}|${report.code ?? ""}`;
4471
+ const key = `${report.platform}|${report.source}|${report.stage}|${report.errorType}|${report.code ?? ""}`;
4467
4472
  const now = Date.now();
4468
4473
  const last = lastSentAt.get(key);
4469
4474
  if (last && now - last < ALARM_THROTTLE_MS) return;
4475
+ pruneThrottleMap(now);
4470
4476
  lastSentAt.set(key, now);
4471
4477
  postFeishuWebhook(RPA_ERROR_WEBHOOK_URL, buildFeishuPostMessage(report)).catch(()=>{});
4472
4478
  } catch {}
@@ -4648,7 +4654,14 @@ const HTTP_STATUS_MESSAGE = {
4648
4654
  };
4649
4655
  class Http {
4650
4656
  static handleApiError(error) {
4651
- if (error && "object" == typeof error && "code" in error && "message" in error) return error;
4657
+ if (error && "object" == typeof error && "code" in error && "message" in error) {
4658
+ const resp = error;
4659
+ if ("string" != typeof resp.message || !resp.message.trim()) return {
4660
+ ...resp,
4661
+ message: USER_MESSAGE.SYSTEM_ERROR
4662
+ };
4663
+ return resp;
4664
+ }
4652
4665
  return {
4653
4666
  code: 500,
4654
4667
  message: USER_MESSAGE.SYSTEM_ERROR,
@@ -4786,21 +4799,35 @@ class Http {
4786
4799
  errorResponse.message = message;
4787
4800
  }
4788
4801
  if (error.message.includes("Proxy connection ended")) errorResponse.message = "所在区域代理连接超时,请更换区域或稍后重试!";
4789
- const status = error.response?.status;
4790
- reportFeishuAlarm({
4791
- level: status && ALARM_STATUS.has(status) ? "alarm" : "warning",
4792
- platform: this.platform || "unknown",
4793
- source: "http",
4794
- stage: `${(error.config?.method || "get").toUpperCase()} ${error.config?.url || "-"}`,
4795
- errorType: status ? `HTTP_${status}` : error.code || "NETWORK_ERROR",
4796
- code: errorResponse.code,
4797
- msg: errorResponse.message,
4798
- url: error.config?.url,
4799
- title: "RPA接口异常"
4800
- });
4802
+ errorResponse.extra = {
4803
+ ...errorResponse.extra,
4804
+ alarmStatus: error.response?.status,
4805
+ alarmErrorCode: error.code
4806
+ };
4801
4807
  throw errorResponse;
4802
4808
  });
4803
4809
  }
4810
+ reportRequestFailure(config, error, attempts) {
4811
+ const status = error.extra?.alarmStatus;
4812
+ const axiosCode = error.extra?.alarmErrorCode;
4813
+ const method = (config.method || "get").toUpperCase();
4814
+ const baseURL = config.baseURL || this.apiClient.defaults.baseURL || "";
4815
+ const fullUrl = config.url ? /^https?:\/\//.test(config.url) ? config.url : `${baseURL.replace(/\/$/, "")}${config.url}` : baseURL || "-";
4816
+ const rawMsg = "string" == typeof error.message && error.message.trim() ? error.message : "";
4817
+ const baseMsg = rawMsg || `请求失败(无错误文案,code=${error.code ?? "unknown"})`;
4818
+ const retriedSuffix = attempts > 0 ? `(已重试${attempts}次仍失败)` : "";
4819
+ reportFeishuAlarm({
4820
+ level: status && ALARM_STATUS.has(status) ? "alarm" : "warning",
4821
+ platform: "@iflyrpa/playwright",
4822
+ source: "http",
4823
+ stage: `${method} ${fullUrl}`,
4824
+ errorType: status ? `HTTP_${status}` : axiosCode || "NETWORK_ERROR",
4825
+ code: error.code,
4826
+ msg: `${baseMsg}${retriedSuffix}`,
4827
+ url: "-" !== fullUrl ? fullUrl : void 0,
4828
+ title: "RPA接口异常"
4829
+ });
4830
+ }
4804
4831
  async api(config, options) {
4805
4832
  const retries = options?.retries ?? 0;
4806
4833
  const retryDelay = options?.retryDelay ?? 500;
@@ -4845,10 +4872,12 @@ class Http {
4845
4872
  ].includes(handledError.code);
4846
4873
  if (Rtimes < retries && isRetry) {
4847
4874
  const url = config.url || "";
4848
- this.logger?.warn(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}, 请求地址: ${url}`);
4849
- await new Promise((resolve)=>setTimeout(resolve, retryDelay));
4875
+ const backoff = Math.min(retryDelay * 2 ** Rtimes, 5000);
4876
+ this.logger?.warn(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}, 等待: ${backoff}ms, 请求地址: ${url}`);
4877
+ await new Promise((resolve)=>setTimeout(resolve, backoff));
4850
4878
  return sessionRt(Rtimes + 1);
4851
4879
  }
4880
+ this.reportRequestFailure(config, handledError, Rtimes);
4852
4881
  return Promise.reject(handledError);
4853
4882
  }
4854
4883
  };
@@ -9950,7 +9979,8 @@ const XhsFansExport = async (_task, params)=>{
9950
9979
  },
9951
9980
  _task.logger,
9952
9981
  params.proxyLoc,
9953
- params.accountId
9982
+ params.accountId,
9983
+ "xiaohongshu"
9954
9984
  ];
9955
9985
  const http = new Http(...args);
9956
9986
  const fans = {
@@ -9964,8 +9994,8 @@ const XhsFansExport = async (_task, params)=>{
9964
9994
  url: "https://creator.xiaohongshu.com/api/galaxy/creator/home/personal_info"
9965
9995
  }, {
9966
9996
  retries: 3,
9967
- retryDelay: 20,
9968
- timeout: 3000
9997
+ retryDelay: 300,
9998
+ timeout: 30000
9969
9999
  });
9970
10000
  fans.fans_count = Number(res.data.fans_count);
9971
10001
  fans.digg_count = Number(res.data.faved_count);
@@ -11102,7 +11132,8 @@ const XhsSessionCheck = async (_task, params)=>{
11102
11132
  },
11103
11133
  _task.logger,
11104
11134
  params.proxyLoc,
11105
- params.accountId
11135
+ params.accountId,
11136
+ "xiaohongshu"
11106
11137
  ];
11107
11138
  const http = new Http(...args);
11108
11139
  http.addResponseInterceptor((response)=>{
@@ -11150,8 +11181,8 @@ const XhsSessionCheck = async (_task, params)=>{
11150
11181
  headers: loginBaseXsHeader
11151
11182
  }, {
11152
11183
  retries: 3,
11153
- retryDelay: 20,
11154
- timeout: 5000
11184
+ retryDelay: 300,
11185
+ timeout: 30000
11155
11186
  }).catch((e)=>{
11156
11187
  const clientTimestamp = Date.now();
11157
11188
  const serverDate = e?.extra?.serverDate;
@@ -11183,8 +11214,8 @@ const XhsSessionCheck = async (_task, params)=>{
11183
11214
  headers: webSessionXsHeader
11184
11215
  }, {
11185
11216
  retries: 3,
11186
- retryDelay: 20,
11187
- timeout: 5000
11217
+ retryDelay: 300,
11218
+ timeout: 30000
11188
11219
  });
11189
11220
  const [baseInfo, web_session] = await Promise.all([
11190
11221
  _baseInfo,
@@ -11276,6 +11307,10 @@ const ShipinhaoSessionCheck = async (_task, params)=>{
11276
11307
  };
11277
11308
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(data, message);
11278
11309
  };
11310
+ const extractEncFileKey = (downloadUrl)=>{
11311
+ if (!downloadUrl) return "";
11312
+ return downloadUrl.split("encfilekey=")[1]?.split("&")[0] || "";
11313
+ };
11279
11314
  const rid = ()=>`${Math.floor(Date.now() / 1e3).toString(16)}-${[
11280
11315
  ...Array(8)
11281
11316
  ].map(()=>Math.floor(16 * Math.random()).toString(16)).join("")}`;
@@ -15430,7 +15465,8 @@ const getXhsUnreadCount = async (_task, params)=>{
15430
15465
  },
15431
15466
  _task.logger,
15432
15467
  params.proxyLoc,
15433
- params.accountId
15468
+ params.accountId,
15469
+ "xiaohongshu"
15434
15470
  ];
15435
15471
  const http = new Http(...args);
15436
15472
  let unreadCount = {
@@ -15459,8 +15495,8 @@ const getXhsUnreadCount = async (_task, params)=>{
15459
15495
  headers: xsHeader
15460
15496
  }, {
15461
15497
  retries: 3,
15462
- retryDelay: 20,
15463
- timeout: 3000
15498
+ retryDelay: 300,
15499
+ timeout: 30000
15464
15500
  });
15465
15501
  const isSuccess = 0 === res.code;
15466
15502
  if (isSuccess) unreadCount = res.data;
@@ -15871,7 +15907,8 @@ async function getXiaohongshuData(_task, params) {
15871
15907
  },
15872
15908
  _task.logger,
15873
15909
  params.proxyLoc,
15874
- params.accountId
15910
+ params.accountId,
15911
+ "xiaohongshu"
15875
15912
  ];
15876
15913
  const http = new Http(...args);
15877
15914
  const xsEncrypt = new Xhshow();
@@ -15887,8 +15924,8 @@ async function getXiaohongshuData(_task, params) {
15887
15924
  url: "https://creator.xiaohongshu.com/api/galaxy/creator/home/personal_info"
15888
15925
  }, {
15889
15926
  retries: 3,
15890
- retryDelay: 20,
15891
- timeout: 3000
15927
+ retryDelay: 300,
15928
+ timeout: 30000
15892
15929
  }),
15893
15930
  http.api({
15894
15931
  method: "get",
@@ -15897,8 +15934,8 @@ async function getXiaohongshuData(_task, params) {
15897
15934
  headers: sevenDataXsHeader
15898
15935
  }, {
15899
15936
  retries: 3,
15900
- retryDelay: 20,
15901
- timeout: 3000
15937
+ retryDelay: 300,
15938
+ timeout: 30000
15902
15939
  })
15903
15940
  ]);
15904
15941
  const xhsData = {
@@ -18935,7 +18972,7 @@ const shipinhaoPublish_mock_mockAction = async (task, params)=>{
18935
18972
  const resultMsg = publishResult.data?.baseResp?.errmsg ?? publishResult.errMsg;
18936
18973
  if (0 === resultCode) {
18937
18974
  task.logger.info("[shipinhaoPublish] 发布成功");
18938
- const publishId = uploadedImages[0]?.thumbUrl?.split("encfilekey=")[1]?.split("&")[0] || "";
18975
+ const publishId = extractEncFileKey(uploadedImages[0]?.thumbUrl);
18939
18976
  await updateTaskState?.({
18940
18977
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
18941
18978
  result: {
@@ -19830,8 +19867,7 @@ async function uploader_uploadFile(opts) {
19830
19867
  const partTimeout = tuning?.partTimeout ?? DEFAULT_TUNING.partTimeout;
19831
19868
  const partRetries = tuning?.partRetries ?? DEFAULT_TUNING.partRetries;
19832
19869
  const completeTimeout = tuning?.completeTimeout ?? DEFAULT_TUNING.completeTimeout;
19833
- logger?.info(`开始上传: ${fileName} (${fileSize} B, filetype=${fileType})`);
19834
- logger?.info(`上传超时策略: 单片 ${partTimeout / 1000}s(重试 ${partRetries} 次)、合并 ${completeTimeout / 1000}s`);
19870
+ logger?.info(`[shipinhaoPublishVideo] 开始上传: ${fileName} (${fileSize} B, filetype=${fileType})`);
19835
19871
  const fileMd5 = await computeFileMd5(filePath);
19836
19872
  const taskId = generateTaskId(fileName, fileSize, fileMd5);
19837
19873
  const baseUrl = "https://finderassistancea.video.qq.com";
@@ -19842,7 +19878,7 @@ async function uploader_uploadFile(opts) {
19842
19878
  const chunkCount = Math.ceil(fileSize / CHUNK_SIZE);
19843
19879
  const blockPartLength = [];
19844
19880
  for(let i = 0; i < chunkCount; i++)blockPartLength.push(Math.min((i + 1) * CHUNK_SIZE, fileSize));
19845
- logger?.info(`申请 UploadID: ${chunkCount} 片`);
19881
+ logger?.info(`[shipinhaoPublishVideo] 视频分片: ${chunkCount} 片`);
19846
19882
  const applyRes = await http.api({
19847
19883
  method: "PUT",
19848
19884
  url: `${baseUrl}/applyuploaddfs`,
@@ -19863,7 +19899,6 @@ async function uploader_uploadFile(opts) {
19863
19899
  let uploadId = applyRes.UploadID;
19864
19900
  const uploadedParts = new Set();
19865
19901
  if (applyRes.ListPartsResult) {
19866
- logger?.info("检测到已上传分片,执行续传");
19867
19902
  const parts = Array.isArray(applyRes.ListPartsResult.Part) ? applyRes.ListPartsResult.Part : applyRes.ListPartsResult.Part ? [
19868
19903
  applyRes.ListPartsResult.Part
19869
19904
  ] : [];
@@ -19899,7 +19934,6 @@ async function uploader_uploadFile(opts) {
19899
19934
  PartNumber: partNumber,
19900
19935
  ETag: existing.ETag
19901
19936
  });
19902
- logger?.info(`分片 ${partNumber}/${chunkCount} 已存在,跳过`);
19903
19937
  continue;
19904
19938
  }
19905
19939
  }
@@ -19924,18 +19958,15 @@ async function uploader_uploadFile(opts) {
19924
19958
  retries: partRetries,
19925
19959
  retryDelay: 2000
19926
19960
  });
19927
- const partElapsed = Date.now() - partStart;
19928
- const throughput = Math.round(chunkSize / (partElapsed / 1000));
19961
+ Date.now();
19929
19962
  partInfo.push({
19930
19963
  PartNumber: partNumber,
19931
19964
  ETag: `"${chunkMd5}"`
19932
19965
  });
19933
- logger?.info(`分片 ${partNumber}/${chunkCount} 完成 (${chunkSize} B, ${partElapsed}ms, ${Math.round(throughput / 1024)}KB/s)`);
19934
19966
  }
19935
19967
  } finally{
19936
19968
  __WEBPACK_EXTERNAL_MODULE_node_fs_5ea92f0c__["default"].closeSync(fd);
19937
19969
  }
19938
- logger?.info("合并分片...");
19939
19970
  const completeRes = await http.api({
19940
19971
  method: "POST",
19941
19972
  url: `${baseUrl}/completepartuploaddfs?UploadID=${encodeURIComponent(uploadId)}`,
@@ -19953,7 +19984,7 @@ async function uploader_uploadFile(opts) {
19953
19984
  retryDelay: 3000
19954
19985
  });
19955
19986
  if (!completeRes.DownloadURL) throw new Error("合并分片失败: " + JSON.stringify(completeRes));
19956
- logger?.info("上传成功");
19987
+ logger?.info(`[shipinhaoPublishVideo] ${fileName} 上传成功`);
19957
19988
  return {
19958
19989
  downloadUrl: completeRes.DownloadURL,
19959
19990
  md5: fileMd5,
@@ -20347,7 +20378,6 @@ function buildCommonBody(finderUsername) {
20347
20378
  };
20348
20379
  }
20349
20380
  async function getTraceKey(auth, client, http, logger) {
20350
- logger.info("[getTraceKey] 开始获取 traceKey...");
20351
20381
  const res = await http.api({
20352
20382
  method: "POST",
20353
20383
  url: `${MICRO_CONTENT_BASE}/post/get-finder-post-trace-key`,
@@ -20362,11 +20392,9 @@ async function getTraceKey(auth, client, http, logger) {
20362
20392
  logger.error("[getTraceKey] 获取失败:", JSON.stringify(res));
20363
20393
  throw new Error(`获取 traceKey 失败: ${JSON.stringify(res)}`);
20364
20394
  }
20365
- logger.info(`[getTraceKey] 获取成功: ${res.data.traceKey}`);
20366
20395
  return res.data.traceKey;
20367
20396
  }
20368
20397
  async function getObjectTagKey(auth, client, http, logger) {
20369
- logger.info("[getObjectTagKey] 获取内容声明 tagKey...");
20370
20398
  try {
20371
20399
  const res = await http.api({
20372
20400
  method: "POST",
@@ -20382,7 +20410,6 @@ async function getObjectTagKey(auth, client, http, logger) {
20382
20410
  logger.warn(`[getObjectTagKey] 未取到 tagKey: ${JSON.stringify(res)}`);
20383
20411
  return null;
20384
20412
  }
20385
- logger.info(`[getObjectTagKey] tagKey: ${res.data.tagKey}`);
20386
20413
  return res.data.tagKey;
20387
20414
  } catch (error) {
20388
20415
  logger.warn(`[getObjectTagKey] 获取 tagKey 异常: ${stringifyError(error)}`);
@@ -20391,7 +20418,6 @@ async function getObjectTagKey(auth, client, http, logger) {
20391
20418
  }
20392
20419
  async function submitAndPollTranscode(opts) {
20393
20420
  const { videoUrl, videoMeta, traceKey, uploadStartTime, uploadEndTime, finderUsername, client, http, logger } = opts;
20394
- logger.info("[submitAndPollTranscode] 开始提交转码任务...");
20395
20421
  const finderUrl = videoUrl.includes("wxapp.tc.qq.com") ? `https://finder.video.qq.com${videoUrl.split("qq.com")[1]}` : videoUrl;
20396
20422
  logger.info(`[submitAndPollTranscode] 视频尺寸: ${videoMeta.width}x${videoMeta.height}, 时长: ${videoMeta.duration}s`);
20397
20423
  const submitRes = await http.api({
@@ -20430,12 +20456,10 @@ async function submitAndPollTranscode(opts) {
20430
20456
  throw new Error(`提交转码失败: ${JSON.stringify(submitRes)}`);
20431
20457
  }
20432
20458
  const { clipKey, draftId } = submitRes.data;
20433
- logger.info(`[submitAndPollTranscode] 转码任务已提交,clipKey: ${clipKey}, draftId: ${draftId}`);
20434
20459
  const pollInterval = 5000;
20435
20460
  const pollBudget = Math.min(1800000, 300000 + 1000 * Math.ceil(1.5 * videoMeta.duration));
20436
20461
  const maxPolls = Math.ceil(pollBudget / pollInterval);
20437
20462
  let pollCount = 0;
20438
- logger.info(`[submitAndPollTranscode] 开始轮询转码结果,最多 ${maxPolls} 次(${Math.round(pollBudget / 1000)}s),间隔 ${pollInterval / 1000}s`);
20439
20463
  while(pollCount < maxPolls){
20440
20464
  await sleep(pollInterval);
20441
20465
  pollCount++;
@@ -20459,14 +20483,12 @@ async function submitAndPollTranscode(opts) {
20459
20483
  throw new Error(`转码轮询失败 (poll ${pollCount}): ${JSON.stringify(pollRes)}`);
20460
20484
  }
20461
20485
  const { flag, url, width, height, duration, md5, fileSize } = pollRes.data || {};
20462
- logger.info(`[submitAndPollTranscode] 轮询第 ${pollCount} 次,flag=${flag}`);
20463
20486
  if (1 === flag) {
20464
20487
  if (!url || !width || !height || !duration || !md5 || !fileSize) {
20465
20488
  logger.error("[submitAndPollTranscode] 转码完成但返回数据不完整:", JSON.stringify(pollRes.data));
20466
20489
  throw new Error(`转码完成但返回数据不完整: ${JSON.stringify(pollRes.data)}`);
20467
20490
  }
20468
20491
  logger.info(`[submitAndPollTranscode] 转码完成! 用时: ${pollCount * pollInterval / 1000}s`);
20469
- logger.info(`[submitAndPollTranscode] 视频信息: ${width}x${height}, 时长: ${duration}s, 大小: ${fileSize}`);
20470
20492
  return {
20471
20493
  clipKey,
20472
20494
  url,
@@ -20477,7 +20499,7 @@ async function submitAndPollTranscode(opts) {
20477
20499
  fileSize
20478
20500
  };
20479
20501
  }
20480
- if (2 === flag) logger.info(`[submitAndPollTranscode] 转码中... (${pollCount}/${maxPolls})`);
20502
+ if (2 === flag) ;
20481
20503
  else {
20482
20504
  logger.error(`[submitAndPollTranscode] 转码失败,未知 flag=${flag}:`, JSON.stringify(pollRes.data));
20483
20505
  throw new Error(`转码失败,未知 flag=${flag}: ${JSON.stringify(pollRes.data)}`);
@@ -20488,16 +20510,11 @@ async function submitAndPollTranscode(opts) {
20488
20510
  }
20489
20511
  async function publishVideo(opts) {
20490
20512
  const { params, auth, client, clipResult, videoUpload, coverUpload, verticalCoverUpload, videoMeta, traceKey, tagKey, uploadStartTime, uploadEndTime, proxyHttp, logger } = opts;
20491
- logger.info("[publishVideo] 开始构建发布请求...");
20492
20513
  const toFinderUrl = (url)=>url.includes("wxapp.tc.qq.com") ? `https://finder.video.qq.com${url.split("qq.com")[1]}` : url;
20493
20514
  const thumbFinderUrl = toFinderUrl(coverUpload.downloadUrl);
20494
20515
  const coverFinderUrl = toFinderUrl(verticalCoverUpload.downloadUrl);
20495
20516
  const md5sumUuid = __WEBPACK_EXTERNAL_MODULE_node_crypto_9ba42079__["default"].randomUUID();
20496
20517
  const description = params.description;
20497
- logger.info("[publishVideo] 发布参数:");
20498
- logger.info(` - 短标题: ${params.title || "(无)"}`);
20499
- logger.info(` - 描述: ${description.substring(0, 50)}${description.length > 50 ? "..." : ""}`);
20500
- logger.info(` - 定时发布: ${params.scheduledTime ? new Date(1000 * params.scheduledTime).toLocaleString() : "立即发布"}`);
20501
20518
  const objectDesc = {
20502
20519
  mpTitle: "",
20503
20520
  description,
@@ -20571,7 +20588,6 @@ async function publishVideo(opts) {
20571
20588
  };
20572
20589
  if (params.scheduledTime) publishData.effectiveTime = params.scheduledTime;
20573
20590
  if (params.tagInfo && tagKey) publishData.tagInfo = buildTagInfo(params.tagInfo, tagKey);
20574
- logger.info("[publishVideo] 开始发布视频,全部参数:" + JSON.stringify(publishData));
20575
20591
  const publishRes = await proxyHttp.api({
20576
20592
  method: "POST",
20577
20593
  url: `${MICRO_CONTENT_BASE}/post/post_create`,
@@ -20579,7 +20595,7 @@ async function publishVideo(opts) {
20579
20595
  data: publishData,
20580
20596
  defaultErrorMsg: "发布视频失败"
20581
20597
  });
20582
- logger.info(`[publishVideo] 发布响应: errCode=${publishRes.errCode}, baseResp.errcode=${publishRes.data?.baseResp?.errcode}`);
20598
+ logger.info(`[publishVideo] 发布结果: errCode=${publishRes.errCode}, baseResp.errcode=${publishRes.data?.baseResp?.errcode}`);
20583
20599
  return publishRes;
20584
20600
  }
20585
20601
  function sleep(ms) {
@@ -20593,11 +20609,9 @@ async function resolveLocalCoverPath(coverPath, label, tmpCachePath, logger) {
20593
20609
  return savePath;
20594
20610
  }
20595
20611
  const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20596
- task.logger.info("[shipinhaoPublishVideo] 开始执行视频号视频发布 - Mock API 方式");
20597
20612
  const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
20598
20613
  let currentStep = "初始化";
20599
20614
  try {
20600
- task.logger.info(`[shipinhaoPublishVideo] 发布方式: ${params.scheduledTime ? `定时 ${new Date(1000 * params.scheduledTime).toLocaleString()}` : "立即发布"}`);
20601
20615
  currentStep = "解析认证信息";
20602
20616
  const cookieString = params.cookies.map((c)=>`${c.name}=${c.value}`).join("; ");
20603
20617
  const http = new Http({
@@ -20609,11 +20623,8 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20609
20623
  if (!params.videoPath) return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "视频文件路径不能为空", "");
20610
20624
  if (!params.coverPath) return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "横屏封面图片路径不能为空", "");
20611
20625
  currentStep = "获取上传认证";
20612
- task.logger.info("[shipinhaoPublishVideo] 获取上传认证...");
20613
20626
  const auth = await getShipinhaoUploadAuth(cookieString, http);
20614
20627
  const client = resolveClientContext(params, auth.uin);
20615
- if (!client.aId) task.logger.warn("[shipinhaoPublishVideo] extraParam.aId 缺失,query 将不带 _aid");
20616
- if (!client.fingerPrintDeviceId) task.logger.warn("[shipinhaoPublishVideo] extraParam.fingerPrintDeviceId 缺失,请求将不带 finger-print-device-id");
20617
20628
  const publishHeaders = buildPublishHeaders(cookieString, client);
20618
20629
  const microHttp = new Http({
20619
20630
  headers: publishHeaders
@@ -20629,25 +20640,20 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20629
20640
  ];
20630
20641
  const proxyHttp = new Http(...args);
20631
20642
  currentStep = "组装视频元数据";
20632
- task.logger.info("[shipinhaoPublishVideo] 组装视频元数据...");
20633
20643
  const videoMeta = buildVideoMetaFromParams(params.videoPath, params.videoMetadata);
20634
20644
  task.logger.info(`[shipinhaoPublishVideo] 视频: ${videoMeta.width}×${videoMeta.height}, ${videoMeta.duration.toFixed(2)}s, ${(videoMeta.fileSize / 1024 / 1024).toFixed(2)}MB, codec=${videoMeta.codec || "unknown"}`);
20635
- if (!videoMeta.codec) task.logger.warn("[shipinhaoPublishVideo] 未能读取视频编码格式,跳过 H.264 预检,交由服务端判断");
20636
20645
  currentStep = "校验视频限制";
20637
20646
  const validationError = validateShipinhaoVideo(params.videoPath, videoMeta);
20638
20647
  if (validationError) {
20639
- task.logger.error(`[shipinhaoPublishVideo] 视频校验未通过: ${validationError}`);
20640
20648
  await updateTaskState?.({
20641
20649
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
20642
20650
  error: validationError
20643
20651
  });
20644
20652
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, validationError, "");
20645
20653
  }
20646
- task.logger.info("[shipinhaoPublishVideo] 视频校验通过");
20647
20654
  currentStep = "校验标题";
20648
20655
  const titleError = validateShipinhaoTitle(params.title);
20649
20656
  if (titleError) {
20650
- task.logger.error(`[shipinhaoPublishVideo] 标题校验未通过: ${titleError}`);
20651
20657
  await updateTaskState?.({
20652
20658
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
20653
20659
  error: titleError
@@ -20655,7 +20661,6 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20655
20661
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, titleError, "");
20656
20662
  }
20657
20663
  currentStep = "获取 traceKey";
20658
- task.logger.info("[shipinhaoPublishVideo] 获取 traceKey...");
20659
20664
  const traceKey = await getTraceKey(auth, client, microHttp, task.logger);
20660
20665
  let tagKey = null;
20661
20666
  if (params.tagInfo) {
@@ -20663,11 +20668,7 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20663
20668
  tagKey = await getObjectTagKey(auth, client, microHttp, task.logger);
20664
20669
  }
20665
20670
  const uploadStartTime = Math.floor(Date.now() / 1000);
20666
- task.logger.info(`[shipinhaoPublishVideo] 上传开始时间: ${uploadStartTime}`);
20667
20671
  currentStep = "上传视频";
20668
- task.logger.info("[shipinhaoPublishVideo] 上传视频...");
20669
- task.logger.info(`[shipinhaoPublishVideo] 视频路径: ${params.videoPath}`);
20670
- task.logger.info(`[shipinhaoPublishVideo] 视频文件类型: ${auth.videoFileType}`);
20671
20672
  const videoUpload = await uploader_uploadFile({
20672
20673
  filePath: params.videoPath,
20673
20674
  fileType: auth.videoFileType,
@@ -20676,12 +20677,10 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20676
20677
  http,
20677
20678
  logger: task.logger
20678
20679
  });
20679
- task.logger.info("[shipinhaoPublishVideo] 视频上传完成");
20680
20680
  const uploadEndTime = Math.floor(Date.now() / 1000);
20681
- task.logger.info(`[shipinhaoPublishVideo] 上传结束时间: ${uploadEndTime}, 耗时: ${uploadEndTime - uploadStartTime}s`);
20681
+ task.logger.info(`[shipinhaoPublishVideo] 耗时: ${uploadEndTime - uploadStartTime}s`);
20682
20682
  currentStep = "上传横屏封面";
20683
20683
  const localCoverPath = await resolveLocalCoverPath(params.coverPath, "横屏封面", task.getTmpPath(), task.logger);
20684
- task.logger.info("[shipinhaoPublishVideo] 上传横屏封面...");
20685
20684
  const coverUpload = await uploader_uploadFile({
20686
20685
  filePath: localCoverPath,
20687
20686
  fileType: auth.pictureFileType,
@@ -20690,12 +20689,10 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20690
20689
  http,
20691
20690
  logger: task.logger
20692
20691
  });
20693
- task.logger.info("[shipinhaoPublishVideo] 横屏封面上传完成");
20694
20692
  let verticalCoverUpload = coverUpload;
20695
20693
  if (params.verticalCoverPath) {
20696
20694
  currentStep = "上传竖屏封面";
20697
20695
  const localVerticalPath = await resolveLocalCoverPath(params.verticalCoverPath, "竖屏封面", task.getTmpPath(), task.logger);
20698
- task.logger.info("[shipinhaoPublishVideo] 上传竖屏封面");
20699
20696
  verticalCoverUpload = await uploader_uploadFile({
20700
20697
  filePath: localVerticalPath,
20701
20698
  fileType: auth.pictureFileType,
@@ -20704,10 +20701,8 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20704
20701
  http,
20705
20702
  logger: task.logger
20706
20703
  });
20707
- task.logger.info("[shipinhaoPublishVideo] 竖屏封面上传完成");
20708
- } else task.logger.info("[shipinhaoPublishVideo] 未传竖屏封面,复用横屏封面");
20704
+ }
20709
20705
  currentStep = "提交转码";
20710
- task.logger.info("[shipinhaoPublishVideo] 提交转码...");
20711
20706
  const clipResult = await submitAndPollTranscode({
20712
20707
  videoUrl: videoUpload.downloadUrl,
20713
20708
  videoMeta,
@@ -20720,8 +20715,6 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20720
20715
  logger: task.logger
20721
20716
  });
20722
20717
  currentStep = "发布视频";
20723
- task.logger.info("[shipinhaoPublishVideo] 发布视频...");
20724
- task.logger.info(`[shipinhaoPublishVideo] clipKey: ${clipResult.clipKey}`);
20725
20718
  let publishResult;
20726
20719
  try {
20727
20720
  publishResult = await publishVideo({
@@ -20746,7 +20739,6 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20746
20739
  const classified = classifyPublishError(handledError);
20747
20740
  if (classified) {
20748
20741
  const message = `${classified.userMessage}${task.debug ? ` ${http.proxyInfo}` : ""}`;
20749
- task.logger.error(`[shipinhaoPublishVideo] ${classified.category},直接返回: ${handledError.message} (code=${handledError.code})`, stringifyError(handledError));
20750
20742
  await updateTaskState?.({
20751
20743
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
20752
20744
  error: message
@@ -20763,11 +20755,8 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20763
20755
  const resultCode = publishResult.data?.baseResp?.errcode ?? publishResult.errCode;
20764
20756
  const resultMsg = publishResult.data?.baseResp?.errmsg ?? (0 === resultCode ? "发布成功" : `发布失败(errCode=${resultCode})`);
20765
20757
  if (0 === resultCode) {
20766
- task.logger.info("[shipinhaoPublishVideo] 发布成功");
20767
- task.logger.info(`[shipinhaoPublishVideo] 作品ID: ${clipResult.clipKey}`);
20768
- task.logger.info(`[shipinhaoPublishVideo] 视频URL: ${clipResult.url}`);
20769
- task.logger.info(`[shipinhaoPublishVideo] 横屏封面URL: ${coverUpload.downloadUrl}`);
20770
- task.logger.info(`[shipinhaoPublishVideo] 竖屏封面URL: ${verticalCoverUpload.downloadUrl}`);
20758
+ const publishId = extractEncFileKey(verticalCoverUpload.downloadUrl);
20759
+ if (!publishId) task.logger.error(`[shipinhaoPublishVideo] 封面 DownloadURL 中未解析到 encfilekey,关联 id 为空: ${verticalCoverUpload.downloadUrl}`);
20771
20760
  await updateTaskState?.({
20772
20761
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
20773
20762
  result: {
@@ -20797,8 +20786,7 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20797
20786
  },
20798
20787
  platform: "shipinhao"
20799
20788
  });
20800
- task.logger.info("[shipinhaoPublishVideo] 日志上报完成");
20801
- return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, "发布成功", clipResult.clipKey);
20789
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, "发布成功", publishId);
20802
20790
  }
20803
20791
  let errorMessage = resultMsg;
20804
20792
  if (-11224 === resultCode) errorMessage = "视频号管理员完成实名且绑定手机号后才可以发表";
@@ -20810,18 +20798,16 @@ const shipinhaoPublishVideo_mock_mockAction = async (task, params)=>{
20810
20798
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
20811
20799
  error: errorMessage
20812
20800
  });
20813
- return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(resultCode || 414, errorMessage, "");
20801
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, errorMessage, "");
20814
20802
  } catch (error) {
20815
20803
  const handledError = Http.handleApiError(error);
20816
20804
  const errorMsg = handledError.message || "发布失败,请稍后重试";
20817
- const errorCode = handledError.code || 414;
20818
20805
  task.logger.error(`[shipinhaoPublishVideo] 发布流程异常 [${currentStep}]: ${errorMsg}`, stringifyError(error), handledError.extra);
20819
- task.logger.error(`[shipinhaoPublishVideo] 错误码: ${errorCode}, 当前步骤: ${currentStep}`);
20820
20806
  await updateTaskState?.({
20821
20807
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
20822
20808
  error: errorMsg
20823
20809
  });
20824
- return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(errorCode, errorMsg, "");
20810
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, errorMsg, "");
20825
20811
  }
20826
20812
  };
20827
20813
  const shipinhaoPublishVideo_rpa_rpaAction = async (task, params)=>{
@@ -27389,4 +27375,4 @@ var __webpack_exports__version = package_namespaceObject.i8;
27389
27375
  export { Action, ActionCommonParamsSchema, BaijiahaoPublishParamsSchema, BetaFlag, CollectionDetailSchema, ConfigDataSchema, DouyinCheckVerifyQrCodeParamsSchema, DouyinCreateCommentReplyParamsSchema, DouyinGetCollectionParamsSchema, DouyinGetCommentListParamsSchema, DouyinGetCommentReplyListParamsSchema, DouyinGetHotParamsSchema, DouyinGetLocationParamsSchema, DouyinGetMusicByCategoryParamsSchema, DouyinGetMusicCategoryParamsSchema, DouyinGetMusicParamsSchema, DouyinGetTopicsParamsSchema, DouyinGetVerifyQrCodeParamsSchema, DouyinGetWorkListParamsSchema, DouyinPublishParamsSchema, FetchArticlesDataSchema, FetchArticlesParamsSchema, Http, ProxyAgent, SearchAccountInfoParamsSchema, SessionCheckResultSchema, ShipinhaoCheckLinkValidateParamsSchema, ShipinhaoGetLocationParamsSchema, ShipinhaoGetMsgParamsSchema, ShipinhaoPublishParamsSchema, ShipinhaoPublishVideoParamsSchema, ShipinhaoSendMsgParamsSchema, ToutiaoPublishParamsSchema, UnreadCountSchema, WeixinPublishParamsSchema, WxBjhSessionParamsSchema, XhsWebSearchParamsSchema, XiaohongshuPublishParamsSchema, bjhConfigDataSchema, douyinConfigDataSchema, getFileState, reportLogger, rpaAction_Server_Mock, shipinhaoConfigDataSchema, ttConfigDataSchema, wxConfigDataSchema, xhsConfigDataSchema, __webpack_exports__version as version };
27390
27376
 
27391
27377
  //# sourceMappingURL=index.mjs.map
27392
- //# debugId=8d2e6460-75c8-5b65-9b60-d4269a0ff597
27378
+ //# debugId=47f14957-3de9-5f22-92f5-89210082b96d