@iflyrpa/actions 4.0.4-beta.2 → 4.0.4-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.js +466 -409
- package/dist/bundle.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +464 -407
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +463 -408
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/bundle.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*! For license information please see bundle.js.LICENSE.txt */
|
|
2
2
|
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="23789fb9-5e79-5f5c-bdf9-9ec950534422")}catch(e){}}();
|
|
4
4
|
var __webpack_modules__ = {
|
|
5
5
|
"../../node_modules/.pnpm/agent-base@7.1.4/node_modules/agent-base/dist/helpers.js": function(__unused_webpack_module, exports1, __webpack_require__) {
|
|
6
6
|
"use strict";
|
|
@@ -12476,6 +12476,8 @@ var __webpack_exports__ = {};
|
|
|
12476
12476
|
bjhConfigDataSchema: ()=>bjhConfigDataSchema,
|
|
12477
12477
|
Action: ()=>Action,
|
|
12478
12478
|
ProxyAgent: ()=>ProxyAgent,
|
|
12479
|
+
douyinConfigDataSchema: ()=>douyinConfigDataSchema,
|
|
12480
|
+
shipinhaoConfigDataSchema: ()=>shipinhaoConfigDataSchema,
|
|
12479
12481
|
version: ()=>package_namespaceObject_0.i8
|
|
12480
12482
|
});
|
|
12481
12483
|
var common_utils_namespaceObject = {};
|
|
@@ -12490,7 +12492,7 @@ var __webpack_exports__ = {};
|
|
|
12490
12492
|
var package_namespaceObject = {
|
|
12491
12493
|
i8: "0.1.2"
|
|
12492
12494
|
};
|
|
12493
|
-
var package_namespaceObject_0 = JSON.parse('{"i8":"4.0.4-beta.
|
|
12495
|
+
var package_namespaceObject_0 = JSON.parse('{"i8":"4.0.4-beta.4"}');
|
|
12494
12496
|
const external_node_fs_namespaceObject = require("node:fs");
|
|
12495
12497
|
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
12496
12498
|
const external_node_http_namespaceObject = require("node:http");
|
|
@@ -38514,400 +38516,421 @@ var __webpack_exports__ = {};
|
|
|
38514
38516
|
}
|
|
38515
38517
|
return randomString;
|
|
38516
38518
|
}
|
|
38519
|
+
function safeSerialize(obj) {
|
|
38520
|
+
if (!obj || "object" != typeof obj) return obj;
|
|
38521
|
+
try {
|
|
38522
|
+
return JSON.parse(JSON.stringify(obj));
|
|
38523
|
+
} catch (error) {
|
|
38524
|
+
return {};
|
|
38525
|
+
}
|
|
38526
|
+
}
|
|
38517
38527
|
const mock_mockAction = async (task, params)=>{
|
|
38518
38528
|
const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
|
|
38519
38529
|
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"] || !params.extraParam["security-sdk/s_sdk_server_cert_key"] || !params.extraParam["security-sdk/s_sdk_crypt_sdk"]) return utils_response(414, "extraParam 参数缺失或不完整", "");
|
|
38520
|
-
|
|
38521
|
-
|
|
38522
|
-
|
|
38523
|
-
|
|
38524
|
-
|
|
38525
|
-
|
|
38526
|
-
|
|
38527
|
-
|
|
38528
|
-
|
|
38529
|
-
|
|
38530
|
-
|
|
38531
|
-
|
|
38532
|
-
|
|
38533
|
-
|
|
38534
|
-
|
|
38535
|
-
|
|
38536
|
-
|
|
38537
|
-
|
|
38538
|
-
|
|
38539
|
-
|
|
38540
|
-
|
|
38541
|
-
|
|
38542
|
-
|
|
38543
|
-
|
|
38544
|
-
|
|
38545
|
-
|
|
38546
|
-
|
|
38547
|
-
|
|
38548
|
-
|
|
38549
|
-
|
|
38550
|
-
|
|
38551
|
-
|
|
38552
|
-
|
|
38553
|
-
|
|
38554
|
-
|
|
38555
|
-
|
|
38556
|
-
|
|
38557
|
-
|
|
38558
|
-
|
|
38559
|
-
|
|
38560
|
-
|
|
38561
|
-
|
|
38562
|
-
|
|
38563
|
-
|
|
38564
|
-
|
|
38565
|
-
|
|
38566
|
-
|
|
38567
|
-
|
|
38568
|
-
|
|
38569
|
-
|
|
38570
|
-
|
|
38571
|
-
|
|
38572
|
-
|
|
38573
|
-
|
|
38574
|
-
|
|
38575
|
-
|
|
38576
|
-
|
|
38577
|
-
|
|
38578
|
-
|
|
38579
|
-
|
|
38580
|
-
|
|
38581
|
-
|
|
38582
|
-
|
|
38583
|
-
|
|
38584
|
-
|
|
38585
|
-
|
|
38586
|
-
|
|
38587
|
-
|
|
38588
|
-
|
|
38589
|
-
|
|
38590
|
-
|
|
38591
|
-
|
|
38592
|
-
|
|
38530
|
+
let currentStep = "初始化";
|
|
38531
|
+
try {
|
|
38532
|
+
currentStep = "验证账号信息";
|
|
38533
|
+
const userAgent = params.userAgent || "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.38";
|
|
38534
|
+
const sessionidCookie = params.cookies.find((it)=>"msToken" === it.name)?.value;
|
|
38535
|
+
if (!sessionidCookie) return {
|
|
38536
|
+
code: 414,
|
|
38537
|
+
message: "账号数据异常,请重新绑定账号后重试。",
|
|
38538
|
+
data: ""
|
|
38539
|
+
};
|
|
38540
|
+
currentStep = "准备请求参数";
|
|
38541
|
+
const headers = {
|
|
38542
|
+
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
38543
|
+
origin: "https://creator.douyin.com",
|
|
38544
|
+
referer: "https://creator.douyin.com/creator-micro/content/post/image?default-tab=3&enter_from=publish_page&media_type=image&type=new",
|
|
38545
|
+
Accept: "application/json, text/plain, */*",
|
|
38546
|
+
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
38547
|
+
"Content-Type": "application/json",
|
|
38548
|
+
pragma: "no-cache",
|
|
38549
|
+
"cache-control": "no-cache",
|
|
38550
|
+
"sec-ch-ua-platform": params.extraParam?.browserInfo?.["sec-ch-ua-platform"] || "",
|
|
38551
|
+
"sec-ch-ua": params.extraParam?.browserInfo?.["sec-ch-ua"] || "",
|
|
38552
|
+
"bd-ticket-guard-web-version": "2",
|
|
38553
|
+
"sec-ch-ua-mobile": "?0",
|
|
38554
|
+
"user-agent": userAgent,
|
|
38555
|
+
"sec-fetch-site": "same-origin",
|
|
38556
|
+
"sec-fetch-mode": "cors",
|
|
38557
|
+
"sec-fetch-dest": "empty",
|
|
38558
|
+
"accept-language": "zh-CN,zh;q=0.9",
|
|
38559
|
+
priority: "u=1, i"
|
|
38560
|
+
};
|
|
38561
|
+
const publishParams = {
|
|
38562
|
+
read_aid: "2906",
|
|
38563
|
+
aid: "1128",
|
|
38564
|
+
cookie_enabled: "true",
|
|
38565
|
+
screen_width: params.extraParam?.browserInfo.screen_width || "1920",
|
|
38566
|
+
screen_height: params.extraParam?.browserInfo.screen_height || "1080",
|
|
38567
|
+
browser_language: params.extraParam?.browserInfo.browser_language || "zh-CN",
|
|
38568
|
+
browser_platform: params.extraParam?.browserInfo.browser_platform || "Win32",
|
|
38569
|
+
browser_name: params.extraParam?.browserInfo.browser_name || "Mozilla",
|
|
38570
|
+
browser_version: userAgent,
|
|
38571
|
+
browser_online: "true",
|
|
38572
|
+
timezone_name: "Asia/Shanghai",
|
|
38573
|
+
support_h265: "1",
|
|
38574
|
+
msToken: params.cookies.find((e)=>"msToken" === e.name)?.value || "",
|
|
38575
|
+
a_bogus: ""
|
|
38576
|
+
};
|
|
38577
|
+
task.logger.info(`[douyinPublish] publishParams ${JSON.stringify(publishParams)}`);
|
|
38578
|
+
const publishData = {
|
|
38579
|
+
item: {
|
|
38580
|
+
common: {
|
|
38581
|
+
text: params.content,
|
|
38582
|
+
text_extra: params.textExtra,
|
|
38583
|
+
activity: "[]",
|
|
38584
|
+
challenges: params.challengeIds || "[]",
|
|
38585
|
+
hashtag_source: "",
|
|
38586
|
+
mentions: "[]",
|
|
38587
|
+
music_id: params.musicId || "",
|
|
38588
|
+
music_end_time: 1000 * (params.musicDuration || 0),
|
|
38589
|
+
hot_sentence: params.hotSentence || "",
|
|
38590
|
+
visibility_type: Number(params.visibleRange) || 0,
|
|
38591
|
+
download: params.allowSave ? 1 : 0,
|
|
38592
|
+
timing: params.isImmediatelyPublish ? -1 : params.scheduledPublish,
|
|
38593
|
+
media_type: Number(params.publishType) || 2,
|
|
38594
|
+
images: [],
|
|
38595
|
+
creation_id: ""
|
|
38596
|
+
},
|
|
38597
|
+
cover: {
|
|
38598
|
+
poster: ""
|
|
38599
|
+
},
|
|
38600
|
+
mix: params.mix ? {
|
|
38601
|
+
mix_id: params.mix.mix_id,
|
|
38602
|
+
mix_order: params.mix.mix_order || 0
|
|
38603
|
+
} : {},
|
|
38604
|
+
anchor: {},
|
|
38605
|
+
declare: {
|
|
38606
|
+
user_declare_info: "{}"
|
|
38607
|
+
}
|
|
38593
38608
|
}
|
|
38594
|
-
}
|
|
38595
|
-
|
|
38596
|
-
|
|
38597
|
-
|
|
38609
|
+
};
|
|
38610
|
+
const args = [
|
|
38611
|
+
{
|
|
38612
|
+
headers
|
|
38613
|
+
},
|
|
38614
|
+
task.logger,
|
|
38615
|
+
"",
|
|
38616
|
+
"",
|
|
38617
|
+
params.accountId,
|
|
38618
|
+
"douyin"
|
|
38619
|
+
];
|
|
38620
|
+
const http = new Http({
|
|
38598
38621
|
headers
|
|
38599
|
-
}
|
|
38600
|
-
|
|
38601
|
-
|
|
38602
|
-
|
|
38603
|
-
|
|
38604
|
-
|
|
38605
|
-
|
|
38606
|
-
|
|
38607
|
-
|
|
38608
|
-
|
|
38609
|
-
|
|
38610
|
-
|
|
38611
|
-
|
|
38612
|
-
|
|
38613
|
-
|
|
38614
|
-
|
|
38615
|
-
|
|
38616
|
-
|
|
38617
|
-
|
|
38618
|
-
|
|
38619
|
-
|
|
38620
|
-
|
|
38621
|
-
|
|
38622
|
-
|
|
38623
|
-
|
|
38624
|
-
|
|
38622
|
+
});
|
|
38623
|
+
const proxyHttp = new Http(...args);
|
|
38624
|
+
const uploadedImgList = params.uploadedImgList ? JSON.parse(params.uploadedImgList) : [];
|
|
38625
|
+
if (uploadedImgList.length > 0) publishData.item.common.images = uploadedImgList;
|
|
38626
|
+
else {
|
|
38627
|
+
const tmpCachePath = task.getTmpPath();
|
|
38628
|
+
const uploader = new DouyinImageUploader(proxyHttp, headers, publishParams, tmpCachePath);
|
|
38629
|
+
if (params.coverImage) {
|
|
38630
|
+
const cover = await uploader.uploadCover(params.coverImage);
|
|
38631
|
+
if (cover) {
|
|
38632
|
+
publishData.item.common.images.push({
|
|
38633
|
+
uri: cover.uri,
|
|
38634
|
+
width: cover.width,
|
|
38635
|
+
height: cover.height
|
|
38636
|
+
});
|
|
38637
|
+
publishData.item.cover = {
|
|
38638
|
+
poster: cover.uri
|
|
38639
|
+
};
|
|
38640
|
+
}
|
|
38641
|
+
}
|
|
38642
|
+
if (params.banners && params.banners.length > 0) {
|
|
38643
|
+
const banners = params.banners.filter((i)=>i !== params.coverImage);
|
|
38644
|
+
const uploadResults = await uploader.uploadImages(banners);
|
|
38645
|
+
publishData.item.common.images = publishData.item.common.images.concat(uploadResults.map((result)=>({
|
|
38646
|
+
uri: result.uri,
|
|
38647
|
+
width: result.width,
|
|
38648
|
+
height: result.height
|
|
38649
|
+
})));
|
|
38650
|
+
}
|
|
38651
|
+
}
|
|
38652
|
+
publishData.item.common.creation_id = generateRandomString(8) + Date.now();
|
|
38653
|
+
let decision = null;
|
|
38654
|
+
proxyHttp.addResponseInterceptor((response)=>{
|
|
38655
|
+
task.logger.info(`[douyinPublish] 拦截器收到响应response.headers: ${JSON.stringify(response.headers)} `);
|
|
38656
|
+
task.logger.info(`[douyinPublish] 拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
38657
|
+
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
38658
|
+
if (needsVerification(decision)) {
|
|
38659
|
+
task.logger.info(`[douyinPublish] 检测到需要验证: ${JSON.stringify(decision)}`);
|
|
38660
|
+
return;
|
|
38661
|
+
}
|
|
38662
|
+
if (!response || !response.data) return;
|
|
38663
|
+
const responseData = response.data;
|
|
38664
|
+
if (response && responseData?.status_code && 0 !== responseData.status_code) {
|
|
38665
|
+
const errorCode = 4 === responseData.status_code ? 500 : responseData.status_code;
|
|
38666
|
+
if (4 === responseData.status_code) task.logger.warn(`[douyinPublish] 抖音服务器错误 status_code: 4,映射为 500 触发重试。原始响应: ${JSON.stringify(responseData)}`);
|
|
38667
|
+
return {
|
|
38668
|
+
code: errorCode,
|
|
38669
|
+
message: responseData.status_msg || "文章发布异常,请稍后重试。",
|
|
38670
|
+
data: responseData
|
|
38625
38671
|
};
|
|
38626
38672
|
}
|
|
38673
|
+
});
|
|
38674
|
+
task._timerRecord.PrePublish = Date.now();
|
|
38675
|
+
if (MockPublish) {
|
|
38676
|
+
const data = "123456789";
|
|
38677
|
+
const message = `图文模拟发布成功 ${http.proxyInfo}`;
|
|
38678
|
+
await updateTaskState?.({
|
|
38679
|
+
state: types_TaskState.SUCCESS,
|
|
38680
|
+
result: {
|
|
38681
|
+
response: data
|
|
38682
|
+
}
|
|
38683
|
+
});
|
|
38684
|
+
return utils_response(0, message, data);
|
|
38627
38685
|
}
|
|
38628
|
-
|
|
38629
|
-
|
|
38630
|
-
|
|
38631
|
-
|
|
38632
|
-
|
|
38633
|
-
|
|
38634
|
-
|
|
38635
|
-
|
|
38636
|
-
|
|
38637
|
-
|
|
38638
|
-
|
|
38639
|
-
|
|
38640
|
-
|
|
38641
|
-
|
|
38642
|
-
|
|
38643
|
-
|
|
38644
|
-
|
|
38645
|
-
|
|
38646
|
-
|
|
38686
|
+
let webProtectData;
|
|
38687
|
+
try {
|
|
38688
|
+
webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
|
|
38689
|
+
if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
|
|
38690
|
+
task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
|
|
38691
|
+
return utils_response(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
|
|
38692
|
+
}
|
|
38693
|
+
} catch (error) {
|
|
38694
|
+
task.logger.error(`解析 webProtectData 失败: ${error}`);
|
|
38695
|
+
return utils_response(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
|
|
38696
|
+
}
|
|
38697
|
+
let ticket = webProtectData.ticket;
|
|
38698
|
+
let ts_sign = webProtectData.ts_sign;
|
|
38699
|
+
const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
|
|
38700
|
+
if (serverDataCookie) try {
|
|
38701
|
+
const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
|
|
38702
|
+
if (decoded.ticket && decoded.ts_sign) {
|
|
38703
|
+
if (decoded.ticket !== ticket) task.logger.info("[douyinPublish] 使用 cookie 中的最新 ticket(web_protect 已过期)");
|
|
38704
|
+
ticket = decoded.ticket;
|
|
38705
|
+
ts_sign = decoded.ts_sign;
|
|
38706
|
+
}
|
|
38707
|
+
} catch (error) {
|
|
38708
|
+
task.logger.info(`[douyinPublish] 解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
|
|
38647
38709
|
}
|
|
38648
|
-
|
|
38649
|
-
|
|
38650
|
-
|
|
38651
|
-
|
|
38652
|
-
|
|
38653
|
-
|
|
38654
|
-
|
|
38655
|
-
|
|
38656
|
-
|
|
38657
|
-
|
|
38710
|
+
let ec_privateKey;
|
|
38711
|
+
try {
|
|
38712
|
+
ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
|
|
38713
|
+
if (!ec_privateKey) {
|
|
38714
|
+
task.logger.error("[douyinPublish] ec_privateKey 为空");
|
|
38715
|
+
return utils_response(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
|
|
38716
|
+
}
|
|
38717
|
+
} catch (error) {
|
|
38718
|
+
task.logger.error(`[douyinPublish] 解析 ec_privateKey 失败: ${error}`);
|
|
38719
|
+
return utils_response(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
|
|
38658
38720
|
}
|
|
38659
|
-
|
|
38660
|
-
|
|
38661
|
-
|
|
38662
|
-
|
|
38663
|
-
|
|
38664
|
-
|
|
38665
|
-
state: types_TaskState.SUCCESS,
|
|
38666
|
-
result: {
|
|
38667
|
-
response: data
|
|
38721
|
+
let certificate;
|
|
38722
|
+
try {
|
|
38723
|
+
certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
|
|
38724
|
+
if (!certificate) {
|
|
38725
|
+
task.logger.error("[douyinPublish] certificate 为空");
|
|
38726
|
+
return utils_response(414, "安全参数 certificate 缺失,请重新获取后重试", "");
|
|
38668
38727
|
}
|
|
38669
|
-
})
|
|
38670
|
-
|
|
38671
|
-
|
|
38672
|
-
let webProtectData;
|
|
38673
|
-
try {
|
|
38674
|
-
webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
|
|
38675
|
-
if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
|
|
38676
|
-
task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
|
|
38677
|
-
return utils_response(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
|
|
38728
|
+
} catch (error) {
|
|
38729
|
+
task.logger.error(`[douyinPublish] 解析 certificate 失败: ${error}`);
|
|
38730
|
+
return utils_response(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
|
|
38678
38731
|
}
|
|
38679
|
-
|
|
38680
|
-
|
|
38681
|
-
|
|
38682
|
-
|
|
38683
|
-
|
|
38684
|
-
|
|
38685
|
-
|
|
38686
|
-
|
|
38687
|
-
|
|
38688
|
-
|
|
38689
|
-
if (
|
|
38690
|
-
|
|
38691
|
-
|
|
38732
|
+
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
38733
|
+
let bdTicketGuardClientData;
|
|
38734
|
+
try {
|
|
38735
|
+
bdTicketGuardClientData = getBdV2({
|
|
38736
|
+
ticket,
|
|
38737
|
+
ts_sign: ts_sign,
|
|
38738
|
+
ec_privateKey: ec_privateKey,
|
|
38739
|
+
certificate: certificate,
|
|
38740
|
+
bd_ticket_guard_ree_public_key: ree_public_key
|
|
38741
|
+
});
|
|
38742
|
+
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
38743
|
+
task.logger.error(`[douyinPublish] bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
38744
|
+
return utils_response(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
38745
|
+
}
|
|
38746
|
+
} catch (error) {
|
|
38747
|
+
task.logger.error(`[douyinPublish] 生成 bdTicketGuardClientData 失败: ${error}`);
|
|
38748
|
+
return utils_response(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
|
|
38692
38749
|
}
|
|
38693
|
-
|
|
38694
|
-
|
|
38695
|
-
|
|
38696
|
-
|
|
38697
|
-
|
|
38698
|
-
|
|
38699
|
-
|
|
38700
|
-
|
|
38701
|
-
|
|
38750
|
+
task.logger.info("[douyinPublish] bdTicketGuardClientData 生成成功");
|
|
38751
|
+
const publishQuery = {
|
|
38752
|
+
...publishParams,
|
|
38753
|
+
a_bogus: ""
|
|
38754
|
+
};
|
|
38755
|
+
const queryString = new URLSearchParams(publishQuery).toString();
|
|
38756
|
+
let aBogus;
|
|
38757
|
+
try {
|
|
38758
|
+
aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
|
|
38759
|
+
if (!aBogus || aBogus.length < 10) {
|
|
38760
|
+
task.logger.error(`[douyinPublish] a_bogus 生成异常,长度过短: ${aBogus}`);
|
|
38761
|
+
return utils_response(414, "安全参数 a_bogus 生成失败,请重试", "");
|
|
38762
|
+
}
|
|
38763
|
+
} catch (error) {
|
|
38764
|
+
task.logger.error(`[douyinPublish] 生成 a_bogus 失败: ${error}`);
|
|
38765
|
+
return utils_response(414, "安全参数 a_bogus 生成异常,请重试", "");
|
|
38702
38766
|
}
|
|
38703
|
-
|
|
38704
|
-
|
|
38705
|
-
|
|
38706
|
-
|
|
38707
|
-
|
|
38708
|
-
|
|
38709
|
-
|
|
38710
|
-
|
|
38711
|
-
|
|
38712
|
-
|
|
38767
|
+
publishQuery.a_bogus = aBogus;
|
|
38768
|
+
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
38769
|
+
let csrfToken;
|
|
38770
|
+
try {
|
|
38771
|
+
csrfToken = mock_generateCsrfTokenAdvanced({
|
|
38772
|
+
cookies: params.cookies,
|
|
38773
|
+
url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
|
|
38774
|
+
method: "POST",
|
|
38775
|
+
userAgent
|
|
38776
|
+
});
|
|
38777
|
+
if (!csrfToken || csrfToken.length < 10) {
|
|
38778
|
+
task.logger.error(`[douyinPublish] csrfToken 生成异常,长度过短: ${csrfToken}`);
|
|
38779
|
+
return utils_response(414, "安全参数 csrfToken 生成失败,请重试", "");
|
|
38780
|
+
}
|
|
38781
|
+
task.logger.info(`[douyinPublish] csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
|
|
38782
|
+
} catch (error) {
|
|
38783
|
+
task.logger.error(`[douyinPublish] 生成 csrfToken 失败: ${error}`);
|
|
38784
|
+
return utils_response(414, "安全参数 csrfToken 生成异常,请重试", "");
|
|
38713
38785
|
}
|
|
38714
|
-
|
|
38715
|
-
|
|
38716
|
-
|
|
38717
|
-
|
|
38718
|
-
|
|
38719
|
-
|
|
38720
|
-
|
|
38721
|
-
bdTicketGuardClientData = getBdV2({
|
|
38722
|
-
ticket,
|
|
38723
|
-
ts_sign: ts_sign,
|
|
38724
|
-
ec_privateKey: ec_privateKey,
|
|
38725
|
-
certificate: certificate,
|
|
38726
|
-
bd_ticket_guard_ree_public_key: ree_public_key
|
|
38727
|
-
});
|
|
38728
|
-
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
38729
|
-
task.logger.error(`[douyinPublish] bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
38730
|
-
return utils_response(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
38786
|
+
let sessionDtrait;
|
|
38787
|
+
try {
|
|
38788
|
+
sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
|
|
38789
|
+
task.logger.info(`[douyinPublish] sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
|
|
38790
|
+
} catch (error) {
|
|
38791
|
+
task.logger.error(`[douyinPublish] 生成 sessionDtrait 失败: ${error}`);
|
|
38792
|
+
return utils_response(414, "安全参数 sessionDtrait 生成异常,请重试", "");
|
|
38731
38793
|
}
|
|
38732
|
-
|
|
38733
|
-
|
|
38734
|
-
|
|
38735
|
-
|
|
38736
|
-
|
|
38737
|
-
|
|
38738
|
-
|
|
38739
|
-
|
|
38740
|
-
|
|
38741
|
-
|
|
38742
|
-
|
|
38743
|
-
|
|
38744
|
-
|
|
38745
|
-
|
|
38746
|
-
|
|
38747
|
-
|
|
38794
|
+
task.logger.info(`[douyinPublish] headers: ${JSON.stringify({
|
|
38795
|
+
...headers,
|
|
38796
|
+
Referer: "https://creator.douyin.com/creator-micro/content/post/image?default-tab=3&enter_from=publish_page&media_type=image&type=new",
|
|
38797
|
+
"Content-Type": "application/json",
|
|
38798
|
+
Accept: "application/json, text/plain, */*",
|
|
38799
|
+
"bd-ticket-guard-client-data": bdTicketGuardClientData["headers_bd_ticket_guard_client_data"],
|
|
38800
|
+
"bd-ticket-guard-ree-public-key": bdTicketGuardClientData["headers_bd_ticket_guard_ree_public_key"],
|
|
38801
|
+
"bd-ticket-guard-version": "2",
|
|
38802
|
+
"bd-ticket-guard-web-sign-type": "1",
|
|
38803
|
+
"bd-ticket-guard-web-version": "2",
|
|
38804
|
+
"x-secsdk-csrf-token": csrfToken,
|
|
38805
|
+
"x-tt-session-dtrait": sessionDtrait || ""
|
|
38806
|
+
})}`);
|
|
38807
|
+
task.logger.info(`[douyinPublish] url: https://creator.douyin.com/web/api/media/aweme/create_v2/?${publishQueryParams}`);
|
|
38808
|
+
let publishResult;
|
|
38809
|
+
try {
|
|
38810
|
+
publishResult = await proxyHttp.api({
|
|
38811
|
+
method: "post",
|
|
38812
|
+
url: `https://creator.douyin.com/web/api/media/aweme/create_v2/?${publishQueryParams}`,
|
|
38813
|
+
data: publishData,
|
|
38814
|
+
defaultErrorMsg: "发布异常,请稍后重试。",
|
|
38815
|
+
headers: {
|
|
38816
|
+
...headers,
|
|
38817
|
+
Referer: "https://creator.douyin.com/creator-micro/content/post/image?default-tab=3&enter_from=publish_page&media_type=image&type=new",
|
|
38818
|
+
"Content-Type": "application/json",
|
|
38819
|
+
Accept: "application/json, text/plain, */*",
|
|
38820
|
+
"bd-ticket-guard-client-data": bdTicketGuardClientData["headers_bd_ticket_guard_client_data"],
|
|
38821
|
+
"bd-ticket-guard-ree-public-key": bdTicketGuardClientData["headers_bd_ticket_guard_ree_public_key"],
|
|
38822
|
+
"bd-ticket-guard-version": "2",
|
|
38823
|
+
"bd-ticket-guard-web-sign-type": "1",
|
|
38824
|
+
"bd-ticket-guard-web-version": "2",
|
|
38825
|
+
"x-secsdk-csrf-token": csrfToken,
|
|
38826
|
+
"x-tt-session-dtrait": sessionDtrait || ""
|
|
38827
|
+
}
|
|
38828
|
+
}, {
|
|
38829
|
+
timeout: 60000,
|
|
38830
|
+
retries: 3,
|
|
38831
|
+
retryDelay: 2000
|
|
38832
|
+
});
|
|
38833
|
+
} catch (error) {
|
|
38834
|
+
const handledError = Http.handleApiError(error);
|
|
38835
|
+
const isProxyOrNetworkError = [
|
|
38836
|
+
599,
|
|
38837
|
+
500,
|
|
38838
|
+
502,
|
|
38839
|
+
503,
|
|
38840
|
+
504
|
|
38841
|
+
].includes(handledError.code);
|
|
38842
|
+
if (isProxyOrNetworkError) {
|
|
38843
|
+
const isProxyRequest = handledError.extra?.isProxyRequest === true;
|
|
38844
|
+
const errorType = 599 === handledError.code || isProxyRequest ? "代理错误" : "网络错误";
|
|
38845
|
+
const message = `图文发布失败,${errorType}:${handledError.message}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
38846
|
+
task.logger.error(`[douyinPublish] ${errorType},直接返回: ${message}`, stringifyError(handledError));
|
|
38847
|
+
await updateTaskState?.({
|
|
38848
|
+
state: types_TaskState.FAILED,
|
|
38849
|
+
error: message
|
|
38850
|
+
});
|
|
38851
|
+
return {
|
|
38852
|
+
code: 414,
|
|
38853
|
+
data: "",
|
|
38854
|
+
message
|
|
38855
|
+
};
|
|
38856
|
+
}
|
|
38857
|
+
throw error;
|
|
38748
38858
|
}
|
|
38749
|
-
|
|
38750
|
-
|
|
38751
|
-
|
|
38752
|
-
|
|
38753
|
-
|
|
38754
|
-
|
|
38755
|
-
|
|
38756
|
-
|
|
38757
|
-
|
|
38758
|
-
|
|
38759
|
-
|
|
38760
|
-
|
|
38761
|
-
|
|
38762
|
-
|
|
38763
|
-
|
|
38764
|
-
|
|
38765
|
-
|
|
38859
|
+
task.logger.info(`[douyinPublish] decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
|
|
38860
|
+
if (needsVerification(decision)) {
|
|
38861
|
+
const details = [
|
|
38862
|
+
publishResult.status_msg,
|
|
38863
|
+
decision?.verify_title,
|
|
38864
|
+
decision?.verify_desc
|
|
38865
|
+
].filter(Boolean).join(" ");
|
|
38866
|
+
const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
38867
|
+
const safeDecision = safeSerialize(decision) ?? {};
|
|
38868
|
+
const mockData = {
|
|
38869
|
+
state: types_TaskState.FAILED,
|
|
38870
|
+
error: message,
|
|
38871
|
+
result: {
|
|
38872
|
+
...safeDecision,
|
|
38873
|
+
data: decision,
|
|
38874
|
+
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
38875
|
+
}
|
|
38876
|
+
};
|
|
38877
|
+
await updateTaskState?.(mockData);
|
|
38878
|
+
return {
|
|
38879
|
+
code: 0,
|
|
38880
|
+
data: mockData,
|
|
38881
|
+
message: "操作成功"
|
|
38882
|
+
};
|
|
38766
38883
|
}
|
|
38767
|
-
|
|
38768
|
-
|
|
38769
|
-
|
|
38770
|
-
|
|
38771
|
-
|
|
38772
|
-
|
|
38773
|
-
|
|
38774
|
-
|
|
38775
|
-
|
|
38776
|
-
|
|
38777
|
-
|
|
38778
|
-
|
|
38779
|
-
|
|
38780
|
-
|
|
38781
|
-
|
|
38782
|
-
|
|
38783
|
-
|
|
38784
|
-
Accept: "application/json, text/plain, */*",
|
|
38785
|
-
"bd-ticket-guard-client-data": bdTicketGuardClientData["headers_bd_ticket_guard_client_data"],
|
|
38786
|
-
"bd-ticket-guard-ree-public-key": bdTicketGuardClientData["headers_bd_ticket_guard_ree_public_key"],
|
|
38787
|
-
"bd-ticket-guard-version": "2",
|
|
38788
|
-
"bd-ticket-guard-web-sign-type": "1",
|
|
38789
|
-
"bd-ticket-guard-web-version": "2",
|
|
38790
|
-
"x-secsdk-csrf-token": csrfToken,
|
|
38791
|
-
"x-tt-session-dtrait": sessionDtrait || ""
|
|
38792
|
-
})}`);
|
|
38793
|
-
task.logger.info(`[douyinPublish] url: https://creator.douyin.com/web/api/media/aweme/create_v2/?${publishQueryParams}`);
|
|
38794
|
-
let publishResult;
|
|
38795
|
-
try {
|
|
38796
|
-
publishResult = await proxyHttp.api({
|
|
38797
|
-
method: "post",
|
|
38798
|
-
url: `https://creator.douyin.com/web/api/media/aweme/create_v2/?${publishQueryParams}`,
|
|
38799
|
-
data: publishData,
|
|
38800
|
-
defaultErrorMsg: "发布异常,请稍后重试。",
|
|
38801
|
-
headers: {
|
|
38802
|
-
...headers,
|
|
38803
|
-
Referer: "https://creator.douyin.com/creator-micro/content/post/image?default-tab=3&enter_from=publish_page&media_type=image&type=new",
|
|
38804
|
-
"Content-Type": "application/json",
|
|
38805
|
-
Accept: "application/json, text/plain, */*",
|
|
38806
|
-
"bd-ticket-guard-client-data": bdTicketGuardClientData["headers_bd_ticket_guard_client_data"],
|
|
38807
|
-
"bd-ticket-guard-ree-public-key": bdTicketGuardClientData["headers_bd_ticket_guard_ree_public_key"],
|
|
38808
|
-
"bd-ticket-guard-version": "2",
|
|
38809
|
-
"bd-ticket-guard-web-sign-type": "1",
|
|
38810
|
-
"bd-ticket-guard-web-version": "2",
|
|
38811
|
-
"x-secsdk-csrf-token": csrfToken,
|
|
38812
|
-
"x-tt-session-dtrait": sessionDtrait || ""
|
|
38813
|
-
}
|
|
38814
|
-
}, {
|
|
38815
|
-
timeout: 60000,
|
|
38816
|
-
retries: 3,
|
|
38817
|
-
retryDelay: 2000
|
|
38818
|
-
});
|
|
38819
|
-
} catch (error) {
|
|
38820
|
-
const handledError = Http.handleApiError(error);
|
|
38821
|
-
const isProxyOrNetworkError = [
|
|
38822
|
-
599,
|
|
38823
|
-
500,
|
|
38824
|
-
502,
|
|
38825
|
-
503,
|
|
38826
|
-
504
|
|
38827
|
-
].includes(handledError.code);
|
|
38828
|
-
if (isProxyOrNetworkError) {
|
|
38829
|
-
const isProxyRequest = handledError.extra?.isProxyRequest === true;
|
|
38830
|
-
const errorType = 599 === handledError.code || isProxyRequest ? "代理错误" : "网络错误";
|
|
38831
|
-
const message = `图文发布失败,${errorType}:${handledError.message}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
38832
|
-
task.logger.error(`[douyinPublish] ${errorType},直接返回: ${message}`, stringifyError(handledError));
|
|
38884
|
+
reportLogger({
|
|
38885
|
+
token: params.huiwenToken || "",
|
|
38886
|
+
enverionment: task.enverionment || "development",
|
|
38887
|
+
postId: params.articleId,
|
|
38888
|
+
eip: proxyHttp.proxyInfo,
|
|
38889
|
+
proxyIp: params.localIP,
|
|
38890
|
+
accountId: params.accountId,
|
|
38891
|
+
uid: params.uid,
|
|
38892
|
+
platform: "douyin",
|
|
38893
|
+
publishParams: publishData
|
|
38894
|
+
});
|
|
38895
|
+
task.logger.info(`[douyinPublish] 发布结果 ${JSON.stringify(publishResult)}`);
|
|
38896
|
+
const isSuccess = 0 === publishResult.status_code;
|
|
38897
|
+
const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
38898
|
+
const data = isSuccess ? publishResult.item_id || "" : "";
|
|
38899
|
+
if (!isSuccess) {
|
|
38900
|
+
const safeDecision = safeSerialize(decision) ?? {};
|
|
38833
38901
|
await updateTaskState?.({
|
|
38834
38902
|
state: types_TaskState.FAILED,
|
|
38835
|
-
error: message
|
|
38903
|
+
error: message,
|
|
38904
|
+
result: {
|
|
38905
|
+
...safeDecision,
|
|
38906
|
+
data: safeDecision,
|
|
38907
|
+
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
38908
|
+
}
|
|
38836
38909
|
});
|
|
38837
38910
|
return {
|
|
38838
38911
|
code: 414,
|
|
38839
|
-
data:
|
|
38912
|
+
data: safeDecision,
|
|
38840
38913
|
message
|
|
38841
38914
|
};
|
|
38842
38915
|
}
|
|
38843
|
-
|
|
38844
|
-
|
|
38845
|
-
task.logger.info(`[douyinPublish] decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
|
|
38846
|
-
if (needsVerification(decision)) {
|
|
38847
|
-
const details = [
|
|
38848
|
-
publishResult.status_msg,
|
|
38849
|
-
decision?.verify_title,
|
|
38850
|
-
decision?.verify_desc
|
|
38851
|
-
].filter(Boolean).join(" ");
|
|
38852
|
-
const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
38853
|
-
let decisionObj = {};
|
|
38854
|
-
if (decision) decisionObj = decision;
|
|
38855
|
-
const mockData = {
|
|
38856
|
-
state: types_TaskState.FAILED,
|
|
38857
|
-
error: message,
|
|
38916
|
+
await updateTaskState?.({
|
|
38917
|
+
state: types_TaskState.SUCCESS,
|
|
38858
38918
|
result: {
|
|
38859
|
-
|
|
38860
|
-
data: decision,
|
|
38861
|
-
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
38919
|
+
response: data
|
|
38862
38920
|
}
|
|
38863
|
-
};
|
|
38864
|
-
|
|
38865
|
-
|
|
38866
|
-
|
|
38867
|
-
|
|
38868
|
-
|
|
38869
|
-
};
|
|
38870
|
-
}
|
|
38871
|
-
reportLogger({
|
|
38872
|
-
token: params.huiwenToken || "",
|
|
38873
|
-
enverionment: task.enverionment || "development",
|
|
38874
|
-
postId: params.articleId,
|
|
38875
|
-
eip: proxyHttp.proxyInfo,
|
|
38876
|
-
proxyIp: params.localIP,
|
|
38877
|
-
accountId: params.accountId,
|
|
38878
|
-
uid: params.uid,
|
|
38879
|
-
platform: "douyin",
|
|
38880
|
-
publishParams: publishData
|
|
38881
|
-
});
|
|
38882
|
-
task.logger.info(`[douyinPublish] 发布结果 ${JSON.stringify(publishResult)}`);
|
|
38883
|
-
const isSuccess = 0 === publishResult.status_code;
|
|
38884
|
-
const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
38885
|
-
const data = isSuccess ? publishResult.item_id || "" : "";
|
|
38886
|
-
if (!isSuccess) {
|
|
38887
|
-
let decisionObj = {};
|
|
38888
|
-
if (decision) decisionObj = decision;
|
|
38921
|
+
});
|
|
38922
|
+
return utils_response(isSuccess ? 0 : 414, message, data);
|
|
38923
|
+
} catch (error) {
|
|
38924
|
+
const handledError = Http.handleApiError(error);
|
|
38925
|
+
const errorMsg = handledError.message || "发布失败";
|
|
38926
|
+
const errorCode = handledError.code || 500;
|
|
38927
|
+
task.logger.error(`[douyinPublish] 发布流程异常 (步骤: ${currentStep}): ${errorMsg}`, stringifyError(error), handledError.extra);
|
|
38889
38928
|
await updateTaskState?.({
|
|
38890
38929
|
state: types_TaskState.FAILED,
|
|
38891
|
-
error:
|
|
38892
|
-
result: {
|
|
38893
|
-
...decisionObj,
|
|
38894
|
-
data: decision,
|
|
38895
|
-
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
38896
|
-
}
|
|
38930
|
+
error: `${currentStep}失败: ${errorMsg}`
|
|
38897
38931
|
});
|
|
38898
|
-
return
|
|
38899
|
-
code: 414,
|
|
38900
|
-
data,
|
|
38901
|
-
message
|
|
38902
|
-
};
|
|
38932
|
+
return utils_response(errorCode, errorMsg, "");
|
|
38903
38933
|
}
|
|
38904
|
-
await updateTaskState?.({
|
|
38905
|
-
state: types_TaskState.SUCCESS,
|
|
38906
|
-
result: {
|
|
38907
|
-
response: data
|
|
38908
|
-
}
|
|
38909
|
-
});
|
|
38910
|
-
return utils_response(isSuccess ? 0 : 414, message, data);
|
|
38911
38934
|
};
|
|
38912
38935
|
const douyinPublish_rpa_rpaAction = async (task, params)=>{
|
|
38913
38936
|
const commonCookies = {
|
|
@@ -40520,12 +40543,12 @@ var __webpack_exports__ = {};
|
|
|
40520
40543
|
const douyinData = {
|
|
40521
40544
|
fansNum,
|
|
40522
40545
|
favedNum,
|
|
40523
|
-
fansNumLastWeek: toNum(ov?.
|
|
40524
|
-
watchNumLastWeek: toNum(ov?.
|
|
40525
|
-
likeNumLastWeek: toNum(ov?.
|
|
40526
|
-
commentNumLastWeek: toNum(ov?.
|
|
40527
|
-
shareNumLastWeek: toNum(ov?.
|
|
40528
|
-
visitNumLastWeek: toNum(ov?.
|
|
40546
|
+
fansNumLastWeek: toNum(ov?.new_fans?.last_period_incr),
|
|
40547
|
+
watchNumLastWeek: toNum(ov?.play?.last_period_incr),
|
|
40548
|
+
likeNumLastWeek: toNum(ov?.digg?.last_period_incr),
|
|
40549
|
+
commentNumLastWeek: toNum(ov?.comment?.last_period_incr),
|
|
40550
|
+
shareNumLastWeek: toNum(ov?.share?.last_period_incr),
|
|
40551
|
+
visitNumLastWeek: toNum(ov?.profile?.last_period_incr)
|
|
40529
40552
|
};
|
|
40530
40553
|
return success(douyinData, "抖音平台数据获取成功!");
|
|
40531
40554
|
} catch (error) {
|
|
@@ -41164,7 +41187,7 @@ var __webpack_exports__ = {};
|
|
|
41164
41187
|
}
|
|
41165
41188
|
async function handleShipinhaoData(_task, params) {
|
|
41166
41189
|
try {
|
|
41167
|
-
const { cookies, postType = "all", pageNum = 1, pageSize =
|
|
41190
|
+
const { cookies, postType = "all", pageNum = 1, pageSize = 10, showOriginalData = false } = params;
|
|
41168
41191
|
const aidCookie = cookies.find((it)=>"_aid" === it.name)?.value;
|
|
41169
41192
|
const aid = aidCookie || "9d3e0e9f-b842-498d-a273-4285d58df264";
|
|
41170
41193
|
const uinCookie = cookies.find((it)=>"uin" === it.name || "wxuin" === it.name)?.value || "0000000000";
|
|
@@ -41190,7 +41213,7 @@ var __webpack_exports__ = {};
|
|
|
41190
41213
|
];
|
|
41191
41214
|
const http = new Http(...args);
|
|
41192
41215
|
const finderIdCookie = cookies.find((it)=>"_log_finder_id" === it.name || "finder_id" === it.name)?.value || "";
|
|
41193
|
-
async function fetchPosts(currentPage, userpageType, pageUrl) {
|
|
41216
|
+
async function fetchPosts(currentPage, userpageType, pageUrl, rawKeyBuff = "") {
|
|
41194
41217
|
return await http.api({
|
|
41195
41218
|
method: "post",
|
|
41196
41219
|
url: "https://channels.weixin.qq.com/micro/content/cgi-bin/mmfinderassistant-bin/post/post_list",
|
|
@@ -41207,7 +41230,7 @@ var __webpack_exports__ = {};
|
|
|
41207
41230
|
timestamp: Date.now().toString(),
|
|
41208
41231
|
_log_finder_uin: "",
|
|
41209
41232
|
_log_finder_id: finderIdCookie,
|
|
41210
|
-
rawKeyBuff
|
|
41233
|
+
rawKeyBuff,
|
|
41211
41234
|
pluginSessionId: null,
|
|
41212
41235
|
scene: 7,
|
|
41213
41236
|
reqScene: 7
|
|
@@ -41218,6 +41241,37 @@ var __webpack_exports__ = {};
|
|
|
41218
41241
|
timeout: 5000
|
|
41219
41242
|
});
|
|
41220
41243
|
}
|
|
41244
|
+
async function fetchAllPosts(userpageType, pageUrl) {
|
|
41245
|
+
const allPosts = [];
|
|
41246
|
+
let currentPage = 1;
|
|
41247
|
+
let rawKeyBuff = "";
|
|
41248
|
+
let continueFlag = true;
|
|
41249
|
+
let totalCount = 0;
|
|
41250
|
+
while(continueFlag){
|
|
41251
|
+
const response = await fetchPosts(currentPage, userpageType, pageUrl, rawKeyBuff);
|
|
41252
|
+
if (response.errCode && AUTH_ERROR_CODES.includes(response.errCode)) throw new Error(`AUTH_ERROR:${response.errMsg || "登录已失效"}`);
|
|
41253
|
+
if (response.errCode) {
|
|
41254
|
+
_task.logger.warn(`视频号API错误:${response.errMsg} (${response.errCode})`);
|
|
41255
|
+
throw new Error(`视频号API错误:${response.errMsg} (${response.errCode})`);
|
|
41256
|
+
}
|
|
41257
|
+
if (1 === currentPage) totalCount = response.data?.totalCount ?? 0;
|
|
41258
|
+
const posts = response.data?.list || response.posts || response.post_list || [];
|
|
41259
|
+
allPosts.push(...posts);
|
|
41260
|
+
continueFlag = response.data?.continueFlag ?? false;
|
|
41261
|
+
rawKeyBuff = response.data?.lastBuff || "";
|
|
41262
|
+
_task.logger.info(`获取${11 === userpageType ? "视频" : "图文"}第${currentPage}页,本页${posts.length}条,累计${allPosts.length}条,continueFlag=${continueFlag}`);
|
|
41263
|
+
currentPage++;
|
|
41264
|
+
if (currentPage > 100) {
|
|
41265
|
+
_task.logger.warn("分页超过100页,停止请求");
|
|
41266
|
+
break;
|
|
41267
|
+
}
|
|
41268
|
+
}
|
|
41269
|
+
if (totalCount > 0 && allPosts.length !== totalCount) _task.logger.warn(`视频号分页可能不完整:期望${totalCount}条,实际${allPosts.length}条`);
|
|
41270
|
+
return {
|
|
41271
|
+
posts: allPosts,
|
|
41272
|
+
totalCount
|
|
41273
|
+
};
|
|
41274
|
+
}
|
|
41221
41275
|
const mapPost = (item, forcePostType)=>{
|
|
41222
41276
|
let imageUrl = "";
|
|
41223
41277
|
if (item.desc?.media?.[0]?.thumbUrl) imageUrl = item.desc.media[0].thumbUrl;
|
|
@@ -41253,21 +41307,14 @@ var __webpack_exports__ = {};
|
|
|
41253
41307
|
300331,
|
|
41254
41308
|
300332
|
|
41255
41309
|
];
|
|
41310
|
+
let combinedTotal = 0;
|
|
41256
41311
|
if (needVideo) try {
|
|
41257
41312
|
const videoPageUrl = "https://channels.weixin.qq.com/micro/content/post/list";
|
|
41258
|
-
const
|
|
41259
|
-
_task.logger.info(
|
|
41260
|
-
|
|
41261
|
-
|
|
41262
|
-
|
|
41263
|
-
throw new Error(`视频号API错误:${videoResponse.errMsg} (${videoResponse.errCode})`);
|
|
41264
|
-
}
|
|
41265
|
-
{
|
|
41266
|
-
const posts = videoResponse.data?.list || videoResponse.posts || videoResponse.post_list || [];
|
|
41267
|
-
const videoArticles = posts.filter((item)=>item.createTime || item.create_time).map((item)=>mapPost(item, "video"));
|
|
41268
|
-
allArticles.push(...videoArticles);
|
|
41269
|
-
_task.logger.info(`视频号视频获取成功,共${videoArticles.length}条`);
|
|
41270
|
-
}
|
|
41313
|
+
const { posts, totalCount } = await fetchAllPosts(11, videoPageUrl);
|
|
41314
|
+
_task.logger.info(`视频号视频获取响应:共${posts.length}条,totalCount=${totalCount}`);
|
|
41315
|
+
const videoArticles = posts.filter((item)=>item.createTime || item.create_time).map((item)=>mapPost(item, "video"));
|
|
41316
|
+
allArticles.push(...videoArticles);
|
|
41317
|
+
combinedTotal += totalCount || videoArticles.length;
|
|
41271
41318
|
} catch (error) {
|
|
41272
41319
|
const errMsg = error instanceof Error ? error.message : String(error);
|
|
41273
41320
|
if (errMsg.startsWith("AUTH_ERROR:")) throw error;
|
|
@@ -41275,30 +41322,26 @@ var __webpack_exports__ = {};
|
|
|
41275
41322
|
}
|
|
41276
41323
|
if (needArticle) try {
|
|
41277
41324
|
const articlePageUrl = "https://channels.weixin.qq.com/micro/content/post/finderNewLifePostList";
|
|
41278
|
-
const
|
|
41279
|
-
|
|
41280
|
-
|
|
41281
|
-
|
|
41282
|
-
|
|
41283
|
-
}
|
|
41284
|
-
{
|
|
41285
|
-
const posts = articleResponse.data?.list || articleResponse.posts || articleResponse.post_list || [];
|
|
41286
|
-
const articleArticles = posts.filter((item)=>item.createTime || item.create_time).map((item)=>mapPost(item, "article"));
|
|
41287
|
-
allArticles.push(...articleArticles);
|
|
41288
|
-
_task.logger.info(`视频号图文获取成功,共${articleArticles.length}条`);
|
|
41289
|
-
}
|
|
41325
|
+
const { posts, totalCount } = await fetchAllPosts(10, articlePageUrl);
|
|
41326
|
+
_task.logger.info(`视频号图文获取响应:共${posts.length}条,totalCount=${totalCount}`);
|
|
41327
|
+
const articleArticles = posts.filter((item)=>item.createTime || item.create_time).map((item)=>mapPost(item, "article"));
|
|
41328
|
+
allArticles.push(...articleArticles);
|
|
41329
|
+
combinedTotal += totalCount || articleArticles.length;
|
|
41290
41330
|
} catch (error) {
|
|
41291
41331
|
const errMsg = error instanceof Error ? error.message : String(error);
|
|
41292
41332
|
if (errMsg.startsWith("AUTH_ERROR:")) throw error;
|
|
41293
41333
|
_task.logger.warn(`获取视频号图文失败:${errMsg}`);
|
|
41294
41334
|
}
|
|
41295
41335
|
allArticles.sort((a, b)=>b.createTime - a.createTime);
|
|
41296
|
-
|
|
41336
|
+
const total = allArticles.length;
|
|
41337
|
+
const start = (pageNum - 1) * pageSize;
|
|
41338
|
+
const pageItems = allArticles.slice(start, start + pageSize);
|
|
41339
|
+
_task.logger.info(`视频号数据获取成功,合计${total}条,第${pageNum}页返回${pageItems.length}条`);
|
|
41297
41340
|
return success({
|
|
41298
|
-
articleCell:
|
|
41341
|
+
articleCell: pageItems,
|
|
41299
41342
|
pagination: {
|
|
41300
|
-
total
|
|
41301
|
-
nextPage:
|
|
41343
|
+
total,
|
|
41344
|
+
nextPage: start + pageSize < total,
|
|
41302
41345
|
pageNum,
|
|
41303
41346
|
pageSize
|
|
41304
41347
|
}
|
|
@@ -43683,7 +43726,9 @@ var __webpack_exports__ = {};
|
|
|
43683
43726
|
task.logger.info("[shipinhaoPublish] 开始执行视频号发布 - Mock API 方式");
|
|
43684
43727
|
const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
|
|
43685
43728
|
if (!params.extraParam.fingerPrintDeviceId || !params.extraParam.aId) return utils_response(400, "fingerPrintDeviceId和aId 不能为空", "");
|
|
43729
|
+
let currentStep = "初始化";
|
|
43686
43730
|
try {
|
|
43731
|
+
currentStep = "解析认证信息";
|
|
43687
43732
|
const cookieString = params.cookies.map((c)=>`${c.name}=${c.value}`).join("; ");
|
|
43688
43733
|
const fingerPrintDeviceId = params.extraParam.fingerPrintDeviceId;
|
|
43689
43734
|
const aId = params.extraParam.aId;
|
|
@@ -43704,8 +43749,10 @@ var __webpack_exports__ = {};
|
|
|
43704
43749
|
headers
|
|
43705
43750
|
});
|
|
43706
43751
|
const proxyHttp = new Http(...args);
|
|
43752
|
+
currentStep = "验证发布参数";
|
|
43707
43753
|
if (!params.banners || 0 === params.banners.length) return utils_response(400, "至少需要一张图片", "");
|
|
43708
43754
|
const images = params.banners.slice(0, 18).filter((img)=>"string" == typeof img);
|
|
43755
|
+
currentStep = "获取用户信息";
|
|
43709
43756
|
task.logger.info("[shipinhaoPublish] 获取用户信息...");
|
|
43710
43757
|
console.log("cookieString", cookieString);
|
|
43711
43758
|
const userInfo = await mock_getUserInfo(cookieString, http);
|
|
@@ -43716,6 +43763,7 @@ var __webpack_exports__ = {};
|
|
|
43716
43763
|
}
|
|
43717
43764
|
const finderUsername = userInfo.data.finderUser.finderUsername;
|
|
43718
43765
|
console.log(finderUsername);
|
|
43766
|
+
currentStep = "获取上传认证密钥";
|
|
43719
43767
|
task.logger.info("[shipinhaoPublish] 获取上传认证密钥...");
|
|
43720
43768
|
const authKeyResponse = await getUploadAuthKey(cookieString, finderUsername, http);
|
|
43721
43769
|
if (0 !== authKeyResponse.errCode || !authKeyResponse.data?.authKey) return utils_response(authKeyResponse.errCode || 500, `获取上传认证参数失败: ${authKeyResponse.errMsg}`, "");
|
|
@@ -43723,10 +43771,12 @@ var __webpack_exports__ = {};
|
|
|
43723
43771
|
const uin = authKeyResponse.data.uin;
|
|
43724
43772
|
if (!uin) return utils_response(500, "获取用户 uin 失败", "");
|
|
43725
43773
|
const taskId = String(generateUUID());
|
|
43774
|
+
currentStep = "上传图片";
|
|
43726
43775
|
task.logger.info(`[shipinhaoPublish] 开始上传 ${images.length} 张图片...`);
|
|
43727
43776
|
const uploadedImages = [];
|
|
43728
43777
|
for(let i = 0; i < images.length; i++){
|
|
43729
|
-
|
|
43778
|
+
currentStep = `上传图片 ${i + 1}/${images.length}`;
|
|
43779
|
+
task.logger.info(`[shipinhaoPublish] ${currentStep}...`);
|
|
43730
43780
|
const uploadResult = await uploadImageComplete(images[i], taskId, finderUsername, uin, authKey, http);
|
|
43731
43781
|
console.log(JSON.stringify(uploadResult));
|
|
43732
43782
|
if (!uploadResult.DownloadURL) return utils_response(500, `图片上传失败: ${uploadResult.errMsg}`, "");
|
|
@@ -43743,6 +43793,7 @@ var __webpack_exports__ = {};
|
|
|
43743
43793
|
urlCdnTaskId: ""
|
|
43744
43794
|
});
|
|
43745
43795
|
}
|
|
43796
|
+
currentStep = "发布图文内容";
|
|
43746
43797
|
task.logger.info("[shipinhaoPublish] 正在发布...");
|
|
43747
43798
|
const topicNames = params.topic || void 0;
|
|
43748
43799
|
const addressInfo = params.address ? {
|
|
@@ -43829,9 +43880,15 @@ var __webpack_exports__ = {};
|
|
|
43829
43880
|
});
|
|
43830
43881
|
return utils_response(resultCode || 500, errorMessage, "");
|
|
43831
43882
|
} catch (error) {
|
|
43832
|
-
const
|
|
43833
|
-
|
|
43834
|
-
|
|
43883
|
+
const handledError = Http.handleApiError(error);
|
|
43884
|
+
const errorMsg = handledError.message || "发布失败,请稍后重试";
|
|
43885
|
+
const errorCode = handledError.code || 500;
|
|
43886
|
+
task.logger.error(`[shipinhaoPublish] 发布流程异常: ${errorMsg}`, stringifyError(error), handledError.extra);
|
|
43887
|
+
await updateTaskState?.({
|
|
43888
|
+
state: types_TaskState.FAILED,
|
|
43889
|
+
error: errorMsg
|
|
43890
|
+
});
|
|
43891
|
+
return utils_response(errorCode, errorMsg, "");
|
|
43835
43892
|
}
|
|
43836
43893
|
};
|
|
43837
43894
|
const shipinhaoPublish_rpa_rpaAction = async (task, params)=>{
|
|
@@ -50337,7 +50394,7 @@ var __webpack_exports__ = {};
|
|
|
50337
50394
|
likeNumYesterday: classic_schemas_number().nullable(),
|
|
50338
50395
|
commentNumYesterday: classic_schemas_number().nullable()
|
|
50339
50396
|
});
|
|
50340
|
-
classic_schemas_object({
|
|
50397
|
+
const douyinConfigDataSchema = classic_schemas_object({
|
|
50341
50398
|
fansNum: classic_schemas_number(),
|
|
50342
50399
|
favedNum: classic_schemas_number(),
|
|
50343
50400
|
fansNumLastWeek: classic_schemas_number(),
|
|
@@ -50347,7 +50404,7 @@ var __webpack_exports__ = {};
|
|
|
50347
50404
|
shareNumLastWeek: classic_schemas_number(),
|
|
50348
50405
|
visitNumLastWeek: classic_schemas_number()
|
|
50349
50406
|
});
|
|
50350
|
-
classic_schemas_object({
|
|
50407
|
+
const shipinhaoConfigDataSchema = classic_schemas_object({
|
|
50351
50408
|
fansNum: classic_schemas_number(),
|
|
50352
50409
|
feedsCount: classic_schemas_number(),
|
|
50353
50410
|
fansNumYesterday: classic_schemas_number().nullable(),
|
|
@@ -50644,4 +50701,4 @@ if (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_targe
|
|
|
50644
50701
|
});
|
|
50645
50702
|
|
|
50646
50703
|
//# sourceMappingURL=bundle.js.map
|
|
50647
|
-
//# debugId=
|
|
50704
|
+
//# debugId=23789fb9-5e79-5f5c-bdf9-9ec950534422
|