@iflyrpa/actions 2.0.0-beta.2 → 2.0.0-beta.4

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/bundle.js CHANGED
@@ -8238,7 +8238,7 @@ var __webpack_exports__ = {};
8238
8238
  origin: ()=>utils_origin
8239
8239
  });
8240
8240
  var package_namespaceObject = JSON.parse('{"i8":"0.0.18-beta.0"}');
8241
- var package_namespaceObject_0 = JSON.parse('{"i8":"2.0.0-beta.1"}');
8241
+ var package_namespaceObject_0 = JSON.parse('{"i8":"2.0.0-beta.3"}');
8242
8242
  const external_node_fs_namespaceObject = require("node:fs");
8243
8243
  var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
8244
8244
  const external_node_https_namespaceObject = require("node:https");
@@ -22738,7 +22738,7 @@ var __webpack_exports__ = {};
22738
22738
  axios.default = axios;
22739
22739
  const lib_axios = axios;
22740
22740
  var dist = __webpack_require__("../../node_modules/.pnpm/https-proxy-agent@7.0.6/node_modules/https-proxy-agent/dist/index.js");
22741
- async function ProxyAgent(ip, adr, accountId, refresh) {
22741
+ async function ProxyAgent(task, ip, adr, accountId, refresh) {
22742
22742
  const http = new Http({
22743
22743
  headers: {
22744
22744
  "content-type": "application/json"
@@ -22764,7 +22764,7 @@ var __webpack_exports__ = {};
22764
22764
  data: ProxyInfo.data
22765
22765
  }
22766
22766
  };
22767
- this.logger?.info(`请求代理:区域:${params.addr}, IP:${params.ip}, AccountId:${params.accountId}, 返回代理信息: ${ProxyInfo.data ? `${ProxyInfo.data.proxyIp}:${ProxyInfo.data.proxyPort}` : "无可用代理"}`, loggerInfo);
22767
+ task.logger?.info(`请求代理:区域:${params.addr}, IP:${params.ip}, AccountId:${params.accountId}, 返回代理信息: ${ProxyInfo.data ? `${ProxyInfo.data.proxyIp}:${ProxyInfo.data.proxyPort}` : "无可用代理"}`, loggerInfo);
22768
22768
  return "000000" === ProxyInfo.code && ProxyInfo.data ? {
22769
22769
  ip: ProxyInfo.data.proxyIp,
22770
22770
  port: ProxyInfo.data.proxyPort,
@@ -22786,7 +22786,7 @@ var __webpack_exports__ = {};
22786
22786
  ...config
22787
22787
  });
22788
22788
  this.logger = logger;
22789
- if (ip) this.agentPromise = ProxyAgent.call({
22789
+ if (ip) this.agentPromise = ProxyAgent({
22790
22790
  logger
22791
22791
  }, ip, adr, accountId);
22792
22792
  this.addResponseInterceptor(()=>void 0);
@@ -27832,10 +27832,9 @@ var __webpack_exports__ = {};
27832
27832
  params.accountId
27833
27833
  ];
27834
27834
  task.logger?.info(`==> 开始获取代理信息:${args}`);
27835
- const ProxyAgentWithLogger = ProxyAgent.bind({
27835
+ const ProxyAgentResult = await ProxyAgent({
27836
27836
  logger: task.logger
27837
- });
27838
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
27837
+ }, ...args);
27839
27838
  task.logger?.info("==> 代理信息获取成功!");
27840
27839
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
27841
27840
  }
@@ -29989,7 +29988,7 @@ var __webpack_exports__ = {};
29989
29988
  const http = new Http(...args);
29990
29989
  const hotParams = {
29991
29990
  query: params.query || "",
29992
- count: "50",
29991
+ count: params.count?.toString() || "20",
29993
29992
  aid: "1128",
29994
29993
  cookie_enabled: "0",
29995
29994
  screen_width: "1920",
@@ -30006,11 +30005,17 @@ var __webpack_exports__ = {};
30006
30005
  };
30007
30006
  const aBogus = douyinGetHot_sign_reply(hotParams, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36");
30008
30007
  hotParams.a_bogus = aBogus;
30008
+ if (!params.query) {
30009
+ delete hotParams.query;
30010
+ delete hotParams.count;
30011
+ }
30009
30012
  const queryString = new URLSearchParams(hotParams).toString();
30010
30013
  console.log("抖音获取热点参数:", queryString);
30014
+ const url = `https://creator.douyin.com/aweme/v1/hotspot/${params.query ? "search" : "recommend"}/?${queryString}`;
30015
+ console.log("抖音获取热点URL:", url);
30011
30016
  const res = await http.api({
30012
30017
  method: "get",
30013
- url: `https://creator.douyin.com/aweme/v1/hotspot/search/?${queryString}`,
30018
+ url,
30014
30019
  headers: {
30015
30020
  ...headers,
30016
30021
  "Content-Type": "application/json"
@@ -30023,8 +30028,8 @@ var __webpack_exports__ = {};
30023
30028
  const isSuccess = 0 === res.status_code;
30024
30029
  const message = `抖音获取热点${isSuccess ? "成功" : `失败,原因:${res.status_msg}`}${_task.debug ? ` ${http.proxyInfo}` : ""}`;
30025
30030
  const data = isSuccess ? {
30026
- hot: res?.sentences || [],
30027
- total: res?.sentences?.length || 0
30031
+ hot: res?.sentences || res?.all_sentences || [],
30032
+ total: (res?.sentences || res?.all_sentences)?.length || 0
30028
30033
  } : {
30029
30034
  hot: [],
30030
30035
  total: 0
@@ -30209,8 +30214,8 @@ var __webpack_exports__ = {};
30209
30214
  return utils_response(isSuccess ? 0 : 414, message, data);
30210
30215
  };
30211
30216
  const DouyinGetMusicByCategoryParamsSchema = ActionCommonParamsSchema.extend({
30212
- category_id: classic_schemas_string().optional(),
30213
- type: classic_schemas_string().optional(),
30217
+ category_id: classic_schemas_string(),
30218
+ type: classic_schemas_string(),
30214
30219
  count: classic_schemas_number().optional()
30215
30220
  });
30216
30221
  const { sign_datail: douyinGetMusicByCategory_sign_datail, sign_reply: douyinGetMusicByCategory_sign_reply } = __webpack_require__("./src/utils/douyin/douyin.js");
@@ -30357,7 +30362,7 @@ var __webpack_exports__ = {};
30357
30362
  params.accountId
30358
30363
  ];
30359
30364
  const http = new Http(...args);
30360
- const keyword = params.keyword || "";
30365
+ const keyword = params.keyword || "热点";
30361
30366
  const topicParams = {
30362
30367
  keyword: keyword,
30363
30368
  source: "challenge_create",
@@ -30403,6 +30408,282 @@ var __webpack_exports__ = {};
30403
30408
  };
30404
30409
  return utils_response(isSuccess ? 0 : 414, message, data);
30405
30410
  };
30411
+ const rpa_scanRetryMaxCount = 60;
30412
+ const rpa_waitQrcodeResultMaxTime = 2000 * rpa_scanRetryMaxCount;
30413
+ const douyinLogin_rpa_rpaAction = async (task, params)=>{
30414
+ const reporter = task.reportService?.reportLoginStatus ?? (()=>Promise.resolve());
30415
+ let page;
30416
+ let statusMachine = "new";
30417
+ let isSelfClosing = false;
30418
+ try {
30419
+ page = await task.createPage({
30420
+ url: "https://creator.douyin.com/"
30421
+ });
30422
+ if (!task._session?.id) throw new Error("Session ID 不存在");
30423
+ task._steelBrowser?.on("disconnected", ()=>{
30424
+ if (task.debug && isSelfClosing) task.logger.info("执行结束,关闭浏览器!");
30425
+ else task.logger.info("浏览器被手动释放或意外关闭!");
30426
+ });
30427
+ } catch (e) {
30428
+ task.logger.error("浏览器启动失败", e);
30429
+ return {
30430
+ code: 500,
30431
+ message: `浏览器启动失败: ${e}`,
30432
+ data: {}
30433
+ };
30434
+ }
30435
+ await page.route("**/*.mp4", (route)=>route.abort());
30436
+ await page.route("**/*.png", (route)=>route.abort());
30437
+ await page.route("**/*.ttf", (route)=>route.abort());
30438
+ await page.addInitScript(()=>{
30439
+ window.requestAnimationFrame = ()=>0;
30440
+ });
30441
+ await page.addInitScript(()=>{
30442
+ const removeEventBlockers = ()=>{
30443
+ try {
30444
+ const blockers = document.querySelectorAll('[style*="pointer-events: none"]');
30445
+ blockers.forEach((el)=>{
30446
+ el.style.pointerEvents = "auto";
30447
+ });
30448
+ document.body.style.pointerEvents = "auto";
30449
+ if (window.__DOUYIN_ANTI_DEBUG__) delete window.__DOUYIN_ANTI_DEBUG__;
30450
+ } catch (e) {}
30451
+ };
30452
+ removeEventBlockers();
30453
+ setInterval(removeEventBlockers, 1000);
30454
+ if ("undefined" != typeof MutationObserver) {
30455
+ const observer = new MutationObserver(removeEventBlockers);
30456
+ observer.observe(document.documentElement, {
30457
+ childList: true,
30458
+ subtree: true,
30459
+ attributes: true,
30460
+ attributeFilter: [
30461
+ "style"
30462
+ ]
30463
+ });
30464
+ }
30465
+ });
30466
+ task.logger.info("页面创建成功,开始Bypass页面事件屏蔽...");
30467
+ try {
30468
+ await page.waitForResponse((response)=>response.url().includes("/272.6591d0af.js") && 200 === response.status(), {
30469
+ timeout: 15000
30470
+ });
30471
+ await page.waitForLoadState("networkidle");
30472
+ await page.goto("about:blank");
30473
+ await page.goBack({
30474
+ waitUntil: "domcontentloaded"
30475
+ });
30476
+ task.logger.info("已返回登录页面,页面事件屏蔽Bypass完成...");
30477
+ } catch (e) {
30478
+ task.logger.warn("Bypass 超时,继续执行...", {
30479
+ error: e
30480
+ });
30481
+ }
30482
+ await page.waitForTimeout(2000);
30483
+ try {
30484
+ const loginButtonSelector = ".douyin-creator-master-icon-default.douyin-creator-master-icon-user_circle";
30485
+ await page.waitForSelector(loginButtonSelector, {
30486
+ state: "visible",
30487
+ timeout: 10000
30488
+ });
30489
+ const clicked = await page.evaluate((selector)=>{
30490
+ const btn = document.querySelector(selector);
30491
+ if (btn) {
30492
+ btn.click();
30493
+ return true;
30494
+ }
30495
+ return false;
30496
+ }, loginButtonSelector);
30497
+ if (clicked) task.logger.info("✅ 登录按钮点击成功(使用 JavaScript)");
30498
+ else {
30499
+ await page.locator(loginButtonSelector).click({
30500
+ force: true,
30501
+ timeout: 5000
30502
+ });
30503
+ task.logger.info("✅ 登录按钮点击成功(使用 Playwright force)");
30504
+ }
30505
+ } catch (e) {
30506
+ task.logger.error("❌ 点击登录按钮失败", e);
30507
+ return {
30508
+ code: 500,
30509
+ message: "无法点击登录按钮,页面可能已被屏蔽",
30510
+ data: {}
30511
+ };
30512
+ }
30513
+ await page.waitForTimeout(3000);
30514
+ const pageInfo = await task._client?.sessions.liveDetails(task._session.id);
30515
+ const pageId = pageInfo?.pages[0].id ?? "";
30516
+ const baseHost = task._session.websocketUrl?.replace(/^wss?:\/\//, "") ?? "";
30517
+ const debugParams = new URLSearchParams({
30518
+ baseHost,
30519
+ pageId
30520
+ });
30521
+ const connectAddress = debugParams.toString();
30522
+ task.reportService?.settingSessionID?.(task._session?.id || "");
30523
+ task.logger.info("🔗 远程调试地址已生成,现在可以安全访问远程页面");
30524
+ await reporter(0, "浏览器启动成功,请使用抖音App扫码登录......", {
30525
+ connectAddress
30526
+ });
30527
+ const userInfo = {
30528
+ uniqueId: "",
30529
+ avatar: "",
30530
+ name: ""
30531
+ };
30532
+ try {
30533
+ await new Promise((resolve, reject)=>{
30534
+ let finished = false;
30535
+ const timer = setTimeout(()=>{
30536
+ cleanup(statusMachine);
30537
+ }, rpa_waitQrcodeResultMaxTime);
30538
+ const cleanup = (status)=>{
30539
+ if (finished) return;
30540
+ finished = true;
30541
+ clearTimeout(timer);
30542
+ page.off("response", handleWebCommon);
30543
+ page.off("response", handleCheckQR);
30544
+ if (void 0 !== status) reject(status);
30545
+ };
30546
+ const handleWebCommon = async (resp)=>{
30547
+ try {
30548
+ const url = resp.url();
30549
+ if (url.includes("/web/common")) {
30550
+ cleanup();
30551
+ const headers = resp.headers();
30552
+ const xmst = headers["x-ms-token"];
30553
+ const date = headers["x-tt-timestamp"];
30554
+ if (xmst && date) {
30555
+ const mstExpirDate = new Date(1000 * Number(date) + 604800000);
30556
+ const msToken = {
30557
+ name: "msToken",
30558
+ value: xmst,
30559
+ domain: ".bytedance.com",
30560
+ expires: mstExpirDate.getTime() / 1000,
30561
+ httpOnly: true,
30562
+ path: "/",
30563
+ sameSite: "None",
30564
+ secure: true
30565
+ };
30566
+ await page.context().addCookies([
30567
+ msToken
30568
+ ]);
30569
+ task.debug && task.logger.info("msToken 添加成功");
30570
+ task.debug && task.logger.info("msToken 检测成功:", {
30571
+ token: xmst.substring(0, 20) + "...",
30572
+ timestamp: date
30573
+ });
30574
+ }
30575
+ await reporter(0, "扫码成功!", {
30576
+ stage: "scanQrcode",
30577
+ connectAddress
30578
+ });
30579
+ resolve();
30580
+ } else if (url.includes("aweme/v1/creator/user/info")) try {
30581
+ const jsonUserInfo = await resp.json();
30582
+ userInfo.name = jsonUserInfo.user_profile.nick_name ?? "";
30583
+ userInfo.avatar = jsonUserInfo.user_profile.avatar_url ?? "";
30584
+ task.debug && task.logger.info("用户信息获取成功", userInfo);
30585
+ } catch (e) {
30586
+ task.logger.warn("无法解析用户信息:", {
30587
+ url,
30588
+ error: e
30589
+ });
30590
+ }
30591
+ else if (url.includes("/aweme/v1/creator/pc/user/info/")) try {
30592
+ const jsonUserInfo = await resp.json();
30593
+ userInfo.uniqueId = jsonUserInfo.uid ?? "";
30594
+ task.debug && task.logger.info("用户uniqueId 获取成功", userInfo);
30595
+ } catch (e) {
30596
+ task.logger.warn("无法解析用户信息:", {
30597
+ url,
30598
+ error: e
30599
+ });
30600
+ }
30601
+ } catch (err) {
30602
+ task.logger.error("监听登录结果出现异常", err);
30603
+ cleanup(err);
30604
+ }
30605
+ };
30606
+ const handleCheckQR = async (response)=>{
30607
+ try {
30608
+ const url = response.url();
30609
+ if (!url.includes("/check_qrconnect")) return;
30610
+ let jsonResponse;
30611
+ try {
30612
+ jsonResponse = await response.json();
30613
+ } catch (e) {
30614
+ task.logger.warn("Response body unavailable (likely navigation happened)", {
30615
+ url
30616
+ });
30617
+ return;
30618
+ }
30619
+ const status = jsonResponse?.data?.status;
30620
+ task.logger.info("check_qrconnect 状态:", {
30621
+ status
30622
+ });
30623
+ if ("scanned" === status) {
30624
+ task.logger.info("用户已扫码,等待确认...");
30625
+ page.on("response", handleWebCommon);
30626
+ }
30627
+ if ("confirmed" === status) {
30628
+ userInfo.uniqueId = jsonResponse.data?.user_data?.user_id_str || "";
30629
+ task.logger.info("扫码确认,开始监听登录完成...");
30630
+ page.off("response", handleCheckQR);
30631
+ }
30632
+ statusMachine = status || "new";
30633
+ if ("expired" === status) {
30634
+ task.logger.warn("二维码已过期");
30635
+ cleanup("expired");
30636
+ }
30637
+ } catch (err) {
30638
+ task.logger.error("handleCheckQR 异常:", err);
30639
+ }
30640
+ };
30641
+ page.on("response", handleCheckQR);
30642
+ });
30643
+ } catch (e) {
30644
+ const errMap = {
30645
+ new: "用户扫码已超时,请重试!",
30646
+ scanned: "用户扫码后未点击确认,请重试!",
30647
+ expired: "二维码已过期,请重试!"
30648
+ };
30649
+ isSelfClosing = true;
30650
+ const errorMessage = "string" == typeof e && errMap[e] ? errMap[e] : e instanceof Error ? e.message : String(e);
30651
+ return {
30652
+ code: 500,
30653
+ message: errorMessage,
30654
+ data: {
30655
+ stage: "scanQrcode",
30656
+ connectAddress
30657
+ }
30658
+ };
30659
+ }
30660
+ let securityData = {};
30661
+ let retryCount = 0;
30662
+ const maxRetries = 10;
30663
+ while(retryCount < maxRetries){
30664
+ securityData = await page.evaluate(()=>({
30665
+ "security-sdk/s_sdk_pri_key": localStorage.getItem("security-sdk/s_sdk_pri_key") || "",
30666
+ "security-sdk/s_sdk_pub_key": localStorage.getItem("security-sdk/s_sdk_pub_key") || "",
30667
+ "security-sdk/s_sdk_sign_data_key/web_protect": localStorage.getItem("security-sdk/s_sdk_sign_data_key/web_protect") || ""
30668
+ }));
30669
+ if (securityData["security-sdk/s_sdk_pri_key"] && securityData["security-sdk/s_sdk_pub_key"] && securityData["security-sdk/s_sdk_sign_data_key/web_protect"]) {
30670
+ task.logger.info("Security SDK 数据已获取");
30671
+ break;
30672
+ }
30673
+ retryCount++;
30674
+ task.logger.info(`等待 Security SDK 数据... (${retryCount}/${maxRetries})`);
30675
+ await page.waitForTimeout(1000);
30676
+ }
30677
+ const cookie = JSON.stringify(await task._steelBrowserContext?.cookies());
30678
+ isSelfClosing = true;
30679
+ await page.close();
30680
+ return success({
30681
+ connectAddress,
30682
+ cookie,
30683
+ userInfo,
30684
+ extraParam: securityData
30685
+ }, "登陆成功!");
30686
+ };
30406
30687
  const douyinLogin_rpa_server_scanRetryMaxCount = 60;
30407
30688
  const douyinLogin_rpa_server_waitQrcodeResultMaxTime = 2000 * douyinLogin_rpa_server_scanRetryMaxCount;
30408
30689
  const rpa_server_rpaServer = async (task, params)=>{
@@ -30416,10 +30697,9 @@ var __webpack_exports__ = {};
30416
30697
  params.accountId
30417
30698
  ];
30418
30699
  task.logger?.info(`==> 开始获取代理信息:${args}`);
30419
- const ProxyAgentWithLogger = ProxyAgent.bind({
30700
+ const ProxyAgentResult = await ProxyAgent({
30420
30701
  logger: task.logger
30421
- });
30422
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
30702
+ }, ...args);
30423
30703
  task.logger?.info("==> 代理信息获取成功!");
30424
30704
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
30425
30705
  }
@@ -30530,6 +30810,16 @@ var __webpack_exports__ = {};
30530
30810
  error: e
30531
30811
  });
30532
30812
  }
30813
+ else if (url.includes("/aweme/v1/creator/pc/user/info/")) try {
30814
+ const jsonUserInfo = await resp.json();
30815
+ userInfo.uniqueId = jsonUserInfo.uid ?? "";
30816
+ task.debug && task.logger.info("用户uniqueId 获取成功", userInfo);
30817
+ } catch (e) {
30818
+ task.logger.warn("无法解析用户信息:", {
30819
+ url,
30820
+ error: e
30821
+ });
30822
+ }
30533
30823
  } catch (err) {
30534
30824
  cleanup();
30535
30825
  reject(err);
@@ -30549,13 +30839,15 @@ var __webpack_exports__ = {};
30549
30839
  return;
30550
30840
  }
30551
30841
  const status = jsonResponse?.data?.status;
30552
- if ("scanned" === status) await updateTaskState?.({
30553
- state: types_TaskState.SCANNED
30554
- });
30842
+ if ("scanned" === status) {
30843
+ await updateTaskState?.({
30844
+ state: types_TaskState.SCANNED
30845
+ });
30846
+ page.on("response", handleWebCommon);
30847
+ }
30555
30848
  if ("confirmed" === status) {
30556
30849
  userInfo.uniqueId = jsonResponse.data?.user_data?.user_id_str || "";
30557
30850
  page.off("response", handleCheckQR);
30558
- page.on("response", handleWebCommon);
30559
30851
  }
30560
30852
  } catch (err) {
30561
30853
  cleanup();
@@ -30604,27 +30896,27 @@ var __webpack_exports__ = {};
30604
30896
  case types_ExecutionState.SUCCESS:
30605
30897
  {
30606
30898
  let securityData = {};
30607
- try {
30899
+ let retryCount = 0;
30900
+ const maxRetries = 10;
30901
+ while(retryCount < maxRetries){
30608
30902
  securityData = await page.evaluate(()=>({
30609
30903
  "security-sdk/s_sdk_pri_key": localStorage.getItem("security-sdk/s_sdk_pri_key") || "",
30610
30904
  "security-sdk/s_sdk_pub_key": localStorage.getItem("security-sdk/s_sdk_pub_key") || "",
30611
- "security-sdk/s_sdk_sign_data_key": localStorage.getItem("security-sdk/s_sdk_sign_data_key/web_protect") || ""
30905
+ "security-sdk/s_sdk_sign_data_key/web_protect": localStorage.getItem("security-sdk/s_sdk_sign_data_key/web_protect") || ""
30612
30906
  }));
30613
- task.logger.info("Security SDK 数据提取成功:", {
30614
- "security-sdk/s_sdk_pri_key": !!securityData["security-sdk/s_sdk_pri_key"],
30615
- "security-sdk/s_sdk_pub_key": !!securityData["security-sdk/s_sdk_pub_key"],
30616
- "security-sdk/s_sdk_sign_data_key": !!securityData["security-sdk/s_sdk_sign_data_key"]
30617
- });
30618
- } catch (error) {
30619
- task.logger.warn("提取 Security SDK 数据失败:", {
30620
- error: error instanceof Error ? error.message : String(error)
30621
- });
30907
+ if (securityData["security-sdk/s_sdk_pri_key"] && securityData["security-sdk/s_sdk_pub_key"] && securityData["security-sdk/s_sdk_sign_data_key/web_protect"]) {
30908
+ task.logger.info("Security SDK 数据已获取");
30909
+ break;
30910
+ }
30911
+ retryCount++;
30912
+ task.logger.info(`等待 Security SDK 数据... (${retryCount}/${maxRetries})`);
30913
+ await page.waitForTimeout(1000);
30622
30914
  }
30623
30915
  await updateTaskState?.({
30624
30916
  state: types_TaskState.SUCCESS,
30625
30917
  result: {
30626
30918
  cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
30627
- ...securityData,
30919
+ extraParam: securityData,
30628
30920
  userInfo: userInfo
30629
30921
  }
30630
30922
  });
@@ -30633,7 +30925,7 @@ var __webpack_exports__ = {};
30633
30925
  message: "成功",
30634
30926
  data: {
30635
30927
  cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
30636
- ...securityData,
30928
+ extraParam: securityData,
30637
30929
  userInfo
30638
30930
  }
30639
30931
  };
@@ -30647,6 +30939,7 @@ var __webpack_exports__ = {};
30647
30939
  }
30648
30940
  };
30649
30941
  const douyinLogin = async (task, params)=>{
30942
+ if ("rpa" === params.actionType) return douyinLogin_rpa_rpaAction(task, params);
30650
30943
  if ("mockApi" === params.actionType) return success({}, "暂不支持mockApi");
30651
30944
  if ("server" === params.actionType) return rpa_server_rpaServer(task, params);
30652
30945
  return executeAction(rpa_server_rpaServer)(task, params);
@@ -30656,6 +30949,7 @@ var __webpack_exports__ = {};
30656
30949
  const { generateCsrfTokenAdvanced } = __webpack_require__("./src/utils/douyin/csrfToken.js");
30657
30950
  const { generateAuthorization, randomS, canonicalQueryString, calculateFileCrc32 } = __webpack_require__("./src/utils/douyin/douyinSign.js");
30658
30951
  const mock_mockAction = async (task, params)=>{
30952
+ if (!params.extraParam || !params.extraParam["security-sdk/s_sdk_pri_key"] || !params.extraParam["security-sdk/s_sdk_pub_key"] || !params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"]) return utils_response(400, "extraParam 参数缺失或不完整", "");
30659
30953
  const tmpCachePath = task.getTmpPath();
30660
30954
  let bdTicketGuardClientDataV2 = params.cookies.find((e)=>"bd_ticket_guard_client_data" === e.name)?.value || "";
30661
30955
  if (!bdTicketGuardClientDataV2) return utils_response(400, "bdTicketGuardClientDataV2 不能为空", "");
@@ -30675,9 +30969,9 @@ var __webpack_exports__ = {};
30675
30969
  ree_public_key = parsed.ree_public_key || "";
30676
30970
  ts_sign = parsed.ts_sign || "";
30677
30971
  } catch {}
30678
- const privateKey = params["security-sdk/s_sdk_pri_key"]?.data || "";
30679
- const publicKey = params["security-sdk/s_sdk_pub_key"]?.data || "";
30680
- const signData = JSON.parse(params["security-sdk/s_sdk_sign_data_key/web_protect"]?.data || "{}");
30972
+ const privateKey = params.extraParam["security-sdk/s_sdk_pri_key"]?.data || "";
30973
+ const publicKey = params.extraParam["security-sdk/s_sdk_pub_key"]?.data || "";
30974
+ const signData = JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"]?.data || "{}");
30681
30975
  console.log("privateKey:", privateKey);
30682
30976
  console.log("publicKey:", publicKey);
30683
30977
  console.log("signData:", signData);
@@ -30720,30 +31014,26 @@ var __webpack_exports__ = {};
30720
31014
  const publishData = {
30721
31015
  item: {
30722
31016
  common: {
30723
- text: params.title || "32234。sdsadadasda",
30724
- text_extra: '[{"start":0,"end":5,"hashtag_id":0,"hashtag_name":"","type":7},{"start":5,"end":6,"hashtag_id":0,"hashtag_name":"","type":8}]',
31017
+ text: params.content,
31018
+ text_extra: params.textExtra,
30725
31019
  activity: "[]",
30726
- challenges: "[]",
31020
+ challenges: params.challengeIds,
30727
31021
  hashtag_source: "",
30728
31022
  mentions: "[]",
30729
- music_id: "",
30730
- music_end_time: 0,
30731
- hot_sentence: "",
30732
- visibility_type: 0,
30733
- download: 0,
30734
- timing: -1,
30735
- media_type: 2,
31023
+ music_id: params.musicId,
31024
+ music_end_time: 1000 * (params.musicDuration || 0),
31025
+ hot_sentence: params.hotSentence || "",
31026
+ visibility_type: params.visibleRange || 0,
31027
+ download: params.allowSave ? 1 : 0,
31028
+ timing: params.isImmediatelyPublish ? -1 : params.scheduledPublish,
31029
+ media_type: params.publishType || 2,
30736
31030
  images: []
30737
31031
  },
30738
31032
  cover: {
30739
31033
  poster: ""
30740
31034
  },
30741
- mix: {},
30742
- anchor: {
30743
- poi_name: "",
30744
- poi_id: "",
30745
- anchor_content: "{}"
30746
- },
31035
+ mix: params.mix || {},
31036
+ anchor: {},
30747
31037
  declare: {
30748
31038
  user_declare_info: "{}"
30749
31039
  }
@@ -31007,8 +31297,8 @@ var __webpack_exports__ = {};
31007
31297
  const descInstance = page.locator("div[data-placeholder='添加作品描述...']");
31008
31298
  await descInstance.click();
31009
31299
  await descInstance.pressSequentially(params.content.replace(/#.*?\[.*?]#/g, "") || "22222");
31010
- if ("2" === params.visibleRange) await page.locator("label:has-text('好友可见')").first().click();
31011
- else if ("3" === params.visibleRange) await page.locator("label:has-text('仅自己可见')").first().click();
31300
+ if ("1" === params.visibleRange) await page.locator("label:has-text('好友可见')").first().click();
31301
+ else if ("2" === params.visibleRange) await page.locator("label:has-text('仅自己可见')").first().click();
31012
31302
  if (!params.isImmediatelyPublish) {
31013
31303
  await await page.locator('label:has-text("定时发布")').first().click();
31014
31304
  await page.waitForTimeout(500);
@@ -31043,74 +31333,51 @@ var __webpack_exports__ = {};
31043
31333
  await page.close();
31044
31334
  return success(response);
31045
31335
  };
31046
- const FictionalRendition = classic_schemas_object({
31047
- type: literal("fictional-rendition")
31048
- });
31049
- const AIGenerated = classic_schemas_object({
31050
- type: literal("ai-generated")
31051
- });
31052
- const SourceStatement = classic_schemas_object({
31053
- type: literal("source-statement"),
31054
- childType: classic_schemas_enum([
31055
- "self-labeling",
31056
- "self-shooting",
31057
- "transshipment"
31058
- ]),
31059
- shootingLocation: classic_schemas_object({
31060
- id: classic_schemas_string(),
31061
- name: classic_schemas_string(),
31062
- latitude: classic_schemas_number().optional(),
31063
- longitude: classic_schemas_number().optional()
31064
- }).optional(),
31065
- shootingDate: classic_schemas_string().optional(),
31066
- sourceMedia: classic_schemas_string().optional()
31067
- });
31068
- schemas_union([
31069
- FictionalRendition,
31070
- AIGenerated,
31071
- SourceStatement
31072
- ]);
31073
31336
  const DouyinPublishParamsSchema = ActionCommonParamsSchema.extend({
31074
- banners: classic_schemas_array(classic_schemas_string()),
31075
31337
  title: classic_schemas_string(),
31076
31338
  content: classic_schemas_string(),
31077
- coverImage: classic_schemas_string().optional(),
31078
- videoFile: classic_schemas_string().optional(),
31079
- address: classic_schemas_object({
31080
- id: classic_schemas_string(),
31081
- name: classic_schemas_string(),
31082
- latitude: classic_schemas_number().optional(),
31083
- longitude: classic_schemas_number().optional()
31084
- }).optional(),
31085
- selfDeclaration: custom().optional(),
31339
+ textExtra: classic_schemas_string(),
31086
31340
  topic: classic_schemas_array(classic_schemas_object({
31087
31341
  id: classic_schemas_string(),
31088
31342
  word: classic_schemas_string()
31089
31343
  })).optional(),
31344
+ coverImage: classic_schemas_string().optional(),
31345
+ banners: classic_schemas_array(classic_schemas_string()),
31346
+ mix: classic_schemas_object({
31347
+ mix_id: classic_schemas_string(),
31348
+ mix_order: classic_schemas_number()
31349
+ }),
31350
+ musicId: classic_schemas_string(),
31351
+ musicDuration: classic_schemas_number().optional(),
31352
+ challengeIds: classic_schemas_string(),
31353
+ hotSentence: classic_schemas_string(),
31090
31354
  proxyLoc: classic_schemas_string().optional(),
31091
31355
  localIP: classic_schemas_string().optional(),
31092
31356
  visibleRange: classic_schemas_enum([
31357
+ "0",
31093
31358
  "1",
31094
- "2",
31095
- "3"
31359
+ "2"
31096
31360
  ]).optional(),
31097
31361
  isImmediatelyPublish: classic_schemas_boolean().optional(),
31098
31362
  scheduledPublish: classic_schemas_string().optional(),
31099
- isOriginal: classic_schemas_boolean().optional(),
31100
- allowCoProduce: classic_schemas_boolean().optional(),
31101
- allowCopy: classic_schemas_boolean().optional(),
31363
+ allowSave: classic_schemas_boolean().optional(),
31102
31364
  publishType: classic_schemas_enum([
31103
31365
  "1",
31104
31366
  "2",
31105
31367
  "3",
31106
31368
  "4"
31107
31369
  ]).optional(),
31108
- publishAction: classic_schemas_enum([
31109
- "publish",
31110
- "draft"
31111
- ]).optional(),
31112
- isAiCoverImage: classic_schemas_boolean().optional(),
31113
- summary: classic_schemas_string().optional()
31370
+ extraParam: classic_schemas_object({
31371
+ "security-sdk/s_sdk_pri_key": classic_schemas_object({
31372
+ data: classic_schemas_string()
31373
+ }),
31374
+ "security-sdk/s_sdk_pub_key": classic_schemas_object({
31375
+ data: classic_schemas_string()
31376
+ }),
31377
+ "security-sdk/s_sdk_sign_data_key/web_protect": classic_schemas_object({
31378
+ data: classic_schemas_string()
31379
+ })
31380
+ })
31114
31381
  });
31115
31382
  const douyinPublish = async (task, params)=>{
31116
31383
  if ("rpa" === params.actionType) return douyinPublish_rpa_rpaAction(task, params);
@@ -32885,8 +33152,8 @@ var __webpack_exports__ = {};
32885
33152
  const message = `用户文章信息获取${isSuccess ? "成功!" : "失败,请检查!"}${_task.debug ? ` ${http.proxyInfo}` : ""}`;
32886
33153
  return utils_response(isSuccess ? 0 : 414, message, INITIAL_STATE);
32887
33154
  };
32888
- const rpa_scanRetryMaxCount = 60;
32889
- const rpa_waitQrcodeResultMaxTime = 2000 * rpa_scanRetryMaxCount;
33155
+ const toutiaoLogin_rpa_scanRetryMaxCount = 60;
33156
+ const toutiaoLogin_rpa_waitQrcodeResultMaxTime = 2000 * toutiaoLogin_rpa_scanRetryMaxCount;
32890
33157
  const toutiaoLogin_rpa_rpaAction = async (task, _params)=>{
32891
33158
  const reporter = task.reportService?.reportLoginStatus ?? (()=>Promise.resolve());
32892
33159
  let page;
@@ -32931,7 +33198,7 @@ var __webpack_exports__ = {};
32931
33198
  let finished = false;
32932
33199
  const timer = setTimeout(()=>{
32933
33200
  cleanup(statusMachine);
32934
- }, rpa_waitQrcodeResultMaxTime);
33201
+ }, toutiaoLogin_rpa_waitQrcodeResultMaxTime);
32935
33202
  const cleanup = (status)=>{
32936
33203
  if (finished) return;
32937
33204
  finished = true;
@@ -33030,10 +33297,9 @@ var __webpack_exports__ = {};
33030
33297
  params.accountId
33031
33298
  ];
33032
33299
  task.logger?.info(`==> 开始获取代理信息:${args}`);
33033
- const ProxyAgentWithLogger = ProxyAgent.bind({
33300
+ const ProxyAgentResult = await ProxyAgent({
33034
33301
  logger: task.logger
33035
- });
33036
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
33302
+ }, ...args);
33037
33303
  task.logger?.info("==> 代理信息获取成功!");
33038
33304
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
33039
33305
  }
@@ -34073,10 +34339,9 @@ var __webpack_exports__ = {};
34073
34339
  params.accountId
34074
34340
  ];
34075
34341
  task.logger?.info(`==> 开始获取代理信息:${args}`);
34076
- const ProxyAgentWithLogger = ProxyAgent.bind({
34342
+ const ProxyAgentResult = await ProxyAgent({
34077
34343
  logger: task.logger
34078
- });
34079
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
34344
+ }, ...args);
34080
34345
  task.logger?.info("==> 代理信息获取成功!");
34081
34346
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
34082
34347
  }
@@ -35989,10 +36254,9 @@ var __webpack_exports__ = {};
35989
36254
  params.accountId
35990
36255
  ];
35991
36256
  task.logger?.info(`==> 开始获取代理信息:${args}`);
35992
- const ProxyAgentWithLogger = ProxyAgent.bind({
36257
+ const ProxyAgentResult = await ProxyAgent({
35993
36258
  logger: task.logger
35994
- });
35995
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
36259
+ }, ...args);
35996
36260
  task.logger?.info("==> 代理信息获取成功!");
35997
36261
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
35998
36262
  }
@@ -36825,10 +37089,9 @@ var __webpack_exports__ = {};
36825
37089
  params.accountId
36826
37090
  ];
36827
37091
  task.logger?.info(`==> 开始获取代理信息:${args}`);
36828
- const ProxyAgentWithLogger = ProxyAgent.bind({
37092
+ const ProxyAgentResult = await ProxyAgent({
36829
37093
  logger: task.logger
36830
- });
36831
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
37094
+ }, ...args);
36832
37095
  task.logger?.info("==> 代理信息获取成功!");
36833
37096
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
36834
37097
  }
@@ -37575,13 +37838,13 @@ var __webpack_exports__ = {};
37575
37838
  });
37576
37839
  return success(data, message);
37577
37840
  };
37578
- const xiaohongshuPublish_FictionalRendition = classic_schemas_object({
37841
+ const FictionalRendition = classic_schemas_object({
37579
37842
  type: literal("fictional-rendition")
37580
37843
  });
37581
- const xiaohongshuPublish_AIGenerated = classic_schemas_object({
37844
+ const AIGenerated = classic_schemas_object({
37582
37845
  type: literal("ai-generated")
37583
37846
  });
37584
- const xiaohongshuPublish_SourceStatement = classic_schemas_object({
37847
+ const SourceStatement = classic_schemas_object({
37585
37848
  type: literal("source-statement"),
37586
37849
  childType: classic_schemas_enum([
37587
37850
  "self-labeling",
@@ -37593,9 +37856,9 @@ var __webpack_exports__ = {};
37593
37856
  sourceMedia: classic_schemas_string().optional()
37594
37857
  });
37595
37858
  schemas_union([
37596
- xiaohongshuPublish_FictionalRendition,
37597
- xiaohongshuPublish_AIGenerated,
37598
- xiaohongshuPublish_SourceStatement
37859
+ FictionalRendition,
37860
+ AIGenerated,
37861
+ SourceStatement
37599
37862
  ]);
37600
37863
  const XiaohongshuPublishParamsSchema = ActionCommonParamsSchema.extend({
37601
37864
  banners: classic_schemas_array(classic_schemas_string()),