@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/actions/douyinGetHot/index.d.ts +1 -0
- package/dist/actions/douyinGetMusicByCategory/schema.d.ts +2 -2
- package/dist/actions/douyinGetMusicCategory/schema.d.ts +1 -1
- package/dist/actions/douyinLogin/rpa.d.ts +2 -0
- package/dist/actions/douyinPublish/index.d.ts +24 -50
- package/dist/bundle.js +387 -124
- package/dist/bundle.js.map +1 -1
- package/dist/index.js +387 -124
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +387 -124
- package/dist/index.mjs.map +1 -1
- package/dist/utils/proxy.d.ts +1 -1
- package/package.json +1 -1
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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()
|
|
11521
|
-
type: schemas_string()
|
|
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
|
|
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)
|
|
11861
|
-
|
|
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
|
-
|
|
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
|
-
|
|
11922
|
-
"
|
|
11923
|
-
|
|
11924
|
-
|
|
11925
|
-
|
|
11926
|
-
|
|
11927
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
12032
|
-
text_extra:
|
|
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 ("
|
|
12319
|
-
else if ("
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12417
|
-
"
|
|
12418
|
-
|
|
12419
|
-
|
|
12420
|
-
|
|
12421
|
-
|
|
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
|
|
14197
|
-
const
|
|
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
|
-
},
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
19149
|
+
const FictionalRendition = schemas_object({
|
|
18887
19150
|
type: literal("fictional-rendition")
|
|
18888
19151
|
});
|
|
18889
|
-
const
|
|
19152
|
+
const AIGenerated = schemas_object({
|
|
18890
19153
|
type: literal("ai-generated")
|
|
18891
19154
|
});
|
|
18892
|
-
const
|
|
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
|
-
|
|
18905
|
-
|
|
18906
|
-
|
|
19167
|
+
FictionalRendition,
|
|
19168
|
+
AIGenerated,
|
|
19169
|
+
SourceStatement
|
|
18907
19170
|
]);
|
|
18908
19171
|
const XiaohongshuPublishParamsSchema = ActionCommonParamsSchema.extend({
|
|
18909
19172
|
banners: schemas_array(schemas_string()),
|