@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/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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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()
|
|
30213
|
-
type: classic_schemas_string()
|
|
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
|
|
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)
|
|
30553
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30614
|
-
"
|
|
30615
|
-
|
|
30616
|
-
|
|
30617
|
-
|
|
30618
|
-
|
|
30619
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
30724
|
-
text_extra:
|
|
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 ("
|
|
31011
|
-
else if ("
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31109
|
-
"
|
|
31110
|
-
|
|
31111
|
-
|
|
31112
|
-
|
|
31113
|
-
|
|
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
|
|
32889
|
-
const
|
|
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
|
-
},
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
37841
|
+
const FictionalRendition = classic_schemas_object({
|
|
37579
37842
|
type: literal("fictional-rendition")
|
|
37580
37843
|
});
|
|
37581
|
-
const
|
|
37844
|
+
const AIGenerated = classic_schemas_object({
|
|
37582
37845
|
type: literal("ai-generated")
|
|
37583
37846
|
});
|
|
37584
|
-
const
|
|
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
|
-
|
|
37597
|
-
|
|
37598
|
-
|
|
37859
|
+
FictionalRendition,
|
|
37860
|
+
AIGenerated,
|
|
37861
|
+
SourceStatement
|
|
37599
37862
|
]);
|
|
37600
37863
|
const XiaohongshuPublishParamsSchema = ActionCommonParamsSchema.extend({
|
|
37601
37864
|
banners: classic_schemas_array(classic_schemas_string()),
|