@iflyrpa/actions 4.0.0-beta.0 → 4.0.0-beta.10

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,9 +5434,7 @@ function __webpack_require__(moduleId) {
5434
5434
  return module;
5435
5435
  };
5436
5436
  })();
5437
- var package_namespaceObject = {
5438
- i8: "3.0.4"
5439
- };
5437
+ var package_namespaceObject = JSON.parse('{"i8":"4.0.0-beta.9"}');
5440
5438
  var dist = __webpack_require__("../../node_modules/.pnpm/https-proxy-agent@7.0.6/node_modules/https-proxy-agent/dist/index.js");
5441
5439
  async function ProxyAgent(task, ip, adr, accountId, refresh) {
5442
5440
  const http = new Http({
@@ -5526,6 +5524,13 @@ class Http {
5526
5524
  }
5527
5525
  };
5528
5526
  if (foundError) Object.assign(errorResponse, foundError);
5527
+ if (error.response?.status === 403) {
5528
+ this.logger?.warn(`[403 详细信息] URL: ${error.config?.url}`);
5529
+ this.logger?.warn(`[403 响应头] ${JSON.stringify(error.response?.headers || {})}`);
5530
+ this.logger?.warn(`[403 响应体] ${JSON.stringify(error.response?.data || null)}`);
5531
+ const verifyDecision = error.response?.headers?.["x-tt-verify-passport-decision"];
5532
+ if (verifyDecision) this.logger?.warn(`[403 验证决策] x-tt-verify-passport-decision: ${verifyDecision}`);
5533
+ }
5529
5534
  if (error.response?.data) {
5530
5535
  if ("object" == typeof error.response.data) {
5531
5536
  const serverError = error.response.data;
@@ -5617,7 +5622,7 @@ class Http {
5617
5622
  599
5618
5623
  ].includes(handledError.code);
5619
5624
  if (Rtimes < retries && isRetry) {
5620
- this.logger?.info(`进入第${Rtimes + 1}次重试!`);
5625
+ this.logger?.info(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}`);
5621
5626
  await new Promise((resolve)=>setTimeout(resolve, retryDelay));
5622
5627
  return sessionRt(Rtimes + 1);
5623
5628
  }
@@ -11815,16 +11820,35 @@ const WxSessionCheck = async (_task, params)=>{
11815
11820
  }, "微信账号有效性检测完成!");
11816
11821
  };
11817
11822
  const XhsSessionCheck = async (_task, params)=>{
11823
+ const logger = _task.logger;
11824
+ const startedAt = Date.now();
11818
11825
  const check = {
11819
11826
  isValidSession: false,
11820
11827
  isValidWebSession: false
11821
11828
  };
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
+ });
11822
11840
  const a1Cookie = params.cookies.find((it)=>"a1" === it.name)?.value;
11823
- if (!a1Cookie) return {
11824
- code: 414,
11825
- message: "账号数据异常,请重新绑定账号后重试。",
11826
- data: check
11827
- };
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
+ }
11828
11852
  const headers = {
11829
11853
  cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
11830
11854
  referer: "https://creator.xiaohongshu.com/new/home?source=official"
@@ -11852,6 +11876,7 @@ const XhsSessionCheck = async (_task, params)=>{
11852
11876
  return acc;
11853
11877
  }, {});
11854
11878
  const loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
11879
+ const baseInfoStart = Date.now();
11855
11880
  const _baseInfo = http.api({
11856
11881
  method: "get",
11857
11882
  baseURL: "https://creator.xiaohongshu.com",
@@ -11861,7 +11886,28 @@ const XhsSessionCheck = async (_task, params)=>{
11861
11886
  retries: 3,
11862
11887
  retryDelay: 20,
11863
11888
  timeout: 3000
11864
- }).catch((e)=>e.data);
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;
11898
+ }).catch((e)=>{
11899
+ logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
11900
+ accountId: params.accountId,
11901
+ duration: Date.now() - baseInfoStart,
11902
+ code: e?.code,
11903
+ message: e?.message,
11904
+ data: e?.data,
11905
+ extra: e?.extra,
11906
+ proxyInfo: http.proxyInfo
11907
+ });
11908
+ return e.data;
11909
+ });
11910
+ const webSessionStart = Date.now();
11865
11911
  const _web_session = http.api({
11866
11912
  method: "get",
11867
11913
  url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
@@ -11869,6 +11915,26 @@ const XhsSessionCheck = async (_task, params)=>{
11869
11915
  retries: 3,
11870
11916
  retryDelay: 20,
11871
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;
11872
11938
  });
11873
11939
  const [baseInfo, web_session] = await Promise.all([
11874
11940
  _baseInfo,
@@ -11876,8 +11942,18 @@ const XhsSessionCheck = async (_task, params)=>{
11876
11942
  ]);
11877
11943
  if (baseInfo?.code === 0) check.isValidSession = true;
11878
11944
  if (0 === web_session.code) check.isValidWebSession = true;
11879
- baseInfo?.code, web_session.code;
11945
+ const _isSuccess = baseInfo?.code === web_session.code;
11880
11946
  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
+ });
11881
11957
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(check, message);
11882
11958
  };
11883
11959
  const BjhSessionCheck = async (_task, params)=>{
@@ -14406,7 +14482,10 @@ const mock_mockAction = async (task, params)=>{
14406
14482
  task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
14407
14483
  decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
14408
14484
  if (needsVerification(decision)) {
14409
- task.logger.info(`需要验证: ${JSON.stringify(decision)}`);
14485
+ task.logger.warn(`检测到需要验证: ${JSON.stringify(decision)}`);
14486
+ task.logger.warn(`验证类型: ${decision?.verify_ways?.join(", ")}`);
14487
+ task.logger.warn(`验证标题: ${decision?.verify_title}`);
14488
+ task.logger.warn(`验证描述: ${decision?.verify_desc}`);
14410
14489
  return;
14411
14490
  }
14412
14491
  if (!response || !response.data) return;
@@ -14433,38 +14512,105 @@ const mock_mockAction = async (task, params)=>{
14433
14512
  });
14434
14513
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, message, data);
14435
14514
  }
14436
- const webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
14515
+ let webProtectData;
14516
+ try {
14517
+ webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
14518
+ if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
14519
+ task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
14520
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
14521
+ }
14522
+ } catch (error) {
14523
+ task.logger.error(`解析 webProtectData 失败: ${error}`);
14524
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
14525
+ }
14437
14526
  const ticket = webProtectData.ticket;
14438
14527
  const ts_sign = webProtectData.ts_sign;
14439
- const ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
14440
- const certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
14528
+ let ec_privateKey;
14529
+ try {
14530
+ ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
14531
+ if (!ec_privateKey) {
14532
+ task.logger.error("ec_privateKey 为空");
14533
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
14534
+ }
14535
+ } catch (error) {
14536
+ task.logger.error(`解析 ec_privateKey 失败: ${error}`);
14537
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
14538
+ }
14539
+ let certificate;
14540
+ try {
14541
+ certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
14542
+ if (!certificate) {
14543
+ task.logger.error("certificate 为空");
14544
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
14545
+ }
14546
+ } catch (error) {
14547
+ task.logger.error(`解析 certificate 失败: ${error}`);
14548
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
14549
+ }
14441
14550
  const ree_public_key = webProtectData.client_cert.replace("pub.", "");
14442
- task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket}, ts_sign: ${ts_sign}, ec_privateKey: ${ec_privateKey}, certificate: ${certificate}, ree_public_key: ${ree_public_key}`);
14443
- const bdTicketGuardClientData = getBdV2({
14444
- ticket,
14445
- ts_sign: ts_sign,
14446
- ec_privateKey: ec_privateKey,
14447
- certificate: certificate,
14448
- bd_ticket_guard_ree_public_key: ree_public_key
14449
- });
14450
- task.logger.info("bdTicketGuardClientData", {
14451
- bdTicketGuardClientData
14452
- });
14551
+ task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket?.substring(0, 20)}..., ts_sign: ${ts_sign}, ree_public_key: ${ree_public_key?.substring(0, 20)}...`);
14552
+ let bdTicketGuardClientData;
14553
+ try {
14554
+ bdTicketGuardClientData = getBdV2({
14555
+ ticket,
14556
+ ts_sign: ts_sign,
14557
+ ec_privateKey: ec_privateKey,
14558
+ certificate: certificate,
14559
+ bd_ticket_guard_ree_public_key: ree_public_key
14560
+ });
14561
+ if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
14562
+ task.logger.error(`bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
14563
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
14564
+ }
14565
+ } catch (error) {
14566
+ task.logger.error(`生成 bdTicketGuardClientData 失败: ${error}`);
14567
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
14568
+ }
14569
+ task.logger.info("bdTicketGuardClientData 生成成功");
14453
14570
  const publishQuery = {
14454
14571
  ...publishParams,
14455
14572
  a_bogus: ""
14456
14573
  };
14457
14574
  const queryString = new URLSearchParams(publishQuery).toString();
14458
- const aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
14575
+ let aBogus;
14576
+ try {
14577
+ aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
14578
+ if (!aBogus || aBogus.length < 10) {
14579
+ task.logger.error(`a_bogus 生成异常,长度过短: ${aBogus}`);
14580
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
14581
+ }
14582
+ task.logger.info(`a_bogus 生成成功: ${aBogus.substring(0, 20)}...`);
14583
+ } catch (error) {
14584
+ task.logger.error(`生成 a_bogus 失败: ${error}`);
14585
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
14586
+ }
14459
14587
  publishQuery.a_bogus = aBogus;
14460
14588
  const publishQueryParams = new URLSearchParams(publishQuery).toString();
14461
- const csrfToken = mock_generateCsrfTokenAdvanced({
14462
- cookies: params.cookies,
14463
- url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
14464
- method: "POST",
14465
- userAgent
14466
- });
14467
- const sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
14589
+ let csrfToken;
14590
+ try {
14591
+ csrfToken = mock_generateCsrfTokenAdvanced({
14592
+ cookies: params.cookies,
14593
+ url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
14594
+ method: "POST",
14595
+ userAgent
14596
+ });
14597
+ if (!csrfToken || csrfToken.length < 10) {
14598
+ task.logger.error(`csrfToken 生成异常,长度过短: ${csrfToken}`);
14599
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
14600
+ }
14601
+ task.logger.info(`csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
14602
+ } catch (error) {
14603
+ task.logger.error(`生成 csrfToken 失败: ${error}`);
14604
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
14605
+ }
14606
+ let sessionDtrait;
14607
+ try {
14608
+ sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
14609
+ task.logger.info(`sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
14610
+ } catch (error) {
14611
+ task.logger.error(`生成 sessionDtrait 失败: ${error}`);
14612
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
14613
+ }
14468
14614
  task.logger.info("发布数据", {
14469
14615
  data: JSON.stringify(publishData)
14470
14616
  });
@@ -14506,6 +14652,35 @@ const mock_mockAction = async (task, params)=>{
14506
14652
  retries: 3,
14507
14653
  retryDelay: 2000
14508
14654
  });
14655
+ task.logger.info("========== api调用完成 ==========");
14656
+ task.logger.info(`decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
14657
+ if (needsVerification(decision)) {
14658
+ const details = [
14659
+ publishResult.status_msg,
14660
+ decision?.verify_title,
14661
+ decision?.verify_desc
14662
+ ].filter(Boolean).join(" ");
14663
+ const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
14664
+ task.logger.warn(`TaskId:${task.taskId},检测到需要验证,准备返回验证信息`);
14665
+ let decisionObj = {};
14666
+ if (decision) decisionObj = decision;
14667
+ const mockData = {
14668
+ state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
14669
+ error: message,
14670
+ result: {
14671
+ ...decisionObj,
14672
+ data: decision,
14673
+ uploadedImgList: JSON.stringify(publishData.item.common.images)
14674
+ }
14675
+ };
14676
+ await updateTaskState?.(mockData);
14677
+ return {
14678
+ code: 0,
14679
+ data: mockData,
14680
+ message: "操作成功"
14681
+ };
14682
+ }
14683
+ task.logger.info("不需要验证,继续正常流程");
14509
14684
  reportLogger({
14510
14685
  token: params.huiwenToken || "",
14511
14686
  enverionment: task.enverionment || "development",
@@ -14523,10 +14698,13 @@ const mock_mockAction = async (task, params)=>{
14523
14698
  const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
14524
14699
  const data = isSuccess ? publishResult.item_id || "" : "";
14525
14700
  if (!isSuccess) {
14701
+ let decisionObj = {};
14702
+ if (decision) decisionObj = decision;
14526
14703
  await updateTaskState?.({
14527
14704
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
14528
14705
  error: message,
14529
14706
  result: {
14707
+ ...decisionObj,
14530
14708
  data: decision,
14531
14709
  uploadedImgList: JSON.stringify(publishData.item.common.images)
14532
14710
  }
@@ -15201,15 +15379,41 @@ const rpaAction_Server = async (task, params)=>{
15201
15379
  }
15202
15380
  task.logger?.info("准备发布...");
15203
15381
  await page.waitForTimeout(1000);
15204
- const response = await new Promise((resolve, reject)=>{
15382
+ const result = await new Promise((resolve, reject)=>{
15205
15383
  const handleResponse = async (res)=>{
15206
15384
  if (res.url().includes("/web/api/media/aweme/create_v2")) {
15207
15385
  task.logger?.info("匹配到发布接口响应");
15386
+ let decision = null;
15387
+ try {
15388
+ const headers = await res.allHeaders();
15389
+ decision = parseVerifyPassportDecision(headers["x-tt-verify-passport-decision"]);
15390
+ } catch (error) {
15391
+ task.logger?.warn(`解析验证决策头失败: ${error}`);
15392
+ }
15208
15393
  const jsonResponse = await res.json();
15209
15394
  task.logger?.info(`发布接口响应数据: ${JSON.stringify(jsonResponse)}`);
15210
15395
  page.off("response", handleResponse);
15211
- if (jsonResponse?.status_code === 0) resolve(jsonResponse?.data?.item_id || jsonResponse?.item_id || "");
15212
- else reject(new Error(jsonResponse?.status_msg || "发布失败"));
15396
+ if (needsVerification(decision)) {
15397
+ task.logger?.warn("检测到需要二次验证,文章未真正发布");
15398
+ resolve({
15399
+ itemId: "",
15400
+ decision
15401
+ });
15402
+ return;
15403
+ }
15404
+ if (jsonResponse?.status_code !== 0) {
15405
+ reject(new Error(jsonResponse?.status_msg || "发布失败"));
15406
+ return;
15407
+ }
15408
+ const itemId = jsonResponse?.data?.item_id || jsonResponse?.item_id || "";
15409
+ if (!itemId) {
15410
+ reject(new Error(jsonResponse?.status_msg || "发布异常:未返回作品ID,文章可能未真正发布"));
15411
+ return;
15412
+ }
15413
+ resolve({
15414
+ itemId,
15415
+ decision: null
15416
+ });
15213
15417
  }
15214
15418
  };
15215
15419
  page.on("response", handleResponse);
@@ -15231,20 +15435,42 @@ const rpaAction_Server = async (task, params)=>{
15231
15435
  await page.close();
15232
15436
  return null;
15233
15437
  });
15234
- if (!response && "" !== response) return {
15438
+ if (!result) return {
15235
15439
  code: 414,
15236
15440
  message: "发布失败",
15237
15441
  data: ""
15238
15442
  };
15239
- task.logger?.info(`✓ 发布成功,item_id: ${response}`);
15443
+ if (needsVerification(result.decision)) {
15444
+ const decision = result.decision;
15445
+ const details = [
15446
+ decision?.verify_title,
15447
+ decision?.verify_desc
15448
+ ].filter(Boolean).join(" ");
15449
+ const message = `发布失败,需要二次验证${details ? `:${details}` : ""}`;
15450
+ task.logger?.warn(message);
15451
+ await updateTaskState?.({
15452
+ state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
15453
+ error: message,
15454
+ result: {
15455
+ data: decision
15456
+ }
15457
+ });
15458
+ await page.close();
15459
+ return {
15460
+ code: 414,
15461
+ message,
15462
+ data: ""
15463
+ };
15464
+ }
15465
+ task.logger?.info(`✓ 发布成功,item_id: ${result.itemId}`);
15240
15466
  await updateTaskState?.({
15241
15467
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
15242
15468
  result: {
15243
- response
15469
+ response: result.itemId
15244
15470
  }
15245
15471
  });
15246
15472
  await page.close();
15247
- return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(response);
15473
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(result.itemId);
15248
15474
  };
15249
15475
  const DouyinPublishParamsSchema = ActionCommonParamsSchema.extend({
15250
15476
  title: schemas_string(),
@@ -16024,26 +16250,26 @@ async function getToutiaoData(_task, params) {
16024
16250
  const http = new Http({
16025
16251
  headers: {
16026
16252
  cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
16027
- referer: "https://mp.toutiao.com/profile_v4/graphic/publish"
16253
+ referer: "https://mp.toutiao.com/profile_v4/graphic/publish",
16254
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
16255
+ }
16256
+ });
16257
+ const totalData = await http.api({
16258
+ method: "get",
16259
+ url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
16260
+ params: {
16261
+ app_id: 1231
16262
+ }
16263
+ });
16264
+ await new Promise((r)=>setTimeout(r, 1000));
16265
+ const contentDataYesterday = await http.api({
16266
+ method: "get",
16267
+ url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
16268
+ params: {
16269
+ type: 0,
16270
+ app_id: 1231
16028
16271
  }
16029
16272
  });
16030
- const [totalData, contentDataYesterday] = await Promise.all([
16031
- http.api({
16032
- method: "get",
16033
- url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
16034
- params: {
16035
- app_id: 1231
16036
- }
16037
- }),
16038
- http.api({
16039
- method: "get",
16040
- url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
16041
- params: {
16042
- type: 0,
16043
- app_id: 1231
16044
- }
16045
- })
16046
- ]);
16047
16273
  const isSuccess = !!(totalData?.data?.statistic && contentDataYesterday?.author_stat);
16048
16274
  if (!isSuccess || !totalData?.data || !contentDataYesterday?.author_stat) return types_errorResponse(totalData?.message || contentDataYesterday?.message || "头条号数据获取失败,请检查Cookie是否有效", 414);
16049
16275
  const ttData = {
@@ -20216,8 +20442,10 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
20216
20442
  tuwen_wtt_trans_flag: params.settingInfo?.toutiaoTransWtt ? "2" : "0",
20217
20443
  info_source: sourceData,
20218
20444
  ...location ? {
20219
- city: location.label,
20220
- city_code: location.value
20445
+ manual_selected_city: JSON.stringify({
20446
+ city: location.label,
20447
+ city_code: location.value
20448
+ })
20221
20449
  } : null,
20222
20450
  ...params.settingInfo?.toutiaoCollectionId ? {
20223
20451
  want_join_collection_id: params.settingInfo.toutiaoCollectionId
@@ -20267,6 +20495,12 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
20267
20495
  claim_exclusive: toutiaoExclusive ? toutiaoExclusive : toutiaoOriginal?.includes("exclusive") ? 1 : 0
20268
20496
  };
20269
20497
  task._timerRecord.PrePublish = Date.now();
20498
+ task.logger.info(`[toutiaoPublish] ${"draft" === params.saveType ? "同步草稿" : "发布文章"}参数`, {
20499
+ saveType: params.saveType,
20500
+ title: params.title,
20501
+ extra: extraData,
20502
+ publishData
20503
+ });
20270
20504
  const msToken = params.cookies.find((it)=>"msToken" === it.name)?.value;
20271
20505
  let publishOption = {};
20272
20506
  if (msToken) {
@@ -21462,8 +21696,8 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
21462
21696
  headers
21463
21697
  });
21464
21698
  const proxyHttp = new Http(...args);
21465
- proxyHttp.addResponseInterceptor((response)=>{
21466
- const responseData = response.data;
21699
+ const baseRespFinder = (response)=>{
21700
+ const responseData = response?.data;
21467
21701
  const msgType = "draft" === params.saveType ? "同步" : "发布";
21468
21702
  if (response && responseData?.base_resp && 0 !== responseData.base_resp.ret && !ignoreErrno.includes(responseData.base_resp.ret)) {
21469
21703
  const errmsg = weixinPublish_mock_errnoMap[responseData.base_resp.ret] || response.config.defaultErrorMsg || responseData.base_resp.err_msg || `文章${msgType}异常,请稍后重试。`;
@@ -21473,7 +21707,9 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
21473
21707
  data: responseData
21474
21708
  };
21475
21709
  }
21476
- });
21710
+ };
21711
+ http.addResponseInterceptor(baseRespFinder);
21712
+ proxyHttp.addResponseInterceptor(baseRespFinder);
21477
21713
  await http.api({
21478
21714
  method: "get",
21479
21715
  url: "https://mp.weixin.qq.com/cgi-bin/appmsgpublish",