@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/index.js CHANGED
@@ -4993,7 +4993,7 @@ var __webpack_exports__ = {};
4993
4993
  });
4994
4994
  const package_json_namespaceObject = require("@iflyrpa/share/package.json");
4995
4995
  var package_json_default = /*#__PURE__*/ __webpack_require__.n(package_json_namespaceObject);
4996
- var package_namespaceObject = JSON.parse('{"i8":"2.0.0-beta.1"}');
4996
+ var package_namespaceObject = JSON.parse('{"i8":"2.0.0-beta.3"}');
4997
4997
  const share_namespaceObject = require("@iflyrpa/share");
4998
4998
  const external_node_fs_namespaceObject = require("node:fs");
4999
4999
  var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
@@ -5010,7 +5010,7 @@ var __webpack_exports__ = {};
5010
5010
  const external_axios_namespaceObject = require("axios");
5011
5011
  var external_axios_default = /*#__PURE__*/ __webpack_require__.n(external_axios_namespaceObject);
5012
5012
  var dist = __webpack_require__("../../node_modules/.pnpm/https-proxy-agent@7.0.6/node_modules/https-proxy-agent/dist/index.js");
5013
- async function ProxyAgent(ip, adr, accountId, refresh) {
5013
+ async function ProxyAgent(task, ip, adr, accountId, refresh) {
5014
5014
  const http = new Http({
5015
5015
  headers: {
5016
5016
  "content-type": "application/json"
@@ -5036,7 +5036,7 @@ var __webpack_exports__ = {};
5036
5036
  data: ProxyInfo.data
5037
5037
  }
5038
5038
  };
5039
- this.logger?.info(`请求代理:区域:${params.addr}, IP:${params.ip}, AccountId:${params.accountId}, 返回代理信息: ${ProxyInfo.data ? `${ProxyInfo.data.proxyIp}:${ProxyInfo.data.proxyPort}` : "无可用代理"}`, loggerInfo);
5039
+ task.logger?.info(`请求代理:区域:${params.addr}, IP:${params.ip}, AccountId:${params.accountId}, 返回代理信息: ${ProxyInfo.data ? `${ProxyInfo.data.proxyIp}:${ProxyInfo.data.proxyPort}` : "无可用代理"}`, loggerInfo);
5040
5040
  return "000000" === ProxyInfo.code && ProxyInfo.data ? {
5041
5041
  ip: ProxyInfo.data.proxyIp,
5042
5042
  port: ProxyInfo.data.proxyPort,
@@ -5058,7 +5058,7 @@ var __webpack_exports__ = {};
5058
5058
  ...config
5059
5059
  });
5060
5060
  this.logger = logger;
5061
- if (ip) this.agentPromise = ProxyAgent.call({
5061
+ if (ip) this.agentPromise = ProxyAgent({
5062
5062
  logger
5063
5063
  }, ip, adr, accountId);
5064
5064
  this.addResponseInterceptor(()=>void 0);
@@ -9136,10 +9136,9 @@ var __webpack_exports__ = {};
9136
9136
  params.accountId
9137
9137
  ];
9138
9138
  task.logger?.info(`==> 开始获取代理信息:${args}`);
9139
- const ProxyAgentWithLogger = ProxyAgent.bind({
9139
+ const ProxyAgentResult = await ProxyAgent({
9140
9140
  logger: task.logger
9141
- });
9142
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
9141
+ }, ...args);
9143
9142
  task.logger?.info("==> 代理信息获取成功!");
9144
9143
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
9145
9144
  }
@@ -11297,7 +11296,7 @@ var __webpack_exports__ = {};
11297
11296
  const http = new Http(...args);
11298
11297
  const hotParams = {
11299
11298
  query: params.query || "",
11300
- count: "50",
11299
+ count: params.count?.toString() || "20",
11301
11300
  aid: "1128",
11302
11301
  cookie_enabled: "0",
11303
11302
  screen_width: "1920",
@@ -11314,11 +11313,17 @@ var __webpack_exports__ = {};
11314
11313
  };
11315
11314
  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");
11316
11315
  hotParams.a_bogus = aBogus;
11316
+ if (!params.query) {
11317
+ delete hotParams.query;
11318
+ delete hotParams.count;
11319
+ }
11317
11320
  const queryString = new URLSearchParams(hotParams).toString();
11318
11321
  console.log("抖音获取热点参数:", queryString);
11322
+ const url = `https://creator.douyin.com/aweme/v1/hotspot/${params.query ? "search" : "recommend"}/?${queryString}`;
11323
+ console.log("抖音获取热点URL:", url);
11319
11324
  const res = await http.api({
11320
11325
  method: "get",
11321
- url: `https://creator.douyin.com/aweme/v1/hotspot/search/?${queryString}`,
11326
+ url,
11322
11327
  headers: {
11323
11328
  ...headers,
11324
11329
  "Content-Type": "application/json"
@@ -11331,8 +11336,8 @@ var __webpack_exports__ = {};
11331
11336
  const isSuccess = 0 === res.status_code;
11332
11337
  const message = `抖音获取热点${isSuccess ? "成功" : `失败,原因:${res.status_msg}`}${_task.debug ? ` ${http.proxyInfo}` : ""}`;
11333
11338
  const data = isSuccess ? {
11334
- hot: res?.sentences || [],
11335
- total: res?.sentences?.length || 0
11339
+ hot: res?.sentences || res?.all_sentences || [],
11340
+ total: (res?.sentences || res?.all_sentences)?.length || 0
11336
11341
  } : {
11337
11342
  hot: [],
11338
11343
  total: 0
@@ -11517,8 +11522,8 @@ var __webpack_exports__ = {};
11517
11522
  return (0, share_namespaceObject.response)(isSuccess ? 0 : 414, message, data);
11518
11523
  };
11519
11524
  const DouyinGetMusicByCategoryParamsSchema = ActionCommonParamsSchema.extend({
11520
- category_id: schemas_string().optional(),
11521
- type: schemas_string().optional(),
11525
+ category_id: schemas_string(),
11526
+ type: schemas_string(),
11522
11527
  count: schemas_number().optional()
11523
11528
  });
11524
11529
  const { sign_datail: douyinGetMusicByCategory_sign_datail, sign_reply: douyinGetMusicByCategory_sign_reply } = __webpack_require__("./src/utils/douyin/douyin.js");
@@ -11665,7 +11670,7 @@ var __webpack_exports__ = {};
11665
11670
  params.accountId
11666
11671
  ];
11667
11672
  const http = new Http(...args);
11668
- const keyword = params.keyword || "";
11673
+ const keyword = params.keyword || "热点";
11669
11674
  const topicParams = {
11670
11675
  keyword: keyword,
11671
11676
  source: "challenge_create",
@@ -11711,6 +11716,282 @@ var __webpack_exports__ = {};
11711
11716
  };
11712
11717
  return (0, share_namespaceObject.response)(isSuccess ? 0 : 414, message, data);
11713
11718
  };
11719
+ const rpa_scanRetryMaxCount = 60;
11720
+ const rpa_waitQrcodeResultMaxTime = 2000 * rpa_scanRetryMaxCount;
11721
+ const douyinLogin_rpa_rpaAction = async (task, params)=>{
11722
+ const reporter = task.reportService?.reportLoginStatus ?? (()=>Promise.resolve());
11723
+ let page;
11724
+ let statusMachine = "new";
11725
+ let isSelfClosing = false;
11726
+ try {
11727
+ page = await task.createPage({
11728
+ url: "https://creator.douyin.com/"
11729
+ });
11730
+ if (!task._session?.id) throw new Error("Session ID 不存在");
11731
+ task._steelBrowser?.on("disconnected", ()=>{
11732
+ if (task.debug && isSelfClosing) task.logger.info("执行结束,关闭浏览器!");
11733
+ else task.logger.info("浏览器被手动释放或意外关闭!");
11734
+ });
11735
+ } catch (e) {
11736
+ task.logger.error("浏览器启动失败", e);
11737
+ return {
11738
+ code: 500,
11739
+ message: `浏览器启动失败: ${e}`,
11740
+ data: {}
11741
+ };
11742
+ }
11743
+ await page.route("**/*.mp4", (route)=>route.abort());
11744
+ await page.route("**/*.png", (route)=>route.abort());
11745
+ await page.route("**/*.ttf", (route)=>route.abort());
11746
+ await page.addInitScript(()=>{
11747
+ window.requestAnimationFrame = ()=>0;
11748
+ });
11749
+ await page.addInitScript(()=>{
11750
+ const removeEventBlockers = ()=>{
11751
+ try {
11752
+ const blockers = document.querySelectorAll('[style*="pointer-events: none"]');
11753
+ blockers.forEach((el)=>{
11754
+ el.style.pointerEvents = "auto";
11755
+ });
11756
+ document.body.style.pointerEvents = "auto";
11757
+ if (window.__DOUYIN_ANTI_DEBUG__) delete window.__DOUYIN_ANTI_DEBUG__;
11758
+ } catch (e) {}
11759
+ };
11760
+ removeEventBlockers();
11761
+ setInterval(removeEventBlockers, 1000);
11762
+ if ("undefined" != typeof MutationObserver) {
11763
+ const observer = new MutationObserver(removeEventBlockers);
11764
+ observer.observe(document.documentElement, {
11765
+ childList: true,
11766
+ subtree: true,
11767
+ attributes: true,
11768
+ attributeFilter: [
11769
+ "style"
11770
+ ]
11771
+ });
11772
+ }
11773
+ });
11774
+ task.logger.info("页面创建成功,开始Bypass页面事件屏蔽...");
11775
+ try {
11776
+ await page.waitForResponse((response)=>response.url().includes("/272.6591d0af.js") && 200 === response.status(), {
11777
+ timeout: 15000
11778
+ });
11779
+ await page.waitForLoadState("networkidle");
11780
+ await page.goto("about:blank");
11781
+ await page.goBack({
11782
+ waitUntil: "domcontentloaded"
11783
+ });
11784
+ task.logger.info("已返回登录页面,页面事件屏蔽Bypass完成...");
11785
+ } catch (e) {
11786
+ task.logger.warn("Bypass 超时,继续执行...", {
11787
+ error: e
11788
+ });
11789
+ }
11790
+ await page.waitForTimeout(2000);
11791
+ try {
11792
+ const loginButtonSelector = ".douyin-creator-master-icon-default.douyin-creator-master-icon-user_circle";
11793
+ await page.waitForSelector(loginButtonSelector, {
11794
+ state: "visible",
11795
+ timeout: 10000
11796
+ });
11797
+ const clicked = await page.evaluate((selector)=>{
11798
+ const btn = document.querySelector(selector);
11799
+ if (btn) {
11800
+ btn.click();
11801
+ return true;
11802
+ }
11803
+ return false;
11804
+ }, loginButtonSelector);
11805
+ if (clicked) task.logger.info("✅ 登录按钮点击成功(使用 JavaScript)");
11806
+ else {
11807
+ await page.locator(loginButtonSelector).click({
11808
+ force: true,
11809
+ timeout: 5000
11810
+ });
11811
+ task.logger.info("✅ 登录按钮点击成功(使用 Playwright force)");
11812
+ }
11813
+ } catch (e) {
11814
+ task.logger.error("❌ 点击登录按钮失败", e);
11815
+ return {
11816
+ code: 500,
11817
+ message: "无法点击登录按钮,页面可能已被屏蔽",
11818
+ data: {}
11819
+ };
11820
+ }
11821
+ await page.waitForTimeout(3000);
11822
+ const pageInfo = await task._client?.sessions.liveDetails(task._session.id);
11823
+ const pageId = pageInfo?.pages[0].id ?? "";
11824
+ const baseHost = task._session.websocketUrl?.replace(/^wss?:\/\//, "") ?? "";
11825
+ const debugParams = new URLSearchParams({
11826
+ baseHost,
11827
+ pageId
11828
+ });
11829
+ const connectAddress = debugParams.toString();
11830
+ task.reportService?.settingSessionID?.(task._session?.id || "");
11831
+ task.logger.info("🔗 远程调试地址已生成,现在可以安全访问远程页面");
11832
+ await reporter(0, "浏览器启动成功,请使用抖音App扫码登录......", {
11833
+ connectAddress
11834
+ });
11835
+ const userInfo = {
11836
+ uniqueId: "",
11837
+ avatar: "",
11838
+ name: ""
11839
+ };
11840
+ try {
11841
+ await new Promise((resolve, reject)=>{
11842
+ let finished = false;
11843
+ const timer = setTimeout(()=>{
11844
+ cleanup(statusMachine);
11845
+ }, rpa_waitQrcodeResultMaxTime);
11846
+ const cleanup = (status)=>{
11847
+ if (finished) return;
11848
+ finished = true;
11849
+ clearTimeout(timer);
11850
+ page.off("response", handleWebCommon);
11851
+ page.off("response", handleCheckQR);
11852
+ if (void 0 !== status) reject(status);
11853
+ };
11854
+ const handleWebCommon = async (resp)=>{
11855
+ try {
11856
+ const url = resp.url();
11857
+ if (url.includes("/web/common")) {
11858
+ cleanup();
11859
+ const headers = resp.headers();
11860
+ const xmst = headers["x-ms-token"];
11861
+ const date = headers["x-tt-timestamp"];
11862
+ if (xmst && date) {
11863
+ const mstExpirDate = new Date(1000 * Number(date) + 604800000);
11864
+ const msToken = {
11865
+ name: "msToken",
11866
+ value: xmst,
11867
+ domain: ".bytedance.com",
11868
+ expires: mstExpirDate.getTime() / 1000,
11869
+ httpOnly: true,
11870
+ path: "/",
11871
+ sameSite: "None",
11872
+ secure: true
11873
+ };
11874
+ await page.context().addCookies([
11875
+ msToken
11876
+ ]);
11877
+ task.debug && task.logger.info("msToken 添加成功");
11878
+ task.debug && task.logger.info("msToken 检测成功:", {
11879
+ token: xmst.substring(0, 20) + "...",
11880
+ timestamp: date
11881
+ });
11882
+ }
11883
+ await reporter(0, "扫码成功!", {
11884
+ stage: "scanQrcode",
11885
+ connectAddress
11886
+ });
11887
+ resolve();
11888
+ } else if (url.includes("aweme/v1/creator/user/info")) try {
11889
+ const jsonUserInfo = await resp.json();
11890
+ userInfo.name = jsonUserInfo.user_profile.nick_name ?? "";
11891
+ userInfo.avatar = jsonUserInfo.user_profile.avatar_url ?? "";
11892
+ task.debug && task.logger.info("用户信息获取成功", userInfo);
11893
+ } catch (e) {
11894
+ task.logger.warn("无法解析用户信息:", {
11895
+ url,
11896
+ error: e
11897
+ });
11898
+ }
11899
+ else if (url.includes("/aweme/v1/creator/pc/user/info/")) try {
11900
+ const jsonUserInfo = await resp.json();
11901
+ userInfo.uniqueId = jsonUserInfo.uid ?? "";
11902
+ task.debug && task.logger.info("用户uniqueId 获取成功", userInfo);
11903
+ } catch (e) {
11904
+ task.logger.warn("无法解析用户信息:", {
11905
+ url,
11906
+ error: e
11907
+ });
11908
+ }
11909
+ } catch (err) {
11910
+ task.logger.error("监听登录结果出现异常", err);
11911
+ cleanup(err);
11912
+ }
11913
+ };
11914
+ const handleCheckQR = async (response)=>{
11915
+ try {
11916
+ const url = response.url();
11917
+ if (!url.includes("/check_qrconnect")) return;
11918
+ let jsonResponse;
11919
+ try {
11920
+ jsonResponse = await response.json();
11921
+ } catch (e) {
11922
+ task.logger.warn("Response body unavailable (likely navigation happened)", {
11923
+ url
11924
+ });
11925
+ return;
11926
+ }
11927
+ const status = jsonResponse?.data?.status;
11928
+ task.logger.info("check_qrconnect 状态:", {
11929
+ status
11930
+ });
11931
+ if ("scanned" === status) {
11932
+ task.logger.info("用户已扫码,等待确认...");
11933
+ page.on("response", handleWebCommon);
11934
+ }
11935
+ if ("confirmed" === status) {
11936
+ userInfo.uniqueId = jsonResponse.data?.user_data?.user_id_str || "";
11937
+ task.logger.info("扫码确认,开始监听登录完成...");
11938
+ page.off("response", handleCheckQR);
11939
+ }
11940
+ statusMachine = status || "new";
11941
+ if ("expired" === status) {
11942
+ task.logger.warn("二维码已过期");
11943
+ cleanup("expired");
11944
+ }
11945
+ } catch (err) {
11946
+ task.logger.error("handleCheckQR 异常:", err);
11947
+ }
11948
+ };
11949
+ page.on("response", handleCheckQR);
11950
+ });
11951
+ } catch (e) {
11952
+ const errMap = {
11953
+ new: "用户扫码已超时,请重试!",
11954
+ scanned: "用户扫码后未点击确认,请重试!",
11955
+ expired: "二维码已过期,请重试!"
11956
+ };
11957
+ isSelfClosing = true;
11958
+ const errorMessage = "string" == typeof e && errMap[e] ? errMap[e] : e instanceof Error ? e.message : String(e);
11959
+ return {
11960
+ code: 500,
11961
+ message: errorMessage,
11962
+ data: {
11963
+ stage: "scanQrcode",
11964
+ connectAddress
11965
+ }
11966
+ };
11967
+ }
11968
+ let securityData = {};
11969
+ let retryCount = 0;
11970
+ const maxRetries = 10;
11971
+ while(retryCount < maxRetries){
11972
+ securityData = await page.evaluate(()=>({
11973
+ "security-sdk/s_sdk_pri_key": localStorage.getItem("security-sdk/s_sdk_pri_key") || "",
11974
+ "security-sdk/s_sdk_pub_key": localStorage.getItem("security-sdk/s_sdk_pub_key") || "",
11975
+ "security-sdk/s_sdk_sign_data_key/web_protect": localStorage.getItem("security-sdk/s_sdk_sign_data_key/web_protect") || ""
11976
+ }));
11977
+ 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"]) {
11978
+ task.logger.info("Security SDK 数据已获取");
11979
+ break;
11980
+ }
11981
+ retryCount++;
11982
+ task.logger.info(`等待 Security SDK 数据... (${retryCount}/${maxRetries})`);
11983
+ await page.waitForTimeout(1000);
11984
+ }
11985
+ const cookie = JSON.stringify(await task._steelBrowserContext?.cookies());
11986
+ isSelfClosing = true;
11987
+ await page.close();
11988
+ return (0, share_namespaceObject.success)({
11989
+ connectAddress,
11990
+ cookie,
11991
+ userInfo,
11992
+ extraParam: securityData
11993
+ }, "登陆成功!");
11994
+ };
11714
11995
  const douyinLogin_rpa_server_scanRetryMaxCount = 60;
11715
11996
  const douyinLogin_rpa_server_waitQrcodeResultMaxTime = 2000 * douyinLogin_rpa_server_scanRetryMaxCount;
11716
11997
  const rpa_server_rpaServer = async (task, params)=>{
@@ -11724,10 +12005,9 @@ var __webpack_exports__ = {};
11724
12005
  params.accountId
11725
12006
  ];
11726
12007
  task.logger?.info(`==> 开始获取代理信息:${args}`);
11727
- const ProxyAgentWithLogger = ProxyAgent.bind({
12008
+ const ProxyAgentResult = await ProxyAgent({
11728
12009
  logger: task.logger
11729
- });
11730
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
12010
+ }, ...args);
11731
12011
  task.logger?.info("==> 代理信息获取成功!");
11732
12012
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
11733
12013
  }
@@ -11838,6 +12118,16 @@ var __webpack_exports__ = {};
11838
12118
  error: e
11839
12119
  });
11840
12120
  }
12121
+ else if (url.includes("/aweme/v1/creator/pc/user/info/")) try {
12122
+ const jsonUserInfo = await resp.json();
12123
+ userInfo.uniqueId = jsonUserInfo.uid ?? "";
12124
+ task.debug && task.logger.info("用户uniqueId 获取成功", userInfo);
12125
+ } catch (e) {
12126
+ task.logger.warn("无法解析用户信息:", {
12127
+ url,
12128
+ error: e
12129
+ });
12130
+ }
11841
12131
  } catch (err) {
11842
12132
  cleanup();
11843
12133
  reject(err);
@@ -11857,13 +12147,15 @@ var __webpack_exports__ = {};
11857
12147
  return;
11858
12148
  }
11859
12149
  const status = jsonResponse?.data?.status;
11860
- if ("scanned" === status) await updateTaskState?.({
11861
- state: share_namespaceObject.TaskState.SCANNED
11862
- });
12150
+ if ("scanned" === status) {
12151
+ await updateTaskState?.({
12152
+ state: share_namespaceObject.TaskState.SCANNED
12153
+ });
12154
+ page.on("response", handleWebCommon);
12155
+ }
11863
12156
  if ("confirmed" === status) {
11864
12157
  userInfo.uniqueId = jsonResponse.data?.user_data?.user_id_str || "";
11865
12158
  page.off("response", handleCheckQR);
11866
- page.on("response", handleWebCommon);
11867
12159
  }
11868
12160
  } catch (err) {
11869
12161
  cleanup();
@@ -11912,27 +12204,27 @@ var __webpack_exports__ = {};
11912
12204
  case types_ExecutionState.SUCCESS:
11913
12205
  {
11914
12206
  let securityData = {};
11915
- try {
12207
+ let retryCount = 0;
12208
+ const maxRetries = 10;
12209
+ while(retryCount < maxRetries){
11916
12210
  securityData = await page.evaluate(()=>({
11917
12211
  "security-sdk/s_sdk_pri_key": localStorage.getItem("security-sdk/s_sdk_pri_key") || "",
11918
12212
  "security-sdk/s_sdk_pub_key": localStorage.getItem("security-sdk/s_sdk_pub_key") || "",
11919
- "security-sdk/s_sdk_sign_data_key": localStorage.getItem("security-sdk/s_sdk_sign_data_key/web_protect") || ""
12213
+ "security-sdk/s_sdk_sign_data_key/web_protect": localStorage.getItem("security-sdk/s_sdk_sign_data_key/web_protect") || ""
11920
12214
  }));
11921
- task.logger.info("Security SDK 数据提取成功:", {
11922
- "security-sdk/s_sdk_pri_key": !!securityData["security-sdk/s_sdk_pri_key"],
11923
- "security-sdk/s_sdk_pub_key": !!securityData["security-sdk/s_sdk_pub_key"],
11924
- "security-sdk/s_sdk_sign_data_key": !!securityData["security-sdk/s_sdk_sign_data_key"]
11925
- });
11926
- } catch (error) {
11927
- task.logger.warn("提取 Security SDK 数据失败:", {
11928
- error: error instanceof Error ? error.message : String(error)
11929
- });
12215
+ 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"]) {
12216
+ task.logger.info("Security SDK 数据已获取");
12217
+ break;
12218
+ }
12219
+ retryCount++;
12220
+ task.logger.info(`等待 Security SDK 数据... (${retryCount}/${maxRetries})`);
12221
+ await page.waitForTimeout(1000);
11930
12222
  }
11931
12223
  await updateTaskState?.({
11932
12224
  state: share_namespaceObject.TaskState.SUCCESS,
11933
12225
  result: {
11934
12226
  cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
11935
- ...securityData,
12227
+ extraParam: securityData,
11936
12228
  userInfo: userInfo
11937
12229
  }
11938
12230
  });
@@ -11941,7 +12233,7 @@ var __webpack_exports__ = {};
11941
12233
  message: "成功",
11942
12234
  data: {
11943
12235
  cookie: JSON.stringify(await task.steelBrowserContext?.cookies()),
11944
- ...securityData,
12236
+ extraParam: securityData,
11945
12237
  userInfo
11946
12238
  }
11947
12239
  };
@@ -11955,6 +12247,7 @@ var __webpack_exports__ = {};
11955
12247
  }
11956
12248
  };
11957
12249
  const douyinLogin = async (task, params)=>{
12250
+ if ("rpa" === params.actionType) return douyinLogin_rpa_rpaAction(task, params);
11958
12251
  if ("mockApi" === params.actionType) return (0, share_namespaceObject.success)({}, "暂不支持mockApi");
11959
12252
  if ("server" === params.actionType) return rpa_server_rpaServer(task, params);
11960
12253
  return executeAction(rpa_server_rpaServer)(task, params);
@@ -11964,6 +12257,7 @@ var __webpack_exports__ = {};
11964
12257
  const { generateCsrfTokenAdvanced } = __webpack_require__("./src/utils/douyin/csrfToken.js");
11965
12258
  const { generateAuthorization, randomS, canonicalQueryString, calculateFileCrc32 } = __webpack_require__("./src/utils/douyin/douyinSign.js");
11966
12259
  const mock_mockAction = async (task, params)=>{
12260
+ 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 (0, share_namespaceObject.response)(400, "extraParam 参数缺失或不完整", "");
11967
12261
  const tmpCachePath = task.getTmpPath();
11968
12262
  let bdTicketGuardClientDataV2 = params.cookies.find((e)=>"bd_ticket_guard_client_data" === e.name)?.value || "";
11969
12263
  if (!bdTicketGuardClientDataV2) return (0, share_namespaceObject.response)(400, "bdTicketGuardClientDataV2 不能为空", "");
@@ -11983,9 +12277,9 @@ var __webpack_exports__ = {};
11983
12277
  ree_public_key = parsed.ree_public_key || "";
11984
12278
  ts_sign = parsed.ts_sign || "";
11985
12279
  } catch {}
11986
- const privateKey = params["security-sdk/s_sdk_pri_key"]?.data || "";
11987
- const publicKey = params["security-sdk/s_sdk_pub_key"]?.data || "";
11988
- const signData = JSON.parse(params["security-sdk/s_sdk_sign_data_key/web_protect"]?.data || "{}");
12280
+ const privateKey = params.extraParam["security-sdk/s_sdk_pri_key"]?.data || "";
12281
+ const publicKey = params.extraParam["security-sdk/s_sdk_pub_key"]?.data || "";
12282
+ const signData = JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"]?.data || "{}");
11989
12283
  console.log("privateKey:", privateKey);
11990
12284
  console.log("publicKey:", publicKey);
11991
12285
  console.log("signData:", signData);
@@ -12028,30 +12322,26 @@ var __webpack_exports__ = {};
12028
12322
  const publishData = {
12029
12323
  item: {
12030
12324
  common: {
12031
- text: params.title || "32234。sdsadadasda",
12032
- text_extra: '[{"start":0,"end":5,"hashtag_id":0,"hashtag_name":"","type":7},{"start":5,"end":6,"hashtag_id":0,"hashtag_name":"","type":8}]',
12325
+ text: params.content,
12326
+ text_extra: params.textExtra,
12033
12327
  activity: "[]",
12034
- challenges: "[]",
12328
+ challenges: params.challengeIds,
12035
12329
  hashtag_source: "",
12036
12330
  mentions: "[]",
12037
- music_id: "",
12038
- music_end_time: 0,
12039
- hot_sentence: "",
12040
- visibility_type: 0,
12041
- download: 0,
12042
- timing: -1,
12043
- media_type: 2,
12331
+ music_id: params.musicId,
12332
+ music_end_time: 1000 * (params.musicDuration || 0),
12333
+ hot_sentence: params.hotSentence || "",
12334
+ visibility_type: params.visibleRange || 0,
12335
+ download: params.allowSave ? 1 : 0,
12336
+ timing: params.isImmediatelyPublish ? -1 : params.scheduledPublish,
12337
+ media_type: params.publishType || 2,
12044
12338
  images: []
12045
12339
  },
12046
12340
  cover: {
12047
12341
  poster: ""
12048
12342
  },
12049
- mix: {},
12050
- anchor: {
12051
- poi_name: "",
12052
- poi_id: "",
12053
- anchor_content: "{}"
12054
- },
12343
+ mix: params.mix || {},
12344
+ anchor: {},
12055
12345
  declare: {
12056
12346
  user_declare_info: "{}"
12057
12347
  }
@@ -12315,8 +12605,8 @@ var __webpack_exports__ = {};
12315
12605
  const descInstance = page.locator("div[data-placeholder='添加作品描述...']");
12316
12606
  await descInstance.click();
12317
12607
  await descInstance.pressSequentially(params.content.replace(/#.*?\[.*?]#/g, "") || "22222");
12318
- if ("2" === params.visibleRange) await page.locator("label:has-text('好友可见')").first().click();
12319
- else if ("3" === params.visibleRange) await page.locator("label:has-text('仅自己可见')").first().click();
12608
+ if ("1" === params.visibleRange) await page.locator("label:has-text('好友可见')").first().click();
12609
+ else if ("2" === params.visibleRange) await page.locator("label:has-text('仅自己可见')").first().click();
12320
12610
  if (!params.isImmediatelyPublish) {
12321
12611
  await await page.locator('label:has-text("定时发布")').first().click();
12322
12612
  await page.waitForTimeout(500);
@@ -12351,74 +12641,51 @@ var __webpack_exports__ = {};
12351
12641
  await page.close();
12352
12642
  return (0, share_namespaceObject.success)(response);
12353
12643
  };
12354
- const FictionalRendition = schemas_object({
12355
- type: literal("fictional-rendition")
12356
- });
12357
- const AIGenerated = schemas_object({
12358
- type: literal("ai-generated")
12359
- });
12360
- const SourceStatement = schemas_object({
12361
- type: literal("source-statement"),
12362
- childType: schemas_enum([
12363
- "self-labeling",
12364
- "self-shooting",
12365
- "transshipment"
12366
- ]),
12367
- shootingLocation: schemas_object({
12368
- id: schemas_string(),
12369
- name: schemas_string(),
12370
- latitude: schemas_number().optional(),
12371
- longitude: schemas_number().optional()
12372
- }).optional(),
12373
- shootingDate: schemas_string().optional(),
12374
- sourceMedia: schemas_string().optional()
12375
- });
12376
- union([
12377
- FictionalRendition,
12378
- AIGenerated,
12379
- SourceStatement
12380
- ]);
12381
12644
  const DouyinPublishParamsSchema = ActionCommonParamsSchema.extend({
12382
- banners: schemas_array(schemas_string()),
12383
12645
  title: schemas_string(),
12384
12646
  content: schemas_string(),
12385
- coverImage: schemas_string().optional(),
12386
- videoFile: schemas_string().optional(),
12387
- address: schemas_object({
12388
- id: schemas_string(),
12389
- name: schemas_string(),
12390
- latitude: schemas_number().optional(),
12391
- longitude: schemas_number().optional()
12392
- }).optional(),
12393
- selfDeclaration: custom().optional(),
12647
+ textExtra: schemas_string(),
12394
12648
  topic: schemas_array(schemas_object({
12395
12649
  id: schemas_string(),
12396
12650
  word: schemas_string()
12397
12651
  })).optional(),
12652
+ coverImage: schemas_string().optional(),
12653
+ banners: schemas_array(schemas_string()),
12654
+ mix: schemas_object({
12655
+ mix_id: schemas_string(),
12656
+ mix_order: schemas_number()
12657
+ }),
12658
+ musicId: schemas_string(),
12659
+ musicDuration: schemas_number().optional(),
12660
+ challengeIds: schemas_string(),
12661
+ hotSentence: schemas_string(),
12398
12662
  proxyLoc: schemas_string().optional(),
12399
12663
  localIP: schemas_string().optional(),
12400
12664
  visibleRange: schemas_enum([
12665
+ "0",
12401
12666
  "1",
12402
- "2",
12403
- "3"
12667
+ "2"
12404
12668
  ]).optional(),
12405
12669
  isImmediatelyPublish: schemas_boolean().optional(),
12406
12670
  scheduledPublish: schemas_string().optional(),
12407
- isOriginal: schemas_boolean().optional(),
12408
- allowCoProduce: schemas_boolean().optional(),
12409
- allowCopy: schemas_boolean().optional(),
12671
+ allowSave: schemas_boolean().optional(),
12410
12672
  publishType: schemas_enum([
12411
12673
  "1",
12412
12674
  "2",
12413
12675
  "3",
12414
12676
  "4"
12415
12677
  ]).optional(),
12416
- publishAction: schemas_enum([
12417
- "publish",
12418
- "draft"
12419
- ]).optional(),
12420
- isAiCoverImage: schemas_boolean().optional(),
12421
- summary: schemas_string().optional()
12678
+ extraParam: schemas_object({
12679
+ "security-sdk/s_sdk_pri_key": schemas_object({
12680
+ data: schemas_string()
12681
+ }),
12682
+ "security-sdk/s_sdk_pub_key": schemas_object({
12683
+ data: schemas_string()
12684
+ }),
12685
+ "security-sdk/s_sdk_sign_data_key/web_protect": schemas_object({
12686
+ data: schemas_string()
12687
+ })
12688
+ })
12422
12689
  });
12423
12690
  const douyinPublish = async (task, params)=>{
12424
12691
  if ("rpa" === params.actionType) return douyinPublish_rpa_rpaAction(task, params);
@@ -14193,8 +14460,8 @@ var __webpack_exports__ = {};
14193
14460
  const message = `用户文章信息获取${isSuccess ? "成功!" : "失败,请检查!"}${_task.debug ? ` ${http.proxyInfo}` : ""}`;
14194
14461
  return (0, share_namespaceObject.response)(isSuccess ? 0 : 414, message, INITIAL_STATE);
14195
14462
  };
14196
- const rpa_scanRetryMaxCount = 60;
14197
- const rpa_waitQrcodeResultMaxTime = 2000 * rpa_scanRetryMaxCount;
14463
+ const toutiaoLogin_rpa_scanRetryMaxCount = 60;
14464
+ const toutiaoLogin_rpa_waitQrcodeResultMaxTime = 2000 * toutiaoLogin_rpa_scanRetryMaxCount;
14198
14465
  const toutiaoLogin_rpa_rpaAction = async (task, _params)=>{
14199
14466
  const reporter = task.reportService?.reportLoginStatus ?? (()=>Promise.resolve());
14200
14467
  let page;
@@ -14239,7 +14506,7 @@ var __webpack_exports__ = {};
14239
14506
  let finished = false;
14240
14507
  const timer = setTimeout(()=>{
14241
14508
  cleanup(statusMachine);
14242
- }, rpa_waitQrcodeResultMaxTime);
14509
+ }, toutiaoLogin_rpa_waitQrcodeResultMaxTime);
14243
14510
  const cleanup = (status)=>{
14244
14511
  if (finished) return;
14245
14512
  finished = true;
@@ -14338,10 +14605,9 @@ var __webpack_exports__ = {};
14338
14605
  params.accountId
14339
14606
  ];
14340
14607
  task.logger?.info(`==> 开始获取代理信息:${args}`);
14341
- const ProxyAgentWithLogger = ProxyAgent.bind({
14608
+ const ProxyAgentResult = await ProxyAgent({
14342
14609
  logger: task.logger
14343
- });
14344
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
14610
+ }, ...args);
14345
14611
  task.logger?.info("==> 代理信息获取成功!");
14346
14612
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
14347
14613
  }
@@ -15381,10 +15647,9 @@ var __webpack_exports__ = {};
15381
15647
  params.accountId
15382
15648
  ];
15383
15649
  task.logger?.info(`==> 开始获取代理信息:${args}`);
15384
- const ProxyAgentWithLogger = ProxyAgent.bind({
15650
+ const ProxyAgentResult = await ProxyAgent({
15385
15651
  logger: task.logger
15386
- });
15387
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
15652
+ }, ...args);
15388
15653
  task.logger?.info("==> 代理信息获取成功!");
15389
15654
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
15390
15655
  }
@@ -17297,10 +17562,9 @@ var __webpack_exports__ = {};
17297
17562
  params.accountId
17298
17563
  ];
17299
17564
  task.logger?.info(`==> 开始获取代理信息:${args}`);
17300
- const ProxyAgentWithLogger = ProxyAgent.bind({
17565
+ const ProxyAgentResult = await ProxyAgent({
17301
17566
  logger: task.logger
17302
- });
17303
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
17567
+ }, ...args);
17304
17568
  task.logger?.info("==> 代理信息获取成功!");
17305
17569
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
17306
17570
  }
@@ -18133,10 +18397,9 @@ var __webpack_exports__ = {};
18133
18397
  params.accountId
18134
18398
  ];
18135
18399
  task.logger?.info(`==> 开始获取代理信息:${args}`);
18136
- const ProxyAgentWithLogger = ProxyAgent.bind({
18400
+ const ProxyAgentResult = await ProxyAgent({
18137
18401
  logger: task.logger
18138
- });
18139
- const ProxyAgentResult = await ProxyAgentWithLogger(...args);
18402
+ }, ...args);
18140
18403
  task.logger?.info("==> 代理信息获取成功!");
18141
18404
  proxyUrl = ProxyAgentResult ? `http://${ProxyAgentResult.ip}:${ProxyAgentResult.port}` : void 0;
18142
18405
  }
@@ -18883,13 +19146,13 @@ var __webpack_exports__ = {};
18883
19146
  });
18884
19147
  return (0, share_namespaceObject.success)(data, message);
18885
19148
  };
18886
- const xiaohongshuPublish_FictionalRendition = schemas_object({
19149
+ const FictionalRendition = schemas_object({
18887
19150
  type: literal("fictional-rendition")
18888
19151
  });
18889
- const xiaohongshuPublish_AIGenerated = schemas_object({
19152
+ const AIGenerated = schemas_object({
18890
19153
  type: literal("ai-generated")
18891
19154
  });
18892
- const xiaohongshuPublish_SourceStatement = schemas_object({
19155
+ const SourceStatement = schemas_object({
18893
19156
  type: literal("source-statement"),
18894
19157
  childType: schemas_enum([
18895
19158
  "self-labeling",
@@ -18901,9 +19164,9 @@ var __webpack_exports__ = {};
18901
19164
  sourceMedia: schemas_string().optional()
18902
19165
  });
18903
19166
  union([
18904
- xiaohongshuPublish_FictionalRendition,
18905
- xiaohongshuPublish_AIGenerated,
18906
- xiaohongshuPublish_SourceStatement
19167
+ FictionalRendition,
19168
+ AIGenerated,
19169
+ SourceStatement
18907
19170
  ]);
18908
19171
  const XiaohongshuPublishParamsSchema = ActionCommonParamsSchema.extend({
18909
19172
  banners: schemas_array(schemas_string()),