@iflyrpa/actions 4.0.0-beta.1 → 4.0.0-beta.12

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":"3.0.5-beta.0"}');
5437
+ var package_namespaceObject = JSON.parse('{"i8":"4.0.0-beta.11"}');
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({
@@ -5622,7 +5622,7 @@ class Http {
5622
5622
  599
5623
5623
  ].includes(handledError.code);
5624
5624
  if (Rtimes < retries && isRetry) {
5625
- this.logger?.info(`进入第${Rtimes + 1}次重试!`);
5625
+ this.logger?.info(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}`);
5626
5626
  await new Promise((resolve)=>setTimeout(resolve, retryDelay));
5627
5627
  return sessionRt(Rtimes + 1);
5628
5628
  }
@@ -11820,16 +11820,35 @@ const WxSessionCheck = async (_task, params)=>{
11820
11820
  }, "微信账号有效性检测完成!");
11821
11821
  };
11822
11822
  const XhsSessionCheck = async (_task, params)=>{
11823
+ const logger = _task.logger;
11824
+ const startedAt = Date.now();
11823
11825
  const check = {
11824
11826
  isValidSession: false,
11825
11827
  isValidWebSession: false
11826
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
+ });
11827
11840
  const a1Cookie = params.cookies.find((it)=>"a1" === it.name)?.value;
11828
- if (!a1Cookie) return {
11829
- code: 414,
11830
- message: "账号数据异常,请重新绑定账号后重试。",
11831
- data: check
11832
- };
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
+ }
11833
11852
  const headers = {
11834
11853
  cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
11835
11854
  referer: "https://creator.xiaohongshu.com/new/home?source=official"
@@ -11857,6 +11876,7 @@ const XhsSessionCheck = async (_task, params)=>{
11857
11876
  return acc;
11858
11877
  }, {});
11859
11878
  const loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
11879
+ const baseInfoStart = Date.now();
11860
11880
  const _baseInfo = http.api({
11861
11881
  method: "get",
11862
11882
  baseURL: "https://creator.xiaohongshu.com",
@@ -11866,7 +11886,28 @@ const XhsSessionCheck = async (_task, params)=>{
11866
11886
  retries: 3,
11867
11887
  retryDelay: 20,
11868
11888
  timeout: 3000
11869
- }).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();
11870
11911
  const _web_session = http.api({
11871
11912
  method: "get",
11872
11913
  url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
@@ -11874,6 +11915,26 @@ const XhsSessionCheck = async (_task, params)=>{
11874
11915
  retries: 3,
11875
11916
  retryDelay: 20,
11876
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;
11877
11938
  });
11878
11939
  const [baseInfo, web_session] = await Promise.all([
11879
11940
  _baseInfo,
@@ -11881,8 +11942,18 @@ const XhsSessionCheck = async (_task, params)=>{
11881
11942
  ]);
11882
11943
  if (baseInfo?.code === 0) check.isValidSession = true;
11883
11944
  if (0 === web_session.code) check.isValidWebSession = true;
11884
- baseInfo?.code, web_session.code;
11945
+ const _isSuccess = baseInfo?.code === web_session.code;
11885
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
+ });
11886
11957
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(check, message);
11887
11958
  };
11888
11959
  const BjhSessionCheck = async (_task, params)=>{
@@ -14411,7 +14482,10 @@ const mock_mockAction = async (task, params)=>{
14411
14482
  task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
14412
14483
  decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
14413
14484
  if (needsVerification(decision)) {
14414
- 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}`);
14415
14489
  return;
14416
14490
  }
14417
14491
  if (!response || !response.data) return;
@@ -14438,38 +14512,116 @@ const mock_mockAction = async (task, params)=>{
14438
14512
  });
14439
14513
  return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, message, data);
14440
14514
  }
14441
- const webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
14442
- const ticket = webProtectData.ticket;
14443
- const ts_sign = webProtectData.ts_sign;
14444
- const ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
14445
- const certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
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
+ }
14526
+ let ticket = webProtectData.ticket;
14527
+ let ts_sign = webProtectData.ts_sign;
14528
+ const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
14529
+ if (serverDataCookie) try {
14530
+ const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
14531
+ if (decoded.ticket && decoded.ts_sign) {
14532
+ if (decoded.ticket !== ticket) task.logger.info("使用 cookie 中的最新 ticket(web_protect 已过期)");
14533
+ ticket = decoded.ticket;
14534
+ ts_sign = decoded.ts_sign;
14535
+ }
14536
+ } catch (error) {
14537
+ task.logger.warn(`解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
14538
+ }
14539
+ let ec_privateKey;
14540
+ try {
14541
+ ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
14542
+ if (!ec_privateKey) {
14543
+ task.logger.error("ec_privateKey 为空");
14544
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
14545
+ }
14546
+ } catch (error) {
14547
+ task.logger.error(`解析 ec_privateKey 失败: ${error}`);
14548
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
14549
+ }
14550
+ let certificate;
14551
+ try {
14552
+ certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
14553
+ if (!certificate) {
14554
+ task.logger.error("certificate 为空");
14555
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
14556
+ }
14557
+ } catch (error) {
14558
+ task.logger.error(`解析 certificate 失败: ${error}`);
14559
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
14560
+ }
14446
14561
  const ree_public_key = webProtectData.client_cert.replace("pub.", "");
14447
- task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket}, ts_sign: ${ts_sign}, ec_privateKey: ${ec_privateKey}, certificate: ${certificate}, ree_public_key: ${ree_public_key}`);
14448
- const bdTicketGuardClientData = getBdV2({
14449
- ticket,
14450
- ts_sign: ts_sign,
14451
- ec_privateKey: ec_privateKey,
14452
- certificate: certificate,
14453
- bd_ticket_guard_ree_public_key: ree_public_key
14454
- });
14455
- task.logger.info("bdTicketGuardClientData", {
14456
- bdTicketGuardClientData
14457
- });
14562
+ task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket?.substring(0, 20)}..., ts_sign: ${ts_sign}, ree_public_key: ${ree_public_key?.substring(0, 20)}...`);
14563
+ let bdTicketGuardClientData;
14564
+ try {
14565
+ bdTicketGuardClientData = getBdV2({
14566
+ ticket,
14567
+ ts_sign: ts_sign,
14568
+ ec_privateKey: ec_privateKey,
14569
+ certificate: certificate,
14570
+ bd_ticket_guard_ree_public_key: ree_public_key
14571
+ });
14572
+ if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
14573
+ task.logger.error(`bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
14574
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
14575
+ }
14576
+ } catch (error) {
14577
+ task.logger.error(`生成 bdTicketGuardClientData 失败: ${error}`);
14578
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
14579
+ }
14580
+ task.logger.info("bdTicketGuardClientData 生成成功");
14458
14581
  const publishQuery = {
14459
14582
  ...publishParams,
14460
14583
  a_bogus: ""
14461
14584
  };
14462
14585
  const queryString = new URLSearchParams(publishQuery).toString();
14463
- const aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
14586
+ let aBogus;
14587
+ try {
14588
+ aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
14589
+ if (!aBogus || aBogus.length < 10) {
14590
+ task.logger.error(`a_bogus 生成异常,长度过短: ${aBogus}`);
14591
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
14592
+ }
14593
+ task.logger.info(`a_bogus 生成成功: ${aBogus.substring(0, 20)}...`);
14594
+ } catch (error) {
14595
+ task.logger.error(`生成 a_bogus 失败: ${error}`);
14596
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
14597
+ }
14464
14598
  publishQuery.a_bogus = aBogus;
14465
14599
  const publishQueryParams = new URLSearchParams(publishQuery).toString();
14466
- const csrfToken = mock_generateCsrfTokenAdvanced({
14467
- cookies: params.cookies,
14468
- url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
14469
- method: "POST",
14470
- userAgent
14471
- });
14472
- const sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
14600
+ let csrfToken;
14601
+ try {
14602
+ csrfToken = mock_generateCsrfTokenAdvanced({
14603
+ cookies: params.cookies,
14604
+ url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
14605
+ method: "POST",
14606
+ userAgent
14607
+ });
14608
+ if (!csrfToken || csrfToken.length < 10) {
14609
+ task.logger.error(`csrfToken 生成异常,长度过短: ${csrfToken}`);
14610
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
14611
+ }
14612
+ task.logger.info(`csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
14613
+ } catch (error) {
14614
+ task.logger.error(`生成 csrfToken 失败: ${error}`);
14615
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
14616
+ }
14617
+ let sessionDtrait;
14618
+ try {
14619
+ sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
14620
+ task.logger.info(`sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
14621
+ } catch (error) {
14622
+ task.logger.error(`生成 sessionDtrait 失败: ${error}`);
14623
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
14624
+ }
14473
14625
  task.logger.info("发布数据", {
14474
14626
  data: JSON.stringify(publishData)
14475
14627
  });
@@ -14514,19 +14666,28 @@ const mock_mockAction = async (task, params)=>{
14514
14666
  task.logger.info("========== api调用完成 ==========");
14515
14667
  task.logger.info(`decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
14516
14668
  if (needsVerification(decision)) {
14669
+ const details = [
14670
+ publishResult.status_msg,
14671
+ decision?.verify_title,
14672
+ decision?.verify_desc
14673
+ ].filter(Boolean).join(" ");
14674
+ const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
14517
14675
  task.logger.warn(`TaskId:${task.taskId},检测到需要验证,准备返回验证信息`);
14518
- await updateTaskState?.({
14519
- state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
14676
+ let decisionObj = {};
14677
+ if (decision) decisionObj = decision;
14678
+ const mockData = {
14679
+ state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
14680
+ error: message,
14520
14681
  result: {
14521
- response: decision
14682
+ ...decisionObj,
14683
+ data: decision,
14684
+ uploadedImgList: JSON.stringify(publishData.item.common.images)
14522
14685
  }
14523
- });
14524
- task.logger.info("返回验证响应: code=0, message=操作成功");
14686
+ };
14687
+ await updateTaskState?.(mockData);
14525
14688
  return {
14526
14689
  code: 0,
14527
- data: {
14528
- result: decision
14529
- },
14690
+ data: mockData,
14530
14691
  message: "操作成功"
14531
14692
  };
14532
14693
  }
@@ -14548,10 +14709,13 @@ const mock_mockAction = async (task, params)=>{
14548
14709
  const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
14549
14710
  const data = isSuccess ? publishResult.item_id || "" : "";
14550
14711
  if (!isSuccess) {
14712
+ let decisionObj = {};
14713
+ if (decision) decisionObj = decision;
14551
14714
  await updateTaskState?.({
14552
14715
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
14553
14716
  error: message,
14554
14717
  result: {
14718
+ ...decisionObj,
14555
14719
  data: decision,
14556
14720
  uploadedImgList: JSON.stringify(publishData.item.common.images)
14557
14721
  }
@@ -15226,15 +15390,41 @@ const rpaAction_Server = async (task, params)=>{
15226
15390
  }
15227
15391
  task.logger?.info("准备发布...");
15228
15392
  await page.waitForTimeout(1000);
15229
- const response = await new Promise((resolve, reject)=>{
15393
+ const result = await new Promise((resolve, reject)=>{
15230
15394
  const handleResponse = async (res)=>{
15231
15395
  if (res.url().includes("/web/api/media/aweme/create_v2")) {
15232
15396
  task.logger?.info("匹配到发布接口响应");
15397
+ let decision = null;
15398
+ try {
15399
+ const headers = await res.allHeaders();
15400
+ decision = parseVerifyPassportDecision(headers["x-tt-verify-passport-decision"]);
15401
+ } catch (error) {
15402
+ task.logger?.warn(`解析验证决策头失败: ${error}`);
15403
+ }
15233
15404
  const jsonResponse = await res.json();
15234
15405
  task.logger?.info(`发布接口响应数据: ${JSON.stringify(jsonResponse)}`);
15235
15406
  page.off("response", handleResponse);
15236
- if (jsonResponse?.status_code === 0) resolve(jsonResponse?.data?.item_id || jsonResponse?.item_id || "");
15237
- else reject(new Error(jsonResponse?.status_msg || "发布失败"));
15407
+ if (needsVerification(decision)) {
15408
+ task.logger?.warn("检测到需要二次验证,文章未真正发布");
15409
+ resolve({
15410
+ itemId: "",
15411
+ decision
15412
+ });
15413
+ return;
15414
+ }
15415
+ if (jsonResponse?.status_code !== 0) {
15416
+ reject(new Error(jsonResponse?.status_msg || "发布失败"));
15417
+ return;
15418
+ }
15419
+ const itemId = jsonResponse?.data?.item_id || jsonResponse?.item_id || "";
15420
+ if (!itemId) {
15421
+ reject(new Error(jsonResponse?.status_msg || "发布异常:未返回作品ID,文章可能未真正发布"));
15422
+ return;
15423
+ }
15424
+ resolve({
15425
+ itemId,
15426
+ decision: null
15427
+ });
15238
15428
  }
15239
15429
  };
15240
15430
  page.on("response", handleResponse);
@@ -15256,20 +15446,42 @@ const rpaAction_Server = async (task, params)=>{
15256
15446
  await page.close();
15257
15447
  return null;
15258
15448
  });
15259
- if (!response && "" !== response) return {
15449
+ if (!result) return {
15260
15450
  code: 414,
15261
15451
  message: "发布失败",
15262
15452
  data: ""
15263
15453
  };
15264
- task.logger?.info(`✓ 发布成功,item_id: ${response}`);
15454
+ if (needsVerification(result.decision)) {
15455
+ const decision = result.decision;
15456
+ const details = [
15457
+ decision?.verify_title,
15458
+ decision?.verify_desc
15459
+ ].filter(Boolean).join(" ");
15460
+ const message = `发布失败,需要二次验证${details ? `:${details}` : ""}`;
15461
+ task.logger?.warn(message);
15462
+ await updateTaskState?.({
15463
+ state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
15464
+ error: message,
15465
+ result: {
15466
+ data: decision
15467
+ }
15468
+ });
15469
+ await page.close();
15470
+ return {
15471
+ code: 414,
15472
+ message,
15473
+ data: ""
15474
+ };
15475
+ }
15476
+ task.logger?.info(`✓ 发布成功,item_id: ${result.itemId}`);
15265
15477
  await updateTaskState?.({
15266
15478
  state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
15267
15479
  result: {
15268
- response
15480
+ response: result.itemId
15269
15481
  }
15270
15482
  });
15271
15483
  await page.close();
15272
- return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(response);
15484
+ return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(result.itemId);
15273
15485
  };
15274
15486
  const DouyinPublishParamsSchema = ActionCommonParamsSchema.extend({
15275
15487
  title: schemas_string(),
@@ -16049,26 +16261,26 @@ async function getToutiaoData(_task, params) {
16049
16261
  const http = new Http({
16050
16262
  headers: {
16051
16263
  cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
16052
- referer: "https://mp.toutiao.com/profile_v4/graphic/publish"
16264
+ referer: "https://mp.toutiao.com/profile_v4/graphic/publish",
16265
+ "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"
16266
+ }
16267
+ });
16268
+ const totalData = await http.api({
16269
+ method: "get",
16270
+ url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
16271
+ params: {
16272
+ app_id: 1231
16273
+ }
16274
+ });
16275
+ await new Promise((r)=>setTimeout(r, 1000));
16276
+ const contentDataYesterday = await http.api({
16277
+ method: "get",
16278
+ url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
16279
+ params: {
16280
+ type: 0,
16281
+ app_id: 1231
16053
16282
  }
16054
16283
  });
16055
- const [totalData, contentDataYesterday] = await Promise.all([
16056
- http.api({
16057
- method: "get",
16058
- url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
16059
- params: {
16060
- app_id: 1231
16061
- }
16062
- }),
16063
- http.api({
16064
- method: "get",
16065
- url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
16066
- params: {
16067
- type: 0,
16068
- app_id: 1231
16069
- }
16070
- })
16071
- ]);
16072
16284
  const isSuccess = !!(totalData?.data?.statistic && contentDataYesterday?.author_stat);
16073
16285
  if (!isSuccess || !totalData?.data || !contentDataYesterday?.author_stat) return types_errorResponse(totalData?.message || contentDataYesterday?.message || "头条号数据获取失败,请检查Cookie是否有效", 414);
16074
16286
  const ttData = {
@@ -20241,8 +20453,10 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
20241
20453
  tuwen_wtt_trans_flag: params.settingInfo?.toutiaoTransWtt ? "2" : "0",
20242
20454
  info_source: sourceData,
20243
20455
  ...location ? {
20244
- city: location.label,
20245
- city_code: location.value
20456
+ manual_selected_city: JSON.stringify({
20457
+ city: location.label,
20458
+ city_code: location.value
20459
+ })
20246
20460
  } : null,
20247
20461
  ...params.settingInfo?.toutiaoCollectionId ? {
20248
20462
  want_join_collection_id: params.settingInfo.toutiaoCollectionId
@@ -20292,6 +20506,12 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
20292
20506
  claim_exclusive: toutiaoExclusive ? toutiaoExclusive : toutiaoOriginal?.includes("exclusive") ? 1 : 0
20293
20507
  };
20294
20508
  task._timerRecord.PrePublish = Date.now();
20509
+ task.logger.info(`[toutiaoPublish] ${"draft" === params.saveType ? "同步草稿" : "发布文章"}参数`, {
20510
+ saveType: params.saveType,
20511
+ title: params.title,
20512
+ extra: extraData,
20513
+ publishData
20514
+ });
20295
20515
  const msToken = params.cookies.find((it)=>"msToken" === it.name)?.value;
20296
20516
  let publishOption = {};
20297
20517
  if (msToken) {
@@ -21487,8 +21707,8 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
21487
21707
  headers
21488
21708
  });
21489
21709
  const proxyHttp = new Http(...args);
21490
- proxyHttp.addResponseInterceptor((response)=>{
21491
- const responseData = response.data;
21710
+ const baseRespFinder = (response)=>{
21711
+ const responseData = response?.data;
21492
21712
  const msgType = "draft" === params.saveType ? "同步" : "发布";
21493
21713
  if (response && responseData?.base_resp && 0 !== responseData.base_resp.ret && !ignoreErrno.includes(responseData.base_resp.ret)) {
21494
21714
  const errmsg = weixinPublish_mock_errnoMap[responseData.base_resp.ret] || response.config.defaultErrorMsg || responseData.base_resp.err_msg || `文章${msgType}异常,请稍后重试。`;
@@ -21498,7 +21718,9 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
21498
21718
  data: responseData
21499
21719
  };
21500
21720
  }
21501
- });
21721
+ };
21722
+ http.addResponseInterceptor(baseRespFinder);
21723
+ proxyHttp.addResponseInterceptor(baseRespFinder);
21502
21724
  await http.api({
21503
21725
  method: "get",
21504
21726
  url: "https://mp.weixin.qq.com/cgi-bin/appmsgpublish",