@iflyrpa/actions 4.0.4 → 4.0.5
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/searchAccountInfo/index.d.ts +2 -4
- package/dist/actions/searchAccountInfo/types.d.ts +1 -21
- package/dist/actions/searchPublishInfo/index.d.ts +0 -7
- package/dist/actions/searchPublishInfo/types.d.ts +0 -97
- package/dist/actions/shipinhaoPublish/uploader.d.ts +0 -4
- package/dist/actions/weixinPublish/index.d.ts +2 -2
- package/dist/actions/xiaohongshuPublish/index.d.ts +1 -1
- package/dist/bundle.js +384 -990
- package/dist/bundle.js.map +1 -1
- package/dist/index.d.ts +1 -79
- package/dist/index.js +420 -1026
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +420 -1024
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/actions/searchAccountInfo/getDouyinInfo.d.ts +0 -16
- package/dist/actions/searchAccountInfo/getShipinhaoInfo.d.ts +0 -14
- package/dist/actions/searchPublishInfo/handleDouyinData.d.ts +0 -17
- package/dist/actions/searchPublishInfo/handleShipinhaoData.d.ts +0 -17
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
!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]="b88e36bc-ad59-5586-98ef-aba93fe1c33f")}catch(e){}}();
|
|
3
1
|
import * as __WEBPACK_EXTERNAL_MODULE_crypto__ from "crypto";
|
|
4
2
|
import * as __WEBPACK_EXTERNAL_MODULE_fs__ from "fs";
|
|
5
3
|
import * as __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_package_json_58ae5f06__ from "@iflyrpa/share/package.json";
|
|
@@ -4353,7 +4351,7 @@ function __webpack_require__(moduleId) {
|
|
|
4353
4351
|
};
|
|
4354
4352
|
})();
|
|
4355
4353
|
var package_namespaceObject = {
|
|
4356
|
-
i8: "4.0.
|
|
4354
|
+
i8: "4.0.5"
|
|
4357
4355
|
};
|
|
4358
4356
|
const PROXY_CREDENTIALS = [
|
|
4359
4357
|
{
|
|
@@ -4587,12 +4585,11 @@ class Http {
|
|
|
4587
4585
|
this.logger?.debug(`未处理的网络错误代码: ${error.code} ${error.message}`, {
|
|
4588
4586
|
errorString: stringifyError(error)
|
|
4589
4587
|
});
|
|
4590
|
-
_message =
|
|
4588
|
+
_message = `未知网络错误: ${error.message}`;
|
|
4591
4589
|
break;
|
|
4592
4590
|
}
|
|
4593
4591
|
}
|
|
4594
|
-
|
|
4595
|
-
else errorResponse.message = errorResponse.message ? errorResponse.message : _message;
|
|
4592
|
+
errorResponse.message = errorResponse.message ? errorResponse.message : _message;
|
|
4596
4593
|
if ("canceled" === errorResponse.message) {
|
|
4597
4594
|
const message = errorResponse.extra?.isProxyRequest ? "代理连接建立超时,请更换区域或稍后重试!" : "网络请求超时,请稍后重试!";
|
|
4598
4595
|
errorResponse.message = message;
|
|
@@ -13370,449 +13367,428 @@ function generateRandomString(length) {
|
|
|
13370
13367
|
}
|
|
13371
13368
|
return randomString;
|
|
13372
13369
|
}
|
|
13373
|
-
function safeSerialize(obj) {
|
|
13374
|
-
if (!obj || "object" != typeof obj) return obj;
|
|
13375
|
-
try {
|
|
13376
|
-
return JSON.parse(JSON.stringify(obj));
|
|
13377
|
-
} catch (error) {
|
|
13378
|
-
return {};
|
|
13379
|
-
}
|
|
13380
|
-
}
|
|
13381
13370
|
const mock_mockAction = async (task, params)=>{
|
|
13382
13371
|
const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
|
|
13383
13372
|
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 (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "extraParam 参数缺失或不完整", "");
|
|
13384
|
-
|
|
13385
|
-
|
|
13386
|
-
|
|
13387
|
-
|
|
13388
|
-
|
|
13389
|
-
|
|
13390
|
-
|
|
13391
|
-
|
|
13392
|
-
|
|
13393
|
-
|
|
13394
|
-
|
|
13395
|
-
|
|
13396
|
-
|
|
13397
|
-
|
|
13398
|
-
|
|
13399
|
-
|
|
13400
|
-
|
|
13401
|
-
|
|
13402
|
-
|
|
13403
|
-
|
|
13404
|
-
|
|
13405
|
-
|
|
13406
|
-
|
|
13407
|
-
|
|
13408
|
-
|
|
13409
|
-
|
|
13410
|
-
|
|
13411
|
-
|
|
13412
|
-
|
|
13413
|
-
|
|
13414
|
-
|
|
13415
|
-
|
|
13416
|
-
|
|
13417
|
-
|
|
13418
|
-
|
|
13419
|
-
|
|
13420
|
-
|
|
13421
|
-
|
|
13422
|
-
|
|
13423
|
-
|
|
13424
|
-
|
|
13425
|
-
|
|
13426
|
-
|
|
13427
|
-
|
|
13428
|
-
|
|
13429
|
-
|
|
13430
|
-
|
|
13431
|
-
|
|
13432
|
-
|
|
13433
|
-
|
|
13434
|
-
|
|
13435
|
-
|
|
13436
|
-
|
|
13437
|
-
|
|
13438
|
-
|
|
13439
|
-
|
|
13440
|
-
|
|
13441
|
-
|
|
13442
|
-
|
|
13443
|
-
|
|
13444
|
-
|
|
13445
|
-
|
|
13446
|
-
timing: params.isImmediatelyPublish ? -1 : params.scheduledPublish,
|
|
13447
|
-
media_type: Number(params.publishType) || 2,
|
|
13448
|
-
images: [],
|
|
13449
|
-
creation_id: ""
|
|
13450
|
-
},
|
|
13451
|
-
cover: {
|
|
13452
|
-
poster: ""
|
|
13453
|
-
},
|
|
13454
|
-
mix: params.mix ? {
|
|
13455
|
-
mix_id: params.mix.mix_id,
|
|
13456
|
-
mix_order: params.mix.mix_order || 0
|
|
13457
|
-
} : {},
|
|
13458
|
-
anchor: {},
|
|
13459
|
-
declare: {
|
|
13460
|
-
user_declare_info: "{}"
|
|
13461
|
-
}
|
|
13462
|
-
}
|
|
13463
|
-
};
|
|
13464
|
-
const args = [
|
|
13465
|
-
{
|
|
13466
|
-
headers
|
|
13373
|
+
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";
|
|
13374
|
+
const sessionidCookie = params.cookies.find((it)=>"msToken" === it.name)?.value;
|
|
13375
|
+
if (!sessionidCookie) return {
|
|
13376
|
+
code: 414,
|
|
13377
|
+
message: "账号数据异常,请重新绑定账号后重试。",
|
|
13378
|
+
data: ""
|
|
13379
|
+
};
|
|
13380
|
+
const headers = {
|
|
13381
|
+
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
13382
|
+
origin: "https://creator.douyin.com",
|
|
13383
|
+
referer: "https://creator.douyin.com/creator-micro/content/post/image?default-tab=3&enter_from=publish_page&media_type=image&type=new",
|
|
13384
|
+
Accept: "application/json, text/plain, */*",
|
|
13385
|
+
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
13386
|
+
"Content-Type": "application/json",
|
|
13387
|
+
pragma: "no-cache",
|
|
13388
|
+
"cache-control": "no-cache",
|
|
13389
|
+
"sec-ch-ua-platform": params.extraParam?.browserInfo?.["sec-ch-ua-platform"] || "",
|
|
13390
|
+
"sec-ch-ua": params.extraParam?.browserInfo?.["sec-ch-ua"] || "",
|
|
13391
|
+
"bd-ticket-guard-web-version": "2",
|
|
13392
|
+
"sec-ch-ua-mobile": "?0",
|
|
13393
|
+
"user-agent": userAgent,
|
|
13394
|
+
"sec-fetch-site": "same-origin",
|
|
13395
|
+
"sec-fetch-mode": "cors",
|
|
13396
|
+
"sec-fetch-dest": "empty",
|
|
13397
|
+
"accept-language": "zh-CN,zh;q=0.9",
|
|
13398
|
+
priority: "u=1, i"
|
|
13399
|
+
};
|
|
13400
|
+
const publishParams = {
|
|
13401
|
+
read_aid: "2906",
|
|
13402
|
+
aid: "1128",
|
|
13403
|
+
cookie_enabled: "true",
|
|
13404
|
+
screen_width: params.extraParam?.browserInfo.screen_width || "1920",
|
|
13405
|
+
screen_height: params.extraParam?.browserInfo.screen_height || "1080",
|
|
13406
|
+
browser_language: params.extraParam?.browserInfo.browser_language || "zh-CN",
|
|
13407
|
+
browser_platform: params.extraParam?.browserInfo.browser_platform || "Win32",
|
|
13408
|
+
browser_name: params.extraParam?.browserInfo.browser_name || "Mozilla",
|
|
13409
|
+
browser_version: userAgent,
|
|
13410
|
+
browser_online: "true",
|
|
13411
|
+
timezone_name: "Asia/Shanghai",
|
|
13412
|
+
support_h265: "1",
|
|
13413
|
+
msToken: params.cookies.find((e)=>"msToken" === e.name)?.value || "",
|
|
13414
|
+
a_bogus: ""
|
|
13415
|
+
};
|
|
13416
|
+
task.logger.info(`[douyinPublish] publishParams ${JSON.stringify(publishParams)}`);
|
|
13417
|
+
const publishData = {
|
|
13418
|
+
item: {
|
|
13419
|
+
common: {
|
|
13420
|
+
text: params.content,
|
|
13421
|
+
text_extra: params.textExtra,
|
|
13422
|
+
activity: "[]",
|
|
13423
|
+
challenges: params.challengeIds || "[]",
|
|
13424
|
+
hashtag_source: "",
|
|
13425
|
+
mentions: "[]",
|
|
13426
|
+
music_id: params.musicId || "",
|
|
13427
|
+
music_end_time: 1000 * (params.musicDuration || 0),
|
|
13428
|
+
hot_sentence: params.hotSentence || "",
|
|
13429
|
+
visibility_type: Number(params.visibleRange) || 0,
|
|
13430
|
+
download: params.allowSave ? 1 : 0,
|
|
13431
|
+
timing: params.isImmediatelyPublish ? -1 : params.scheduledPublish,
|
|
13432
|
+
media_type: Number(params.publishType) || 2,
|
|
13433
|
+
images: [],
|
|
13434
|
+
creation_id: ""
|
|
13467
13435
|
},
|
|
13468
|
-
|
|
13469
|
-
|
|
13470
|
-
|
|
13471
|
-
params.
|
|
13472
|
-
|
|
13473
|
-
|
|
13474
|
-
|
|
13475
|
-
|
|
13476
|
-
|
|
13477
|
-
|
|
13478
|
-
const uploadedImgList = params.uploadedImgList ? JSON.parse(params.uploadedImgList) : [];
|
|
13479
|
-
if (uploadedImgList.length > 0) publishData.item.common.images = uploadedImgList;
|
|
13480
|
-
else {
|
|
13481
|
-
const tmpCachePath = task.getTmpPath();
|
|
13482
|
-
const uploader = new DouyinImageUploader(proxyHttp, headers, publishParams, tmpCachePath);
|
|
13483
|
-
if (params.coverImage) {
|
|
13484
|
-
const cover = await uploader.uploadCover(params.coverImage);
|
|
13485
|
-
if (cover) {
|
|
13486
|
-
publishData.item.common.images.push({
|
|
13487
|
-
uri: cover.uri,
|
|
13488
|
-
width: cover.width,
|
|
13489
|
-
height: cover.height
|
|
13490
|
-
});
|
|
13491
|
-
publishData.item.cover = {
|
|
13492
|
-
poster: cover.uri
|
|
13493
|
-
};
|
|
13494
|
-
}
|
|
13495
|
-
}
|
|
13496
|
-
if (params.banners && params.banners.length > 0) {
|
|
13497
|
-
const banners = params.banners.filter((i)=>i !== params.coverImage);
|
|
13498
|
-
const uploadResults = await uploader.uploadImages(banners);
|
|
13499
|
-
publishData.item.common.images = publishData.item.common.images.concat(uploadResults.map((result)=>({
|
|
13500
|
-
uri: result.uri,
|
|
13501
|
-
width: result.width,
|
|
13502
|
-
height: result.height
|
|
13503
|
-
})));
|
|
13504
|
-
}
|
|
13505
|
-
}
|
|
13506
|
-
publishData.item.common.creation_id = generateRandomString(8) + Date.now();
|
|
13507
|
-
let decision = null;
|
|
13508
|
-
proxyHttp.addResponseInterceptor((response)=>{
|
|
13509
|
-
task.logger.info(`[douyinPublish] 拦截器收到响应response.headers: ${JSON.stringify(response.headers)} `);
|
|
13510
|
-
task.logger.info(`[douyinPublish] 拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
13511
|
-
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
13512
|
-
if (needsVerification(decision)) {
|
|
13513
|
-
task.logger.info(`[douyinPublish] 检测到需要验证: ${JSON.stringify(decision)}`);
|
|
13514
|
-
return;
|
|
13515
|
-
}
|
|
13516
|
-
if (!response || !response.data) return;
|
|
13517
|
-
const responseData = response.data;
|
|
13518
|
-
if (response && responseData?.status_code && 0 !== responseData.status_code) {
|
|
13519
|
-
const errorCode = 4 === responseData.status_code ? 500 : responseData.status_code;
|
|
13520
|
-
if (4 === responseData.status_code) task.logger.warn(`[douyinPublish] 抖音服务器错误 status_code: 4,映射为 500 触发重试。原始响应: ${JSON.stringify(responseData)}`);
|
|
13521
|
-
return {
|
|
13522
|
-
code: errorCode,
|
|
13523
|
-
message: responseData.status_msg || "文章发布异常,请稍后重试。",
|
|
13524
|
-
data: responseData
|
|
13525
|
-
};
|
|
13526
|
-
}
|
|
13527
|
-
});
|
|
13528
|
-
task._timerRecord.PrePublish = Date.now();
|
|
13529
|
-
if (MockPublish) {
|
|
13530
|
-
const data = "123456789";
|
|
13531
|
-
const message = `图文模拟发布成功 ${http.proxyInfo}`;
|
|
13532
|
-
await updateTaskState?.({
|
|
13533
|
-
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
|
|
13534
|
-
result: {
|
|
13535
|
-
response: data
|
|
13536
|
-
}
|
|
13537
|
-
});
|
|
13538
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, message, data);
|
|
13539
|
-
}
|
|
13540
|
-
let webProtectData;
|
|
13541
|
-
try {
|
|
13542
|
-
webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
|
|
13543
|
-
if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
|
|
13544
|
-
task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
|
|
13545
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
|
|
13546
|
-
}
|
|
13547
|
-
} catch (error) {
|
|
13548
|
-
task.logger.error(`解析 webProtectData 失败: ${error}`);
|
|
13549
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
|
|
13550
|
-
}
|
|
13551
|
-
let ticket = webProtectData.ticket;
|
|
13552
|
-
let ts_sign = webProtectData.ts_sign;
|
|
13553
|
-
const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
|
|
13554
|
-
if (serverDataCookie) try {
|
|
13555
|
-
const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
|
|
13556
|
-
if (decoded.ticket && decoded.ts_sign) {
|
|
13557
|
-
if (decoded.ticket !== ticket) task.logger.info("[douyinPublish] 使用 cookie 中的最新 ticket(web_protect 已过期)");
|
|
13558
|
-
ticket = decoded.ticket;
|
|
13559
|
-
ts_sign = decoded.ts_sign;
|
|
13560
|
-
}
|
|
13561
|
-
} catch (error) {
|
|
13562
|
-
task.logger.info(`[douyinPublish] 解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
|
|
13563
|
-
}
|
|
13564
|
-
let ec_privateKey;
|
|
13565
|
-
try {
|
|
13566
|
-
ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
|
|
13567
|
-
if (!ec_privateKey) {
|
|
13568
|
-
task.logger.error("[douyinPublish] ec_privateKey 为空");
|
|
13569
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
|
|
13570
|
-
}
|
|
13571
|
-
} catch (error) {
|
|
13572
|
-
task.logger.error(`[douyinPublish] 解析 ec_privateKey 失败: ${error}`);
|
|
13573
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
|
|
13574
|
-
}
|
|
13575
|
-
let certificate;
|
|
13576
|
-
try {
|
|
13577
|
-
certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
|
|
13578
|
-
if (!certificate) {
|
|
13579
|
-
task.logger.error("[douyinPublish] certificate 为空");
|
|
13580
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
|
|
13581
|
-
}
|
|
13582
|
-
} catch (error) {
|
|
13583
|
-
task.logger.error(`[douyinPublish] 解析 certificate 失败: ${error}`);
|
|
13584
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
|
|
13585
|
-
}
|
|
13586
|
-
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
13587
|
-
let bdTicketGuardClientData;
|
|
13588
|
-
try {
|
|
13589
|
-
bdTicketGuardClientData = getBdV2({
|
|
13590
|
-
ticket,
|
|
13591
|
-
ts_sign: ts_sign,
|
|
13592
|
-
ec_privateKey: ec_privateKey,
|
|
13593
|
-
certificate: certificate,
|
|
13594
|
-
bd_ticket_guard_ree_public_key: ree_public_key
|
|
13595
|
-
});
|
|
13596
|
-
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
13597
|
-
task.logger.error(`[douyinPublish] bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
13598
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
13599
|
-
}
|
|
13600
|
-
} catch (error) {
|
|
13601
|
-
task.logger.error(`[douyinPublish] 生成 bdTicketGuardClientData 失败: ${error}`);
|
|
13602
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
|
|
13603
|
-
}
|
|
13604
|
-
task.logger.info("[douyinPublish] bdTicketGuardClientData 生成成功");
|
|
13605
|
-
const publishQuery = {
|
|
13606
|
-
...publishParams,
|
|
13607
|
-
a_bogus: ""
|
|
13608
|
-
};
|
|
13609
|
-
const queryString = new URLSearchParams(publishQuery).toString();
|
|
13610
|
-
let aBogus;
|
|
13611
|
-
try {
|
|
13612
|
-
aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
|
|
13613
|
-
if (!aBogus || aBogus.length < 10) {
|
|
13614
|
-
task.logger.error(`[douyinPublish] a_bogus 生成异常,长度过短: ${aBogus}`);
|
|
13615
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
|
|
13616
|
-
}
|
|
13617
|
-
} catch (error) {
|
|
13618
|
-
task.logger.error(`[douyinPublish] 生成 a_bogus 失败: ${error}`);
|
|
13619
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
|
|
13620
|
-
}
|
|
13621
|
-
publishQuery.a_bogus = aBogus;
|
|
13622
|
-
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
13623
|
-
let csrfToken;
|
|
13624
|
-
try {
|
|
13625
|
-
csrfToken = mock_generateCsrfTokenAdvanced({
|
|
13626
|
-
cookies: params.cookies,
|
|
13627
|
-
url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
|
|
13628
|
-
method: "POST",
|
|
13629
|
-
userAgent
|
|
13630
|
-
});
|
|
13631
|
-
if (!csrfToken || csrfToken.length < 10) {
|
|
13632
|
-
task.logger.error(`[douyinPublish] csrfToken 生成异常,长度过短: ${csrfToken}`);
|
|
13633
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
|
|
13436
|
+
cover: {
|
|
13437
|
+
poster: ""
|
|
13438
|
+
},
|
|
13439
|
+
mix: params.mix ? {
|
|
13440
|
+
mix_id: params.mix.mix_id,
|
|
13441
|
+
mix_order: params.mix.mix_order || 0
|
|
13442
|
+
} : {},
|
|
13443
|
+
anchor: {},
|
|
13444
|
+
declare: {
|
|
13445
|
+
user_declare_info: "{}"
|
|
13634
13446
|
}
|
|
13635
|
-
task.logger.info(`[douyinPublish] csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
|
|
13636
|
-
} catch (error) {
|
|
13637
|
-
task.logger.error(`[douyinPublish] 生成 csrfToken 失败: ${error}`);
|
|
13638
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
|
|
13639
|
-
}
|
|
13640
|
-
let sessionDtrait;
|
|
13641
|
-
try {
|
|
13642
|
-
sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
|
|
13643
|
-
task.logger.info(`[douyinPublish] sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
|
|
13644
|
-
} catch (error) {
|
|
13645
|
-
task.logger.error(`[douyinPublish] 生成 sessionDtrait 失败: ${error}`);
|
|
13646
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
|
|
13647
13447
|
}
|
|
13648
|
-
|
|
13649
|
-
|
|
13650
|
-
|
|
13651
|
-
|
|
13652
|
-
|
|
13653
|
-
|
|
13654
|
-
|
|
13655
|
-
|
|
13656
|
-
|
|
13657
|
-
|
|
13658
|
-
|
|
13659
|
-
|
|
13660
|
-
|
|
13661
|
-
|
|
13662
|
-
|
|
13663
|
-
|
|
13664
|
-
|
|
13665
|
-
|
|
13666
|
-
|
|
13667
|
-
|
|
13668
|
-
|
|
13669
|
-
|
|
13670
|
-
|
|
13671
|
-
|
|
13672
|
-
|
|
13673
|
-
|
|
13674
|
-
|
|
13675
|
-
"bd-ticket-guard-ree-public-key": bdTicketGuardClientData["headers_bd_ticket_guard_ree_public_key"],
|
|
13676
|
-
"bd-ticket-guard-version": "2",
|
|
13677
|
-
"bd-ticket-guard-web-sign-type": "1",
|
|
13678
|
-
"bd-ticket-guard-web-version": "2",
|
|
13679
|
-
"x-secsdk-csrf-token": csrfToken,
|
|
13680
|
-
"x-tt-session-dtrait": sessionDtrait || ""
|
|
13681
|
-
}
|
|
13682
|
-
}, {
|
|
13683
|
-
timeout: 60000,
|
|
13684
|
-
retries: 3,
|
|
13685
|
-
retryDelay: 2000
|
|
13686
|
-
});
|
|
13687
|
-
} catch (error) {
|
|
13688
|
-
const handledError = Http.handleApiError(error);
|
|
13689
|
-
const isProxyOrNetworkError = [
|
|
13690
|
-
599,
|
|
13691
|
-
500,
|
|
13692
|
-
502,
|
|
13693
|
-
503,
|
|
13694
|
-
504
|
|
13695
|
-
].includes(handledError.code);
|
|
13696
|
-
if (isProxyOrNetworkError) {
|
|
13697
|
-
const isProxyRequest = handledError.extra?.isProxyRequest === true;
|
|
13698
|
-
const errorType = 599 === handledError.code || isProxyRequest ? "代理错误" : "网络错误";
|
|
13699
|
-
const message = `图文发布失败,${errorType}:${handledError.message}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
13700
|
-
task.logger.error(`[douyinPublish] ${errorType},直接返回: ${message}`, stringifyError(handledError));
|
|
13701
|
-
await updateTaskState?.({
|
|
13702
|
-
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
13703
|
-
error: message
|
|
13448
|
+
};
|
|
13449
|
+
const args = [
|
|
13450
|
+
{
|
|
13451
|
+
headers
|
|
13452
|
+
},
|
|
13453
|
+
task.logger,
|
|
13454
|
+
"",
|
|
13455
|
+
"",
|
|
13456
|
+
params.accountId,
|
|
13457
|
+
"douyin"
|
|
13458
|
+
];
|
|
13459
|
+
const http = new Http({
|
|
13460
|
+
headers
|
|
13461
|
+
});
|
|
13462
|
+
const proxyHttp = new Http(...args);
|
|
13463
|
+
const uploadedImgList = params.uploadedImgList ? JSON.parse(params.uploadedImgList) : [];
|
|
13464
|
+
if (uploadedImgList.length > 0) publishData.item.common.images = uploadedImgList;
|
|
13465
|
+
else {
|
|
13466
|
+
const tmpCachePath = task.getTmpPath();
|
|
13467
|
+
const uploader = new DouyinImageUploader(proxyHttp, headers, publishParams, tmpCachePath);
|
|
13468
|
+
if (params.coverImage) {
|
|
13469
|
+
const cover = await uploader.uploadCover(params.coverImage);
|
|
13470
|
+
if (cover) {
|
|
13471
|
+
publishData.item.common.images.push({
|
|
13472
|
+
uri: cover.uri,
|
|
13473
|
+
width: cover.width,
|
|
13474
|
+
height: cover.height
|
|
13704
13475
|
});
|
|
13705
|
-
|
|
13706
|
-
|
|
13707
|
-
data: "",
|
|
13708
|
-
message
|
|
13476
|
+
publishData.item.cover = {
|
|
13477
|
+
poster: cover.uri
|
|
13709
13478
|
};
|
|
13710
13479
|
}
|
|
13711
|
-
throw error;
|
|
13712
13480
|
}
|
|
13713
|
-
|
|
13481
|
+
if (params.banners && params.banners.length > 0) {
|
|
13482
|
+
const banners = params.banners.filter((i)=>i !== params.coverImage);
|
|
13483
|
+
const uploadResults = await uploader.uploadImages(banners);
|
|
13484
|
+
publishData.item.common.images = publishData.item.common.images.concat(uploadResults.map((result)=>({
|
|
13485
|
+
uri: result.uri,
|
|
13486
|
+
width: result.width,
|
|
13487
|
+
height: result.height
|
|
13488
|
+
})));
|
|
13489
|
+
}
|
|
13490
|
+
}
|
|
13491
|
+
publishData.item.common.creation_id = generateRandomString(8) + Date.now();
|
|
13492
|
+
let decision = null;
|
|
13493
|
+
proxyHttp.addResponseInterceptor((response)=>{
|
|
13494
|
+
task.logger.info(`[douyinPublish] 拦截器收到响应response.headers: ${JSON.stringify(response.headers)} `);
|
|
13495
|
+
task.logger.info(`[douyinPublish] 拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
13496
|
+
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
13714
13497
|
if (needsVerification(decision)) {
|
|
13715
|
-
|
|
13716
|
-
|
|
13717
|
-
decision?.verify_title,
|
|
13718
|
-
decision?.verify_desc
|
|
13719
|
-
].filter(Boolean).join(" ");
|
|
13720
|
-
const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
13721
|
-
const safeDecision = safeSerialize(decision) ?? {};
|
|
13722
|
-
const mockData = {
|
|
13723
|
-
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
13724
|
-
error: message,
|
|
13725
|
-
result: {
|
|
13726
|
-
...safeDecision,
|
|
13727
|
-
data: decision,
|
|
13728
|
-
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
13729
|
-
}
|
|
13730
|
-
};
|
|
13731
|
-
await updateTaskState?.(mockData);
|
|
13732
|
-
return {
|
|
13733
|
-
code: 0,
|
|
13734
|
-
data: mockData,
|
|
13735
|
-
message: "操作成功"
|
|
13736
|
-
};
|
|
13498
|
+
task.logger.info(`[douyinPublish] 检测到需要验证: ${JSON.stringify(decision)}`);
|
|
13499
|
+
return;
|
|
13737
13500
|
}
|
|
13738
|
-
|
|
13739
|
-
|
|
13740
|
-
|
|
13741
|
-
|
|
13742
|
-
|
|
13743
|
-
proxyIp: params.localIP,
|
|
13744
|
-
accountId: params.accountId,
|
|
13745
|
-
uid: params.uid,
|
|
13746
|
-
platform: "douyin",
|
|
13747
|
-
publishParams: publishData
|
|
13748
|
-
});
|
|
13749
|
-
task.logger.info(`[douyinPublish] 发布结果 ${JSON.stringify(publishResult)}`);
|
|
13750
|
-
const isSuccess = 0 === publishResult.status_code;
|
|
13751
|
-
const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
13752
|
-
const data = isSuccess ? publishResult.item_id || "" : "";
|
|
13753
|
-
if (!isSuccess) {
|
|
13754
|
-
const safeDecision = safeSerialize(decision) ?? {};
|
|
13755
|
-
await updateTaskState?.({
|
|
13756
|
-
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
13757
|
-
error: message,
|
|
13758
|
-
result: {
|
|
13759
|
-
...safeDecision,
|
|
13760
|
-
data: safeDecision,
|
|
13761
|
-
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
13762
|
-
}
|
|
13763
|
-
});
|
|
13501
|
+
if (!response || !response.data) return;
|
|
13502
|
+
const responseData = response.data;
|
|
13503
|
+
if (response && responseData?.status_code && 0 !== responseData.status_code) {
|
|
13504
|
+
const errorCode = 4 === responseData.status_code ? 500 : responseData.status_code;
|
|
13505
|
+
if (4 === responseData.status_code) task.logger.warn(`[douyinPublish] 抖音服务器错误 status_code: 4,映射为 500 触发重试。原始响应: ${JSON.stringify(responseData)}`);
|
|
13764
13506
|
return {
|
|
13765
|
-
code:
|
|
13766
|
-
|
|
13767
|
-
|
|
13507
|
+
code: errorCode,
|
|
13508
|
+
message: responseData.status_msg || "文章发布异常,请稍后重试。",
|
|
13509
|
+
data: responseData
|
|
13768
13510
|
};
|
|
13769
13511
|
}
|
|
13512
|
+
});
|
|
13513
|
+
task._timerRecord.PrePublish = Date.now();
|
|
13514
|
+
if (MockPublish) {
|
|
13515
|
+
const data = "123456789";
|
|
13516
|
+
const message = `图文模拟发布成功 ${http.proxyInfo}`;
|
|
13770
13517
|
await updateTaskState?.({
|
|
13771
13518
|
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
|
|
13772
13519
|
result: {
|
|
13773
13520
|
response: data
|
|
13774
13521
|
}
|
|
13775
13522
|
});
|
|
13776
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(
|
|
13523
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, message, data);
|
|
13524
|
+
}
|
|
13525
|
+
let webProtectData;
|
|
13526
|
+
try {
|
|
13527
|
+
webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
|
|
13528
|
+
if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
|
|
13529
|
+
task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
|
|
13530
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
|
|
13531
|
+
}
|
|
13777
13532
|
} catch (error) {
|
|
13778
|
-
|
|
13779
|
-
|
|
13780
|
-
|
|
13781
|
-
|
|
13782
|
-
|
|
13783
|
-
|
|
13784
|
-
|
|
13533
|
+
task.logger.error(`解析 webProtectData 失败: ${error}`);
|
|
13534
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
|
|
13535
|
+
}
|
|
13536
|
+
let ticket = webProtectData.ticket;
|
|
13537
|
+
let ts_sign = webProtectData.ts_sign;
|
|
13538
|
+
const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
|
|
13539
|
+
if (serverDataCookie) try {
|
|
13540
|
+
const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
|
|
13541
|
+
if (decoded.ticket && decoded.ts_sign) {
|
|
13542
|
+
if (decoded.ticket !== ticket) task.logger.info("[douyinPublish] 使用 cookie 中的最新 ticket(web_protect 已过期)");
|
|
13543
|
+
ticket = decoded.ticket;
|
|
13544
|
+
ts_sign = decoded.ts_sign;
|
|
13545
|
+
}
|
|
13546
|
+
} catch (error) {
|
|
13547
|
+
task.logger.info(`[douyinPublish] 解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
|
|
13548
|
+
}
|
|
13549
|
+
let ec_privateKey;
|
|
13550
|
+
try {
|
|
13551
|
+
ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
|
|
13552
|
+
if (!ec_privateKey) {
|
|
13553
|
+
task.logger.error("[douyinPublish] ec_privateKey 为空");
|
|
13554
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
|
|
13555
|
+
}
|
|
13556
|
+
} catch (error) {
|
|
13557
|
+
task.logger.error(`[douyinPublish] 解析 ec_privateKey 失败: ${error}`);
|
|
13558
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
|
|
13559
|
+
}
|
|
13560
|
+
let certificate;
|
|
13561
|
+
try {
|
|
13562
|
+
certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
|
|
13563
|
+
if (!certificate) {
|
|
13564
|
+
task.logger.error("[douyinPublish] certificate 为空");
|
|
13565
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
|
|
13566
|
+
}
|
|
13567
|
+
} catch (error) {
|
|
13568
|
+
task.logger.error(`[douyinPublish] 解析 certificate 失败: ${error}`);
|
|
13569
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
|
|
13570
|
+
}
|
|
13571
|
+
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
13572
|
+
let bdTicketGuardClientData;
|
|
13573
|
+
try {
|
|
13574
|
+
bdTicketGuardClientData = getBdV2({
|
|
13575
|
+
ticket,
|
|
13576
|
+
ts_sign: ts_sign,
|
|
13577
|
+
ec_privateKey: ec_privateKey,
|
|
13578
|
+
certificate: certificate,
|
|
13579
|
+
bd_ticket_guard_ree_public_key: ree_public_key
|
|
13785
13580
|
});
|
|
13786
|
-
|
|
13581
|
+
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
13582
|
+
task.logger.error(`[douyinPublish] bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
13583
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
13584
|
+
}
|
|
13585
|
+
} catch (error) {
|
|
13586
|
+
task.logger.error(`[douyinPublish] 生成 bdTicketGuardClientData 失败: ${error}`);
|
|
13587
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
|
|
13787
13588
|
}
|
|
13788
|
-
|
|
13789
|
-
const
|
|
13790
|
-
|
|
13791
|
-
|
|
13792
|
-
secure: true,
|
|
13793
|
-
domain: "douyin.com",
|
|
13794
|
-
url: "https://creator.douyin.com",
|
|
13795
|
-
httpOnly: true
|
|
13589
|
+
task.logger.info("[douyinPublish] bdTicketGuardClientData 生成成功");
|
|
13590
|
+
const publishQuery = {
|
|
13591
|
+
...publishParams,
|
|
13592
|
+
a_bogus: ""
|
|
13796
13593
|
};
|
|
13797
|
-
const
|
|
13798
|
-
|
|
13799
|
-
|
|
13800
|
-
|
|
13801
|
-
|
|
13802
|
-
|
|
13803
|
-
|
|
13804
|
-
|
|
13805
|
-
|
|
13806
|
-
|
|
13807
|
-
|
|
13808
|
-
|
|
13809
|
-
|
|
13810
|
-
|
|
13811
|
-
|
|
13812
|
-
|
|
13813
|
-
|
|
13814
|
-
|
|
13815
|
-
|
|
13594
|
+
const queryString = new URLSearchParams(publishQuery).toString();
|
|
13595
|
+
let aBogus;
|
|
13596
|
+
try {
|
|
13597
|
+
aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
|
|
13598
|
+
if (!aBogus || aBogus.length < 10) {
|
|
13599
|
+
task.logger.error(`[douyinPublish] a_bogus 生成异常,长度过短: ${aBogus}`);
|
|
13600
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
|
|
13601
|
+
}
|
|
13602
|
+
} catch (error) {
|
|
13603
|
+
task.logger.error(`[douyinPublish] 生成 a_bogus 失败: ${error}`);
|
|
13604
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
|
|
13605
|
+
}
|
|
13606
|
+
publishQuery.a_bogus = aBogus;
|
|
13607
|
+
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
13608
|
+
let csrfToken;
|
|
13609
|
+
try {
|
|
13610
|
+
csrfToken = mock_generateCsrfTokenAdvanced({
|
|
13611
|
+
cookies: params.cookies,
|
|
13612
|
+
url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
|
|
13613
|
+
method: "POST",
|
|
13614
|
+
userAgent
|
|
13615
|
+
});
|
|
13616
|
+
if (!csrfToken || csrfToken.length < 10) {
|
|
13617
|
+
task.logger.error(`[douyinPublish] csrfToken 生成异常,长度过短: ${csrfToken}`);
|
|
13618
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
|
|
13619
|
+
}
|
|
13620
|
+
task.logger.info(`[douyinPublish] csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
|
|
13621
|
+
} catch (error) {
|
|
13622
|
+
task.logger.error(`[douyinPublish] 生成 csrfToken 失败: ${error}`);
|
|
13623
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
|
|
13624
|
+
}
|
|
13625
|
+
let sessionDtrait;
|
|
13626
|
+
try {
|
|
13627
|
+
sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
|
|
13628
|
+
task.logger.info(`[douyinPublish] sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
|
|
13629
|
+
} catch (error) {
|
|
13630
|
+
task.logger.error(`[douyinPublish] 生成 sessionDtrait 失败: ${error}`);
|
|
13631
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
|
|
13632
|
+
}
|
|
13633
|
+
task.logger.info(`[douyinPublish] headers: ${JSON.stringify({
|
|
13634
|
+
...headers,
|
|
13635
|
+
Referer: "https://creator.douyin.com/creator-micro/content/post/image?default-tab=3&enter_from=publish_page&media_type=image&type=new",
|
|
13636
|
+
"Content-Type": "application/json",
|
|
13637
|
+
Accept: "application/json, text/plain, */*",
|
|
13638
|
+
"bd-ticket-guard-client-data": bdTicketGuardClientData["headers_bd_ticket_guard_client_data"],
|
|
13639
|
+
"bd-ticket-guard-ree-public-key": bdTicketGuardClientData["headers_bd_ticket_guard_ree_public_key"],
|
|
13640
|
+
"bd-ticket-guard-version": "2",
|
|
13641
|
+
"bd-ticket-guard-web-sign-type": "1",
|
|
13642
|
+
"bd-ticket-guard-web-version": "2",
|
|
13643
|
+
"x-secsdk-csrf-token": csrfToken,
|
|
13644
|
+
"x-tt-session-dtrait": sessionDtrait || ""
|
|
13645
|
+
})}`);
|
|
13646
|
+
task.logger.info(`[douyinPublish] url: https://creator.douyin.com/web/api/media/aweme/create_v2/?${publishQueryParams}`);
|
|
13647
|
+
let publishResult;
|
|
13648
|
+
try {
|
|
13649
|
+
publishResult = await proxyHttp.api({
|
|
13650
|
+
method: "post",
|
|
13651
|
+
url: `https://creator.douyin.com/web/api/media/aweme/create_v2/?${publishQueryParams}`,
|
|
13652
|
+
data: publishData,
|
|
13653
|
+
defaultErrorMsg: "发布异常,请稍后重试。",
|
|
13654
|
+
headers: {
|
|
13655
|
+
...headers,
|
|
13656
|
+
Referer: "https://creator.douyin.com/creator-micro/content/post/image?default-tab=3&enter_from=publish_page&media_type=image&type=new",
|
|
13657
|
+
"Content-Type": "application/json",
|
|
13658
|
+
Accept: "application/json, text/plain, */*",
|
|
13659
|
+
"bd-ticket-guard-client-data": bdTicketGuardClientData["headers_bd_ticket_guard_client_data"],
|
|
13660
|
+
"bd-ticket-guard-ree-public-key": bdTicketGuardClientData["headers_bd_ticket_guard_ree_public_key"],
|
|
13661
|
+
"bd-ticket-guard-version": "2",
|
|
13662
|
+
"bd-ticket-guard-web-sign-type": "1",
|
|
13663
|
+
"bd-ticket-guard-web-version": "2",
|
|
13664
|
+
"x-secsdk-csrf-token": csrfToken,
|
|
13665
|
+
"x-tt-session-dtrait": sessionDtrait || ""
|
|
13666
|
+
}
|
|
13667
|
+
}, {
|
|
13668
|
+
timeout: 60000,
|
|
13669
|
+
retries: 3,
|
|
13670
|
+
retryDelay: 2000
|
|
13671
|
+
});
|
|
13672
|
+
} catch (error) {
|
|
13673
|
+
const handledError = Http.handleApiError(error);
|
|
13674
|
+
const isProxyOrNetworkError = [
|
|
13675
|
+
599,
|
|
13676
|
+
500,
|
|
13677
|
+
502,
|
|
13678
|
+
503,
|
|
13679
|
+
504
|
|
13680
|
+
].includes(handledError.code);
|
|
13681
|
+
if (isProxyOrNetworkError) {
|
|
13682
|
+
const isProxyRequest = handledError.extra?.isProxyRequest === true;
|
|
13683
|
+
const errorType = 599 === handledError.code || isProxyRequest ? "代理错误" : "网络错误";
|
|
13684
|
+
const message = `图文发布失败,${errorType}:${handledError.message}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
13685
|
+
task.logger.error(`[douyinPublish] ${errorType},直接返回: ${message}`, stringifyError(handledError));
|
|
13686
|
+
await updateTaskState?.({
|
|
13687
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
13688
|
+
error: message
|
|
13689
|
+
});
|
|
13690
|
+
return {
|
|
13691
|
+
code: 414,
|
|
13692
|
+
data: "",
|
|
13693
|
+
message
|
|
13694
|
+
};
|
|
13695
|
+
}
|
|
13696
|
+
throw error;
|
|
13697
|
+
}
|
|
13698
|
+
task.logger.info(`[douyinPublish] decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
|
|
13699
|
+
if (needsVerification(decision)) {
|
|
13700
|
+
const details = [
|
|
13701
|
+
publishResult.status_msg,
|
|
13702
|
+
decision?.verify_title,
|
|
13703
|
+
decision?.verify_desc
|
|
13704
|
+
].filter(Boolean).join(" ");
|
|
13705
|
+
const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
13706
|
+
let decisionObj = {};
|
|
13707
|
+
if (decision) decisionObj = decision;
|
|
13708
|
+
const mockData = {
|
|
13709
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
13710
|
+
error: message,
|
|
13711
|
+
result: {
|
|
13712
|
+
...decisionObj,
|
|
13713
|
+
data: decision,
|
|
13714
|
+
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
13715
|
+
}
|
|
13716
|
+
};
|
|
13717
|
+
await updateTaskState?.(mockData);
|
|
13718
|
+
return {
|
|
13719
|
+
code: 0,
|
|
13720
|
+
data: mockData,
|
|
13721
|
+
message: "操作成功"
|
|
13722
|
+
};
|
|
13723
|
+
}
|
|
13724
|
+
reportLogger({
|
|
13725
|
+
token: params.huiwenToken || "",
|
|
13726
|
+
enverionment: task.enverionment || "development",
|
|
13727
|
+
postId: params.articleId,
|
|
13728
|
+
eip: proxyHttp.proxyInfo,
|
|
13729
|
+
proxyIp: params.localIP,
|
|
13730
|
+
accountId: params.accountId,
|
|
13731
|
+
uid: params.uid,
|
|
13732
|
+
platform: "douyin",
|
|
13733
|
+
publishParams: publishData
|
|
13734
|
+
});
|
|
13735
|
+
task.logger.info(`[douyinPublish] 发布结果 ${JSON.stringify(publishResult)}`);
|
|
13736
|
+
const isSuccess = 0 === publishResult.status_code;
|
|
13737
|
+
const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
13738
|
+
const data = isSuccess ? publishResult.item_id || "" : "";
|
|
13739
|
+
if (!isSuccess) {
|
|
13740
|
+
let decisionObj = {};
|
|
13741
|
+
if (decision) decisionObj = decision;
|
|
13742
|
+
await updateTaskState?.({
|
|
13743
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
13744
|
+
error: message,
|
|
13745
|
+
result: {
|
|
13746
|
+
...decisionObj,
|
|
13747
|
+
data: decision,
|
|
13748
|
+
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
13749
|
+
}
|
|
13750
|
+
});
|
|
13751
|
+
return {
|
|
13752
|
+
code: 414,
|
|
13753
|
+
data,
|
|
13754
|
+
message
|
|
13755
|
+
};
|
|
13756
|
+
}
|
|
13757
|
+
await updateTaskState?.({
|
|
13758
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
|
|
13759
|
+
result: {
|
|
13760
|
+
response: data
|
|
13761
|
+
}
|
|
13762
|
+
});
|
|
13763
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(isSuccess ? 0 : 414, message, data);
|
|
13764
|
+
};
|
|
13765
|
+
const douyinPublish_rpa_rpaAction = async (task, params)=>{
|
|
13766
|
+
const commonCookies = {
|
|
13767
|
+
path: "/",
|
|
13768
|
+
secure: true,
|
|
13769
|
+
domain: "douyin.com",
|
|
13770
|
+
url: "https://creator.douyin.com",
|
|
13771
|
+
httpOnly: true
|
|
13772
|
+
};
|
|
13773
|
+
const page = await task.createPage({
|
|
13774
|
+
show: task.debug,
|
|
13775
|
+
url: params.url || "https://creator.douyin.com/creator-micro/content/upload?default-tab=3",
|
|
13776
|
+
cookies: params.cookies?.map((it)=>({
|
|
13777
|
+
...it,
|
|
13778
|
+
...commonCookies
|
|
13779
|
+
}))
|
|
13780
|
+
});
|
|
13781
|
+
const tmpCachePath = task.getTmpPath();
|
|
13782
|
+
const waitForElement = async (selector, timeout = 10000)=>{
|
|
13783
|
+
try {
|
|
13784
|
+
const element = page.locator(selector);
|
|
13785
|
+
task.logger.warn(`element: ${element}`);
|
|
13786
|
+
await element.waitFor({
|
|
13787
|
+
state: "visible",
|
|
13788
|
+
timeout
|
|
13789
|
+
});
|
|
13790
|
+
return element;
|
|
13791
|
+
} catch {
|
|
13816
13792
|
task.logger.warn(`元素未找到: ${selector}`);
|
|
13817
13793
|
return null;
|
|
13818
13794
|
}
|
|
@@ -15310,241 +15286,6 @@ async function getBaijiahaoData(_task, params) {
|
|
|
15310
15286
|
};
|
|
15311
15287
|
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(bjhData, "百家号平台数据获取成功!");
|
|
15312
15288
|
}
|
|
15313
|
-
async function getDouyinData(_task, params) {
|
|
15314
|
-
try {
|
|
15315
|
-
const sessionidCookie = params.cookies.find((it)=>"sessionid" === it.name)?.value;
|
|
15316
|
-
if (!sessionidCookie) return types_errorResponse("抖音账号数据异常,请重新绑定账号后重试。", 414);
|
|
15317
|
-
const csrfToken = params.cookies.find((it)=>"passport_csrf_token" === it.name)?.value || "";
|
|
15318
|
-
const headers = {
|
|
15319
|
-
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
15320
|
-
referer: "https://creator.douyin.com/creator-micro/home",
|
|
15321
|
-
origin: "https://creator.douyin.com",
|
|
15322
|
-
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
|
|
15323
|
-
...csrfToken ? {
|
|
15324
|
-
"x-secsdk-csrf-token": csrfToken
|
|
15325
|
-
} : {}
|
|
15326
|
-
};
|
|
15327
|
-
const args = [
|
|
15328
|
-
{
|
|
15329
|
-
headers
|
|
15330
|
-
},
|
|
15331
|
-
_task.logger,
|
|
15332
|
-
params.proxyLoc,
|
|
15333
|
-
params.localIP,
|
|
15334
|
-
params.accountId
|
|
15335
|
-
];
|
|
15336
|
-
const http = new Http(...args);
|
|
15337
|
-
const toNum = (val)=>{
|
|
15338
|
-
if (null == val) return 0;
|
|
15339
|
-
const n = Number.parseInt(String(val).replace(/[+,]/g, ""), 10);
|
|
15340
|
-
return Number.isNaN(n) ? 0 : n;
|
|
15341
|
-
};
|
|
15342
|
-
const userProfileP = http.api({
|
|
15343
|
-
method: "get",
|
|
15344
|
-
url: "https://www.douyin.com/aweme/v1/web/user/profile/self/",
|
|
15345
|
-
params: {
|
|
15346
|
-
device_platform: "webapp",
|
|
15347
|
-
aid: "6383",
|
|
15348
|
-
channel: "channel_pc_web",
|
|
15349
|
-
pc_client_type: "1",
|
|
15350
|
-
version_code: "170400",
|
|
15351
|
-
version_name: "17.4.0",
|
|
15352
|
-
cookie_enabled: "true",
|
|
15353
|
-
platform: "PC"
|
|
15354
|
-
}
|
|
15355
|
-
}, {
|
|
15356
|
-
retries: 3,
|
|
15357
|
-
retryDelay: 100,
|
|
15358
|
-
timeout: 10000
|
|
15359
|
-
}).catch((e)=>{
|
|
15360
|
-
_task.logger.warn(`抖音用户信息获取失败: ${e instanceof Error ? e.message : String(e)}`);
|
|
15361
|
-
return null;
|
|
15362
|
-
});
|
|
15363
|
-
const overviewP = http.api({
|
|
15364
|
-
method: "get",
|
|
15365
|
-
url: "https://creator.douyin.com/aweme/janus/creator/data/overview/all/",
|
|
15366
|
-
params: {
|
|
15367
|
-
last_days_type: 1,
|
|
15368
|
-
aid: 2906,
|
|
15369
|
-
app_name: "aweme_creator_platform",
|
|
15370
|
-
device_platform: "web"
|
|
15371
|
-
}
|
|
15372
|
-
}, {
|
|
15373
|
-
retries: 3,
|
|
15374
|
-
retryDelay: 100,
|
|
15375
|
-
timeout: 5000
|
|
15376
|
-
}).catch((e)=>{
|
|
15377
|
-
_task.logger.warn(`抖音近7日数据获取失败(可能未开通数据中心或被风控): ${e instanceof Error ? e.message : String(e)}`);
|
|
15378
|
-
return null;
|
|
15379
|
-
});
|
|
15380
|
-
const [userProfile, overview] = await Promise.all([
|
|
15381
|
-
userProfileP,
|
|
15382
|
-
overviewP
|
|
15383
|
-
]);
|
|
15384
|
-
let fansNum = 0;
|
|
15385
|
-
let favedNum = 0;
|
|
15386
|
-
let followingNum = 0;
|
|
15387
|
-
if (userProfile?.status_code === 0 && userProfile.user) {
|
|
15388
|
-
const user = userProfile.user;
|
|
15389
|
-
fansNum = toNum(user.follower_count);
|
|
15390
|
-
followingNum = toNum(user.following_count);
|
|
15391
|
-
favedNum = toNum(user.total_favorited);
|
|
15392
|
-
} else _task.logger.warn(`用户信息接口返回异常: status_code=${userProfile?.status_code}, msg=${userProfile?.status_msg}`);
|
|
15393
|
-
const ov = overview?.data;
|
|
15394
|
-
const douyinData = {
|
|
15395
|
-
fansNum,
|
|
15396
|
-
favedNum,
|
|
15397
|
-
fansNumLastWeek: toNum(ov?.new_fans?.last_period_incr),
|
|
15398
|
-
watchNumLastWeek: toNum(ov?.play?.last_period_incr),
|
|
15399
|
-
likeNumLastWeek: toNum(ov?.digg?.last_period_incr),
|
|
15400
|
-
commentNumLastWeek: toNum(ov?.comment?.last_period_incr),
|
|
15401
|
-
shareNumLastWeek: toNum(ov?.share?.last_period_incr),
|
|
15402
|
-
visitNumLastWeek: toNum(ov?.profile?.last_period_incr)
|
|
15403
|
-
};
|
|
15404
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(douyinData, "抖音平台数据获取成功!");
|
|
15405
|
-
} catch (error) {
|
|
15406
|
-
if (error && "object" == typeof error && "code" in error && "message" in error) {
|
|
15407
|
-
const err = error;
|
|
15408
|
-
_task.logger.error(`抖音账号数据获取失败: ${err.message} (${err.code})`);
|
|
15409
|
-
return types_errorResponse(err.message, err.code);
|
|
15410
|
-
}
|
|
15411
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
15412
|
-
_task.logger.error(`抖音账号数据获取失败: ${errMsg}`);
|
|
15413
|
-
return types_errorResponse(errMsg || "抖音账号数据获取失败");
|
|
15414
|
-
}
|
|
15415
|
-
}
|
|
15416
|
-
async function getShipinhaoData(_task, params) {
|
|
15417
|
-
try {
|
|
15418
|
-
const sessionidCookie = params.cookies.find((it)=>"sessionid" === it.name)?.value;
|
|
15419
|
-
if (!sessionidCookie) return types_errorResponse("视频号账号数据异常,请重新绑定账号后重试。", 414);
|
|
15420
|
-
const uinCookie = params.cookies.find((it)=>"uin" === it.name || "wxuin" === it.name)?.value || "0000000000";
|
|
15421
|
-
const deviceIdCookie = params.cookies.find((it)=>"device_id" === it.name || "finger_print_device_id" === it.name)?.value;
|
|
15422
|
-
const aid = params.cookies.find((it)=>"_aid" === it.name)?.value || "9d3e0e9f-b842-498d-a273-4285d58df264";
|
|
15423
|
-
const finderId = params.cookies.find((it)=>"_log_finder_id" === it.name || "finder_id" === it.name)?.value || "";
|
|
15424
|
-
const headers = {
|
|
15425
|
-
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
15426
|
-
referer: "https://channels.weixin.qq.com/platform",
|
|
15427
|
-
origin: "https://channels.weixin.qq.com",
|
|
15428
|
-
"content-type": "application/json",
|
|
15429
|
-
"X-WECHAT-UIN": uinCookie,
|
|
15430
|
-
...deviceIdCookie ? {
|
|
15431
|
-
"finger-print-device-id": deviceIdCookie
|
|
15432
|
-
} : {}
|
|
15433
|
-
};
|
|
15434
|
-
const args = [
|
|
15435
|
-
{
|
|
15436
|
-
headers
|
|
15437
|
-
},
|
|
15438
|
-
_task.logger,
|
|
15439
|
-
params.proxyLoc,
|
|
15440
|
-
params.localIP,
|
|
15441
|
-
params.accountId
|
|
15442
|
-
];
|
|
15443
|
-
const http = new Http(...args);
|
|
15444
|
-
const authData = await http.api({
|
|
15445
|
-
method: "post",
|
|
15446
|
-
url: "https://channels.weixin.qq.com/cgi-bin/mmfinderassistant-bin/auth/auth_data",
|
|
15447
|
-
params: {
|
|
15448
|
-
_aid: aid,
|
|
15449
|
-
_rid: `${Date.now().toString(16)}-${Math.random().toString(36).substring(2, 9)}`,
|
|
15450
|
-
_pageUrl: encodeURIComponent("https://channels.weixin.qq.com/platform")
|
|
15451
|
-
},
|
|
15452
|
-
data: {
|
|
15453
|
-
timestamp: Date.now().toString(),
|
|
15454
|
-
_log_finder_uin: "",
|
|
15455
|
-
_log_finder_id: finderId,
|
|
15456
|
-
rawKeyBuff: "",
|
|
15457
|
-
pluginSessionId: null,
|
|
15458
|
-
scene: 7,
|
|
15459
|
-
reqScene: 7
|
|
15460
|
-
}
|
|
15461
|
-
}, {
|
|
15462
|
-
retries: 3,
|
|
15463
|
-
retryDelay: 100,
|
|
15464
|
-
timeout: 5000
|
|
15465
|
-
});
|
|
15466
|
-
const AUTH_ERROR_CODES = [
|
|
15467
|
-
300333,
|
|
15468
|
-
300334,
|
|
15469
|
-
300330,
|
|
15470
|
-
300331,
|
|
15471
|
-
300332
|
|
15472
|
-
];
|
|
15473
|
-
if (authData.errCode && AUTH_ERROR_CODES.includes(authData.errCode)) {
|
|
15474
|
-
_task.logger.warn(`视频号登录已失效:${authData.errMsg} (${authData.errCode})`);
|
|
15475
|
-
return types_errorResponse("视频号账号信息获取失败,请检查账号状态", 414);
|
|
15476
|
-
}
|
|
15477
|
-
if (authData.errCode) {
|
|
15478
|
-
_task.logger.warn(`视频号账号API错误:${authData.errMsg} (${authData.errCode})`);
|
|
15479
|
-
return types_errorResponse(`视频号账号信息获取失败:${authData.errMsg || "未知错误"}`, 414);
|
|
15480
|
-
}
|
|
15481
|
-
const finderUser = authData.data?.finderUser;
|
|
15482
|
-
const now = new Date();
|
|
15483
|
-
const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 2);
|
|
15484
|
-
const startTs = Math.floor(yesterday.getTime() / 1000);
|
|
15485
|
-
const endTs = startTs + 86400;
|
|
15486
|
-
_task.logger.info(`视频号昨日数据范围 start: ${startTs} ~ end: ${endTs}`);
|
|
15487
|
-
let fansNumYesterday = 0;
|
|
15488
|
-
let playNumYesterday = 0;
|
|
15489
|
-
let likeNumYesterday = 0;
|
|
15490
|
-
let commentNumYesterday = 0;
|
|
15491
|
-
try {
|
|
15492
|
-
const statsData = await http.api({
|
|
15493
|
-
method: "post",
|
|
15494
|
-
url: "https://channels.weixin.qq.com/cgi-bin/mmfinderassistant-bin/statistic/new_post_total_data",
|
|
15495
|
-
params: {
|
|
15496
|
-
_aid: aid,
|
|
15497
|
-
_rid: `${Date.now().toString(16)}-${Math.random().toString(36).substring(2, 9)}`,
|
|
15498
|
-
_pageUrl: encodeURIComponent("https://channels.weixin.qq.com/platform")
|
|
15499
|
-
},
|
|
15500
|
-
data: {
|
|
15501
|
-
startTs: startTs.toString(),
|
|
15502
|
-
endTs: endTs.toString(),
|
|
15503
|
-
interval: 3,
|
|
15504
|
-
timestamp: Date.now().toString(),
|
|
15505
|
-
_log_finder_uin: "",
|
|
15506
|
-
_log_finder_id: finderId,
|
|
15507
|
-
rawKeyBuff: "",
|
|
15508
|
-
pluginSessionId: null,
|
|
15509
|
-
scene: 7,
|
|
15510
|
-
reqScene: 7
|
|
15511
|
-
}
|
|
15512
|
-
}, {
|
|
15513
|
-
retries: 3,
|
|
15514
|
-
retryDelay: 100,
|
|
15515
|
-
timeout: 5000
|
|
15516
|
-
});
|
|
15517
|
-
if (!statsData.errCode && statsData.data?.totalData) {
|
|
15518
|
-
const data = statsData.data.totalData;
|
|
15519
|
-
fansNumYesterday = Number.parseInt(data.follow?.[1] || "0", 10) || 0;
|
|
15520
|
-
playNumYesterday = Number.parseInt(data.browse?.[1] || "0", 10) || 0;
|
|
15521
|
-
likeNumYesterday = Number.parseInt(data.like?.[1] || "0", 10) || 0;
|
|
15522
|
-
commentNumYesterday = Number.parseInt(data.comment?.[1] || "0", 10) || 0;
|
|
15523
|
-
}
|
|
15524
|
-
} catch (error) {
|
|
15525
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
15526
|
-
_task.logger.warn(`视频号昨日数据获取失败(降级为null): ${errMsg}`);
|
|
15527
|
-
}
|
|
15528
|
-
const shipinhaoData = {
|
|
15529
|
-
fansNum: finderUser?.fansCount || 0,
|
|
15530
|
-
feedsCount: finderUser?.feedsCount || 0,
|
|
15531
|
-
fansNumYesterday,
|
|
15532
|
-
playNumYesterday,
|
|
15533
|
-
likeNumYesterday,
|
|
15534
|
-
commentNumYesterday
|
|
15535
|
-
};
|
|
15536
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(shipinhaoData, "视频号平台数据获取成功!");
|
|
15537
|
-
} catch (error) {
|
|
15538
|
-
if (error && "object" == typeof error && "code" in error && "message" in error) {
|
|
15539
|
-
const err = error;
|
|
15540
|
-
_task.logger.error(`视频号账号数据获取失败: ${err.message} (${err.code})`);
|
|
15541
|
-
return types_errorResponse(err.message, err.code);
|
|
15542
|
-
}
|
|
15543
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
15544
|
-
_task.logger.error(`视频号账号数据获取失败: ${errMsg}`);
|
|
15545
|
-
return types_errorResponse(errMsg || "视频号账号数据获取失败");
|
|
15546
|
-
}
|
|
15547
|
-
}
|
|
15548
15289
|
async function getToutiaoData(_task, params) {
|
|
15549
15290
|
const http = new Http({
|
|
15550
15291
|
headers: {
|
|
@@ -15641,7 +15382,7 @@ async function getWeixinData(_task, params) {
|
|
|
15641
15382
|
userInfoHtmlPromise,
|
|
15642
15383
|
userSummaryHtmlPromise
|
|
15643
15384
|
]);
|
|
15644
|
-
if (userInfoHtml.includes("请重新<a id='jumpUrl' href='/'>登录</a>")) return types_errorResponse("
|
|
15385
|
+
if (userInfoHtml.includes("请重新<a id='jumpUrl' href='/'>登录</a>")) return types_errorResponse("Token已失效,请重新获取", 414);
|
|
15645
15386
|
const userInfoJson = exportWxCgiData(userInfoHtml);
|
|
15646
15387
|
const userSummaryJson = exportWxCgiData(userSummaryHtml);
|
|
15647
15388
|
const wxData = {
|
|
@@ -15718,9 +15459,7 @@ const SearchAccountInfoParamsSchema = ActionCommonParamsSchema.extend({
|
|
|
15718
15459
|
"toutiao",
|
|
15719
15460
|
"xiaohongshu",
|
|
15720
15461
|
"weixin",
|
|
15721
|
-
"baijiahao"
|
|
15722
|
-
"douyin",
|
|
15723
|
-
"shipinhao"
|
|
15462
|
+
"baijiahao"
|
|
15724
15463
|
])
|
|
15725
15464
|
});
|
|
15726
15465
|
const SearchAccountInfo = async (_task, params)=>{
|
|
@@ -15734,10 +15473,6 @@ const SearchAccountInfo = async (_task, params)=>{
|
|
|
15734
15473
|
return getWeixinData(_task, params);
|
|
15735
15474
|
case "baijiahao":
|
|
15736
15475
|
return getBaijiahaoData(_task, params);
|
|
15737
|
-
case "douyin":
|
|
15738
|
-
return getDouyinData(_task, params);
|
|
15739
|
-
case "shipinhao":
|
|
15740
|
-
return getShipinhaoData(_task, params);
|
|
15741
15476
|
default:
|
|
15742
15477
|
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(null, "暂不支持该平台");
|
|
15743
15478
|
}
|
|
@@ -15832,45 +15567,18 @@ const XiaohongshuArticleSchema = BaseArticleSchema.extend({
|
|
|
15832
15567
|
collectNum: schemas_number(),
|
|
15833
15568
|
shareNum: schemas_number()
|
|
15834
15569
|
});
|
|
15835
|
-
const DouyinArticleSchema = BaseArticleSchema.extend({
|
|
15836
|
-
playNum: schemas_number(),
|
|
15837
|
-
likeNum: schemas_number(),
|
|
15838
|
-
commentNum: schemas_number(),
|
|
15839
|
-
shareNum: schemas_number(),
|
|
15840
|
-
collectNum: schemas_number(),
|
|
15841
|
-
awemeId: schemas_string(),
|
|
15842
|
-
awemeType: schemas_number(),
|
|
15843
|
-
duration: schemas_number().optional(),
|
|
15844
|
-
status: schemas_string(),
|
|
15845
|
-
publicUrl: schemas_string()
|
|
15846
|
-
});
|
|
15847
|
-
const ShipinhaoArticleSchema = BaseArticleSchema.extend({
|
|
15848
|
-
readNum: schemas_number(),
|
|
15849
|
-
likeNum: schemas_number(),
|
|
15850
|
-
commentNum: schemas_number(),
|
|
15851
|
-
forwardNum: schemas_number(),
|
|
15852
|
-
favNum: schemas_number(),
|
|
15853
|
-
objectId: schemas_string(),
|
|
15854
|
-
postType: schemas_string(),
|
|
15855
|
-
postStatus: schemas_number(),
|
|
15856
|
-
effectiveTime: schemas_number().optional()
|
|
15857
|
-
});
|
|
15858
15570
|
const FetchArticlesDataSchema = schemas_object({
|
|
15859
15571
|
articleCell: schemas_array(union([
|
|
15860
15572
|
ToutiaoArticleSchema,
|
|
15861
15573
|
WeixinArticleSchema,
|
|
15862
15574
|
BaijiahaoArticleSchema,
|
|
15863
|
-
XiaohongshuArticleSchema
|
|
15864
|
-
DouyinArticleSchema,
|
|
15865
|
-
ShipinhaoArticleSchema
|
|
15575
|
+
XiaohongshuArticleSchema
|
|
15866
15576
|
])).optional(),
|
|
15867
15577
|
timerPublish: schemas_array(union([
|
|
15868
15578
|
ToutiaoArticleSchema,
|
|
15869
15579
|
WeixinArticleSchema,
|
|
15870
15580
|
BaijiahaoArticleSchema,
|
|
15871
|
-
XiaohongshuArticleSchema
|
|
15872
|
-
DouyinArticleSchema,
|
|
15873
|
-
ShipinhaoArticleSchema
|
|
15581
|
+
XiaohongshuArticleSchema
|
|
15874
15582
|
])).optional(),
|
|
15875
15583
|
pagination: schemas_object({
|
|
15876
15584
|
total: schemas_number().optional(),
|
|
@@ -15985,269 +15693,6 @@ async function handleBaijiahaoData(_task, params) {
|
|
|
15985
15693
|
return searchPublishInfo_types_errorResponse(error instanceof Error ? error.message : "百家号文章数据获取失败");
|
|
15986
15694
|
}
|
|
15987
15695
|
}
|
|
15988
|
-
async function handleDouyinData(_task, params) {
|
|
15989
|
-
try {
|
|
15990
|
-
const { cookies, pageSize = 12, status = 0, showOriginalData = false, onlySuccess = false } = params;
|
|
15991
|
-
const pageNum = params.pageNum || 1;
|
|
15992
|
-
const headers = {
|
|
15993
|
-
cookie: cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
15994
|
-
referer: "https://creator.douyin.com"
|
|
15995
|
-
};
|
|
15996
|
-
const args = [
|
|
15997
|
-
{
|
|
15998
|
-
headers
|
|
15999
|
-
},
|
|
16000
|
-
_task.logger,
|
|
16001
|
-
params.proxyLoc,
|
|
16002
|
-
params.localIP,
|
|
16003
|
-
params.accountId
|
|
16004
|
-
];
|
|
16005
|
-
const http = new Http(...args);
|
|
16006
|
-
async function fetchWorks(cursor) {
|
|
16007
|
-
return await http.api({
|
|
16008
|
-
method: "get",
|
|
16009
|
-
url: "https://creator.douyin.com/janus/douyin/creator/pc/work_list",
|
|
16010
|
-
params: {
|
|
16011
|
-
scene: "star_atlas",
|
|
16012
|
-
device_platform: "android",
|
|
16013
|
-
aid: 1128,
|
|
16014
|
-
status,
|
|
16015
|
-
count: pageSize,
|
|
16016
|
-
max_cursor: cursor
|
|
16017
|
-
}
|
|
16018
|
-
}, {
|
|
16019
|
-
retries: 3,
|
|
16020
|
-
retryDelay: 100,
|
|
16021
|
-
timeout: 5000
|
|
16022
|
-
});
|
|
16023
|
-
}
|
|
16024
|
-
const isHasMore = (v)=>true === v || 1 === v;
|
|
16025
|
-
const skipCount = (pageNum - 1) * pageSize;
|
|
16026
|
-
const needCount = skipCount + pageSize;
|
|
16027
|
-
const workListResponse = await fetchWorks(0);
|
|
16028
|
-
if (!workListResponse || !Array.isArray(workListResponse.aweme_list)) return searchPublishInfo_types_errorResponse("抖音数据获取失败,请检查账号状态", 414);
|
|
16029
|
-
const allWorks = [
|
|
16030
|
-
...workListResponse.aweme_list
|
|
16031
|
-
];
|
|
16032
|
-
let hasMore = isHasMore(workListResponse.has_more);
|
|
16033
|
-
let currentCursor = workListResponse.cursor ?? workListResponse.max_cursor ?? 0;
|
|
16034
|
-
let guard = 0;
|
|
16035
|
-
while(allWorks.length < needCount && hasMore && guard < 20){
|
|
16036
|
-
const nextPageResponse = await fetchWorks(currentCursor);
|
|
16037
|
-
if (!Array.isArray(nextPageResponse.aweme_list) || 0 === nextPageResponse.aweme_list.length) break;
|
|
16038
|
-
allWorks.push(...nextPageResponse.aweme_list);
|
|
16039
|
-
hasMore = isHasMore(nextPageResponse.has_more);
|
|
16040
|
-
currentCursor = nextPageResponse.cursor ?? nextPageResponse.max_cursor ?? currentCursor;
|
|
16041
|
-
guard++;
|
|
16042
|
-
}
|
|
16043
|
-
const finalWorks = allWorks.slice(skipCount, needCount);
|
|
16044
|
-
const articleCell = finalWorks.map((item)=>{
|
|
16045
|
-
const workDetailUrl = `https://creator.douyin.com/creator-micro/work-management/work-detail/${item.aweme_id}`;
|
|
16046
|
-
const workPublicUrl = item.share_url || `https://www.douyin.com/video/${item.aweme_id}`;
|
|
16047
|
-
let statusText;
|
|
16048
|
-
statusText = item.status?.is_delete ? "deleted" : item.status?.is_private ? "private" : item.status?.in_reviewing ? "reviewing" : "public";
|
|
16049
|
-
return {
|
|
16050
|
-
title: item.desc || "无作品描述",
|
|
16051
|
-
imageUrl: item.Cover?.url_list?.[0] || "",
|
|
16052
|
-
createTime: item.create_time,
|
|
16053
|
-
redirectUrl: workDetailUrl,
|
|
16054
|
-
playNum: item.statistics?.play_count || 0,
|
|
16055
|
-
likeNum: item.statistics?.digg_count || 0,
|
|
16056
|
-
commentNum: item.statistics?.comment_count || 0,
|
|
16057
|
-
shareNum: item.statistics?.share_count || 0,
|
|
16058
|
-
collectNum: item.statistics?.collect_count || 0,
|
|
16059
|
-
awemeId: item.aweme_id,
|
|
16060
|
-
awemeType: item.aweme_type ?? 0,
|
|
16061
|
-
duration: item.duration,
|
|
16062
|
-
status: statusText,
|
|
16063
|
-
publicUrl: workPublicUrl,
|
|
16064
|
-
...showOriginalData ? {
|
|
16065
|
-
originalData: item
|
|
16066
|
-
} : {}
|
|
16067
|
-
};
|
|
16068
|
-
});
|
|
16069
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)({
|
|
16070
|
-
articleCell,
|
|
16071
|
-
...onlySuccess ? {
|
|
16072
|
-
pagination: {
|
|
16073
|
-
total: workListResponse.total || allWorks.length,
|
|
16074
|
-
nextPage: hasMore,
|
|
16075
|
-
pageNum,
|
|
16076
|
-
pageSize
|
|
16077
|
-
}
|
|
16078
|
-
} : null
|
|
16079
|
-
}, "抖音数据获取成功");
|
|
16080
|
-
} catch (error) {
|
|
16081
|
-
return searchPublishInfo_types_errorResponse(error instanceof Error ? error.message : "抖音数据获取失败");
|
|
16082
|
-
}
|
|
16083
|
-
}
|
|
16084
|
-
async function handleShipinhaoData(_task, params) {
|
|
16085
|
-
try {
|
|
16086
|
-
const { cookies, postType = "all", pageSize = 10, showOriginalData = false } = params;
|
|
16087
|
-
const pageNum = params.pageNum || 1;
|
|
16088
|
-
const aidCookie = cookies.find((it)=>"_aid" === it.name)?.value;
|
|
16089
|
-
const aid = aidCookie || "9d3e0e9f-b842-498d-a273-4285d58df264";
|
|
16090
|
-
const uinCookie = cookies.find((it)=>"uin" === it.name || "wxuin" === it.name)?.value || "0000000000";
|
|
16091
|
-
const deviceIdCookie = cookies.find((it)=>"device_id" === it.name || "finger_print_device_id" === it.name)?.value;
|
|
16092
|
-
const headers = {
|
|
16093
|
-
cookie: cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
16094
|
-
referer: "https://channels.weixin.qq.com",
|
|
16095
|
-
origin: "https://channels.weixin.qq.com",
|
|
16096
|
-
"content-type": "application/json",
|
|
16097
|
-
"X-WECHAT-UIN": uinCookie,
|
|
16098
|
-
...deviceIdCookie ? {
|
|
16099
|
-
"finger-print-device-id": deviceIdCookie
|
|
16100
|
-
} : {}
|
|
16101
|
-
};
|
|
16102
|
-
const args = [
|
|
16103
|
-
{
|
|
16104
|
-
headers
|
|
16105
|
-
},
|
|
16106
|
-
_task.logger,
|
|
16107
|
-
params.proxyLoc,
|
|
16108
|
-
params.localIP,
|
|
16109
|
-
params.accountId
|
|
16110
|
-
];
|
|
16111
|
-
const http = new Http(...args);
|
|
16112
|
-
const finderIdCookie = cookies.find((it)=>"_log_finder_id" === it.name || "finder_id" === it.name)?.value || "";
|
|
16113
|
-
async function fetchPosts(currentPage, userpageType, pageUrl, rawKeyBuff = "") {
|
|
16114
|
-
return await http.api({
|
|
16115
|
-
method: "post",
|
|
16116
|
-
url: "https://channels.weixin.qq.com/micro/content/cgi-bin/mmfinderassistant-bin/post/post_list",
|
|
16117
|
-
params: {
|
|
16118
|
-
_aid: aid,
|
|
16119
|
-
_rid: `${Date.now().toString(16)}-${Math.random().toString(36).substring(2, 9)}`,
|
|
16120
|
-
_pageUrl: encodeURIComponent(pageUrl)
|
|
16121
|
-
},
|
|
16122
|
-
data: {
|
|
16123
|
-
pageSize,
|
|
16124
|
-
currentPage,
|
|
16125
|
-
userpageType,
|
|
16126
|
-
stickyOrder: true,
|
|
16127
|
-
timestamp: Date.now().toString(),
|
|
16128
|
-
_log_finder_uin: "",
|
|
16129
|
-
_log_finder_id: finderIdCookie,
|
|
16130
|
-
rawKeyBuff,
|
|
16131
|
-
pluginSessionId: null,
|
|
16132
|
-
scene: 7,
|
|
16133
|
-
reqScene: 7
|
|
16134
|
-
}
|
|
16135
|
-
}, {
|
|
16136
|
-
retries: 3,
|
|
16137
|
-
retryDelay: 100,
|
|
16138
|
-
timeout: 5000
|
|
16139
|
-
});
|
|
16140
|
-
}
|
|
16141
|
-
async function fetchAllPosts(userpageType, pageUrl) {
|
|
16142
|
-
const allPosts = [];
|
|
16143
|
-
let currentPage = 1;
|
|
16144
|
-
let rawKeyBuff = "";
|
|
16145
|
-
let continueFlag = true;
|
|
16146
|
-
let totalCount = 0;
|
|
16147
|
-
while(continueFlag){
|
|
16148
|
-
const response = await fetchPosts(currentPage, userpageType, pageUrl, rawKeyBuff);
|
|
16149
|
-
if (response.errCode && AUTH_ERROR_CODES.includes(response.errCode)) throw new Error(`AUTH_ERROR:${response.errMsg || "登录已失效"}`);
|
|
16150
|
-
if (response.errCode) {
|
|
16151
|
-
_task.logger.warn(`视频号API错误:${response.errMsg} (${response.errCode})`);
|
|
16152
|
-
throw new Error(`视频号API错误:${response.errMsg} (${response.errCode})`);
|
|
16153
|
-
}
|
|
16154
|
-
if (1 === currentPage) totalCount = response.data?.totalCount ?? 0;
|
|
16155
|
-
const posts = response.data?.list || response.posts || response.post_list || [];
|
|
16156
|
-
allPosts.push(...posts);
|
|
16157
|
-
continueFlag = response.data?.continueFlag ?? false;
|
|
16158
|
-
rawKeyBuff = response.data?.lastBuff || "";
|
|
16159
|
-
currentPage++;
|
|
16160
|
-
if (currentPage > 100) {
|
|
16161
|
-
_task.logger.warn("分页超过100页,停止请求");
|
|
16162
|
-
break;
|
|
16163
|
-
}
|
|
16164
|
-
}
|
|
16165
|
-
if (totalCount > 0 && allPosts.length !== totalCount) _task.logger.warn(`视频号分页可能不完整:期望${totalCount}条,实际${allPosts.length}条`);
|
|
16166
|
-
return {
|
|
16167
|
-
posts: allPosts,
|
|
16168
|
-
totalCount
|
|
16169
|
-
};
|
|
16170
|
-
}
|
|
16171
|
-
const mapPost = (item, forcePostType)=>{
|
|
16172
|
-
let imageUrl = "";
|
|
16173
|
-
if (item.desc?.media?.[0]?.thumbUrl) imageUrl = item.desc.media[0].thumbUrl;
|
|
16174
|
-
else if (item.desc?.media?.[0]?.coverUrl) imageUrl = item.desc.media[0].coverUrl;
|
|
16175
|
-
else if (item.cover?.url) imageUrl = item.cover.url;
|
|
16176
|
-
else if (item.media_url) imageUrl = item.media_url;
|
|
16177
|
-
const title = item.desc?.description || item.object_desc || "无标题";
|
|
16178
|
-
return {
|
|
16179
|
-
title,
|
|
16180
|
-
imageUrl,
|
|
16181
|
-
createTime: item.createTime || item.create_time,
|
|
16182
|
-
redirectUrl: "https://channels.weixin.qq.com/platform",
|
|
16183
|
-
readNum: item.readCount || item.read_count || 0,
|
|
16184
|
-
likeNum: item.likeCount || item.like_count || 0,
|
|
16185
|
-
commentNum: item.commentCount || item.comment_count || 0,
|
|
16186
|
-
forwardNum: item.forwardCount || item.forward_count || 0,
|
|
16187
|
-
favNum: item.favCount || item.fav_count || 0,
|
|
16188
|
-
objectId: item.exportId || item.objectId || "",
|
|
16189
|
-
postType: forcePostType,
|
|
16190
|
-
postStatus: item.status || item.post_status || 0,
|
|
16191
|
-
...item.effectiveTime ? {
|
|
16192
|
-
effectiveTime: item.effectiveTime
|
|
16193
|
-
} : {},
|
|
16194
|
-
...showOriginalData ? {
|
|
16195
|
-
originalData: item
|
|
16196
|
-
} : {}
|
|
16197
|
-
};
|
|
16198
|
-
};
|
|
16199
|
-
const allArticles = [];
|
|
16200
|
-
const needVideo = "all" === postType || "video" === postType;
|
|
16201
|
-
const needArticle = "all" === postType || "article" === postType;
|
|
16202
|
-
const AUTH_ERROR_CODES = [
|
|
16203
|
-
300333,
|
|
16204
|
-
300334,
|
|
16205
|
-
300330,
|
|
16206
|
-
300331,
|
|
16207
|
-
300332
|
|
16208
|
-
];
|
|
16209
|
-
let combinedTotal = 0;
|
|
16210
|
-
if (needVideo) try {
|
|
16211
|
-
const videoPageUrl = "https://channels.weixin.qq.com/micro/content/post/list";
|
|
16212
|
-
const { posts, totalCount } = await fetchAllPosts(11, videoPageUrl);
|
|
16213
|
-
const videoArticles = posts.filter((item)=>item.createTime || item.create_time).map((item)=>mapPost(item, "video"));
|
|
16214
|
-
allArticles.push(...videoArticles);
|
|
16215
|
-
combinedTotal += totalCount || videoArticles.length;
|
|
16216
|
-
} catch (error) {
|
|
16217
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
16218
|
-
if (errMsg.startsWith("AUTH_ERROR:")) throw error;
|
|
16219
|
-
_task.logger.warn(`获取视频号视频失败:${errMsg}`);
|
|
16220
|
-
}
|
|
16221
|
-
if (needArticle) try {
|
|
16222
|
-
const articlePageUrl = "https://channels.weixin.qq.com/micro/content/post/finderNewLifePostList";
|
|
16223
|
-
const { posts, totalCount } = await fetchAllPosts(10, articlePageUrl);
|
|
16224
|
-
const articleArticles = posts.filter((item)=>item.createTime || item.create_time).map((item)=>mapPost(item, "article"));
|
|
16225
|
-
allArticles.push(...articleArticles);
|
|
16226
|
-
combinedTotal += totalCount || articleArticles.length;
|
|
16227
|
-
} catch (error) {
|
|
16228
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
16229
|
-
if (errMsg.startsWith("AUTH_ERROR:")) throw error;
|
|
16230
|
-
_task.logger.warn(`获取视频号图文失败:${errMsg}`);
|
|
16231
|
-
}
|
|
16232
|
-
allArticles.sort((a, b)=>b.createTime - a.createTime);
|
|
16233
|
-
const total = allArticles.length;
|
|
16234
|
-
const start = (pageNum - 1) * pageSize;
|
|
16235
|
-
const pageItems = allArticles.slice(start, start + pageSize);
|
|
16236
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)({
|
|
16237
|
-
articleCell: pageItems,
|
|
16238
|
-
pagination: {
|
|
16239
|
-
total,
|
|
16240
|
-
nextPage: start + pageSize < total,
|
|
16241
|
-
pageNum,
|
|
16242
|
-
pageSize
|
|
16243
|
-
}
|
|
16244
|
-
}, "视频号数据获取成功");
|
|
16245
|
-
} catch (error) {
|
|
16246
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
16247
|
-
if (errMsg.startsWith("AUTH_ERROR:")) return searchPublishInfo_types_errorResponse("视频号数据获取失败,请检查账号状态", 414);
|
|
16248
|
-
return searchPublishInfo_types_errorResponse(errMsg || "视频号数据获取失败");
|
|
16249
|
-
}
|
|
16250
|
-
}
|
|
16251
15696
|
async function handleToutiaoData(_task, params) {
|
|
16252
15697
|
try {
|
|
16253
15698
|
const { cookies, pageNum = 1, pageSize = 10, showOriginalData = false, onlySuccess = false, containsArticle = false } = params;
|
|
@@ -16280,7 +15725,7 @@ async function handleToutiaoData(_task, params) {
|
|
|
16280
15725
|
app_id: 1231
|
|
16281
15726
|
}
|
|
16282
15727
|
});
|
|
16283
|
-
if (0 !== visitedUid.code) return searchPublishInfo_types_errorResponse("
|
|
15728
|
+
if (0 !== visitedUid.code) return searchPublishInfo_types_errorResponse("头条号账号信息获取失败,请检查账号状态", 414);
|
|
16284
15729
|
const articleInfo = await http.api({
|
|
16285
15730
|
method: "get",
|
|
16286
15731
|
url: "https://mp.toutiao.com/api/feed/mp_provider/v1/",
|
|
@@ -16387,7 +15832,7 @@ async function handleWeixinData(_task, params) {
|
|
|
16387
15832
|
const size = onlySuccess ? 10 : pageSize > 20 ? 20 : pageSize;
|
|
16388
15833
|
let begin = (lastPage ?? pageNum) - 1;
|
|
16389
15834
|
const rawArticlesInfo = await fetchArticles(begin * size, size, token);
|
|
16390
|
-
if (rawArticlesInfo.includes("请重新<a id='jumpUrl' href='/'>登录</a>")) return searchPublishInfo_types_errorResponse("
|
|
15835
|
+
if (rawArticlesInfo.includes("请重新<a id='jumpUrl' href='/'>登录</a>")) return searchPublishInfo_types_errorResponse("登陆已失效,请重新登陆!", 414);
|
|
16391
15836
|
const articlesInfo = ParsePublishPage(rawArticlesInfo);
|
|
16392
15837
|
let articleCell = [];
|
|
16393
15838
|
if (!onlySuccess && pageSize > 20) {
|
|
@@ -16549,7 +15994,7 @@ async function handleXiaohongshuData(_task, params) {
|
|
|
16549
15994
|
const a1Cookie = cookies.find((it)=>"a1" === it.name)?.value;
|
|
16550
15995
|
if (!a1Cookie) return {
|
|
16551
15996
|
code: 414,
|
|
16552
|
-
message: "
|
|
15997
|
+
message: "账号数据异常",
|
|
16553
15998
|
data: {}
|
|
16554
15999
|
};
|
|
16555
16000
|
if (onlySuccess && 10 !== pageSize) return {
|
|
@@ -16668,7 +16113,7 @@ async function handleXiaohongshuData(_task, params) {
|
|
|
16668
16113
|
}, "小红书文章数据获取成功");
|
|
16669
16114
|
}
|
|
16670
16115
|
const FetchArticlesParamsSchema = ActionCommonParamsSchema.extend({
|
|
16671
|
-
platform: schemas_string().describe("社交平台:weixin, toutiao, baijiahao, xiaohongshu
|
|
16116
|
+
platform: schemas_string().describe("社交平台:weixin, toutiao, baijiahao, xiaohongshu"),
|
|
16672
16117
|
token: union([
|
|
16673
16118
|
schemas_string(),
|
|
16674
16119
|
schemas_number()
|
|
@@ -16680,14 +16125,7 @@ const FetchArticlesParamsSchema = ActionCommonParamsSchema.extend({
|
|
|
16680
16125
|
showOriginalData: schemas_boolean().optional().describe("是否展示原始数据,默认false"),
|
|
16681
16126
|
cursor: schemas_number().optional().describe("仅用于微信分页游标,默认为空"),
|
|
16682
16127
|
lastPage: schemas_number().optional(),
|
|
16683
|
-
containsArticle: schemas_boolean().optional().describe("是否包含文章内容,默认false")
|
|
16684
|
-
status: schemas_number().optional().describe("抖音作品状态:0=全部"),
|
|
16685
|
-
includeAccount: schemas_boolean().optional().describe("是否包含账号数据,默认true"),
|
|
16686
|
-
postType: schemas_enum([
|
|
16687
|
-
"video",
|
|
16688
|
-
"article",
|
|
16689
|
-
"all"
|
|
16690
|
-
]).optional().describe("视频号作品类型:video=视频, article=图文, all=全部")
|
|
16128
|
+
containsArticle: schemas_boolean().optional().describe("是否包含文章内容,默认false")
|
|
16691
16129
|
});
|
|
16692
16130
|
const FetchArticles = async (_task, params)=>{
|
|
16693
16131
|
const { platform } = params;
|
|
@@ -16700,10 +16138,6 @@ const FetchArticles = async (_task, params)=>{
|
|
|
16700
16138
|
return handleBaijiahaoData(_task, params);
|
|
16701
16139
|
case "xiaohongshu":
|
|
16702
16140
|
return handleXiaohongshuData(_task, params);
|
|
16703
|
-
case "douyin":
|
|
16704
|
-
return handleDouyinData(_task, params);
|
|
16705
|
-
case "shipinhao":
|
|
16706
|
-
return handleShipinhaoData(_task, params);
|
|
16707
16141
|
default:
|
|
16708
16142
|
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)({}, "暂不支持该平台");
|
|
16709
16143
|
}
|
|
@@ -18107,11 +17541,6 @@ class VideoChannelUploader {
|
|
|
18107
17541
|
this.concurrentLimit = config.concurrentLimit || 4;
|
|
18108
17542
|
this.singleFileSize = config.singleFileSize || 10485760;
|
|
18109
17543
|
this.http = config.http || new Http();
|
|
18110
|
-
this.reqOptions = {
|
|
18111
|
-
timeout: config.timeout ?? 60000,
|
|
18112
|
-
retries: config.retries ?? 3,
|
|
18113
|
-
retryDelay: config.retryDelay ?? 2000
|
|
18114
|
-
};
|
|
18115
17544
|
}
|
|
18116
17545
|
calculateMd5(buffer) {
|
|
18117
17546
|
const MAX_SIZE = 5242880;
|
|
@@ -18168,7 +17597,7 @@ class VideoChannelUploader {
|
|
|
18168
17597
|
url: filePath,
|
|
18169
17598
|
method: "get",
|
|
18170
17599
|
responseType: "arraybuffer"
|
|
18171
|
-
}
|
|
17600
|
+
});
|
|
18172
17601
|
return Buffer.from(resp);
|
|
18173
17602
|
}
|
|
18174
17603
|
return __WEBPACK_EXTERNAL_MODULE_node_fs_5ea92f0c__["default"].promises.readFile(filePath);
|
|
@@ -18198,7 +17627,7 @@ class VideoChannelUploader {
|
|
|
18198
17627
|
headers,
|
|
18199
17628
|
data: requestBody,
|
|
18200
17629
|
defaultErrorMsg: "获取UploadID失败"
|
|
18201
|
-
}
|
|
17630
|
+
});
|
|
18202
17631
|
if (!resp?.UploadID) throw new Error(`获取 UploadID 失败: ${resp?.errMsg || "未知错误"}`);
|
|
18203
17632
|
return resp.UploadID;
|
|
18204
17633
|
}
|
|
@@ -18219,7 +17648,7 @@ class VideoChannelUploader {
|
|
|
18219
17648
|
headers,
|
|
18220
17649
|
data: chunk,
|
|
18221
17650
|
defaultErrorMsg: `分片 ${partNumber} 上传失败`
|
|
18222
|
-
}
|
|
17651
|
+
});
|
|
18223
17652
|
if (resp?.errCode !== void 0 && 0 !== resp.errCode) throw new Error(`分片 ${partNumber} 上传失败: ${resp.errMsg}`);
|
|
18224
17653
|
if (onProgress) onProgress(chunk.length);
|
|
18225
17654
|
return resp.ETag || "";
|
|
@@ -18243,7 +17672,7 @@ class VideoChannelUploader {
|
|
|
18243
17672
|
headers,
|
|
18244
17673
|
data: requestBody,
|
|
18245
17674
|
defaultErrorMsg: "确认分片上传失败"
|
|
18246
|
-
}
|
|
17675
|
+
});
|
|
18247
17676
|
if (resp?.ListPartsResult?.Part) return resp.ListPartsResult.Part.map((p)=>({
|
|
18248
17677
|
PartNumber: parseInt(p.PartNumber),
|
|
18249
17678
|
ETag: p.ETag
|
|
@@ -18269,7 +17698,7 @@ class VideoChannelUploader {
|
|
|
18269
17698
|
headers,
|
|
18270
17699
|
data: requestBody,
|
|
18271
17700
|
defaultErrorMsg: "完成上传失败"
|
|
18272
|
-
}
|
|
17701
|
+
});
|
|
18273
17702
|
if (!resp?.DownloadURL) throw new Error(`完成上传失败: ${resp?.errMsg || "未知错误"}`);
|
|
18274
17703
|
return resp.DownloadURL;
|
|
18275
17704
|
}
|
|
@@ -18620,9 +18049,7 @@ const shipinhaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
18620
18049
|
task.logger.info("[shipinhaoPublish] 开始执行视频号发布 - Mock API 方式");
|
|
18621
18050
|
const updateTaskState = task.taskStageStore?.update?.bind(task.taskStageStore, task.taskId || "");
|
|
18622
18051
|
if (!params.extraParam.fingerPrintDeviceId || !params.extraParam.aId) return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(400, "fingerPrintDeviceId和aId 不能为空", "");
|
|
18623
|
-
let currentStep = "初始化";
|
|
18624
18052
|
try {
|
|
18625
|
-
currentStep = "解析认证信息";
|
|
18626
18053
|
const cookieString = params.cookies.map((c)=>`${c.name}=${c.value}`).join("; ");
|
|
18627
18054
|
const fingerPrintDeviceId = params.extraParam.fingerPrintDeviceId;
|
|
18628
18055
|
const aId = params.extraParam.aId;
|
|
@@ -18643,10 +18070,8 @@ const shipinhaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
18643
18070
|
headers
|
|
18644
18071
|
});
|
|
18645
18072
|
const proxyHttp = new Http(...args);
|
|
18646
|
-
currentStep = "验证发布参数";
|
|
18647
18073
|
if (!params.banners || 0 === params.banners.length) return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(400, "至少需要一张图片", "");
|
|
18648
18074
|
const images = params.banners.slice(0, 18).filter((img)=>"string" == typeof img);
|
|
18649
|
-
currentStep = "获取用户信息";
|
|
18650
18075
|
task.logger.info("[shipinhaoPublish] 获取用户信息...");
|
|
18651
18076
|
console.log("cookieString", cookieString);
|
|
18652
18077
|
const userInfo = await mock_getUserInfo(cookieString, http);
|
|
@@ -18657,7 +18082,6 @@ const shipinhaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
18657
18082
|
}
|
|
18658
18083
|
const finderUsername = userInfo.data.finderUser.finderUsername;
|
|
18659
18084
|
console.log(finderUsername);
|
|
18660
|
-
currentStep = "获取上传认证密钥";
|
|
18661
18085
|
task.logger.info("[shipinhaoPublish] 获取上传认证密钥...");
|
|
18662
18086
|
const authKeyResponse = await getUploadAuthKey(cookieString, finderUsername, http);
|
|
18663
18087
|
if (0 !== authKeyResponse.errCode || !authKeyResponse.data?.authKey) return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(authKeyResponse.errCode || 500, `获取上传认证参数失败: ${authKeyResponse.errMsg}`, "");
|
|
@@ -18665,12 +18089,10 @@ const shipinhaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
18665
18089
|
const uin = authKeyResponse.data.uin;
|
|
18666
18090
|
if (!uin) return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(500, "获取用户 uin 失败", "");
|
|
18667
18091
|
const taskId = String(generateUUID());
|
|
18668
|
-
currentStep = "上传图片";
|
|
18669
18092
|
task.logger.info(`[shipinhaoPublish] 开始上传 ${images.length} 张图片...`);
|
|
18670
18093
|
const uploadedImages = [];
|
|
18671
18094
|
for(let i = 0; i < images.length; i++){
|
|
18672
|
-
|
|
18673
|
-
task.logger.info(`[shipinhaoPublish] ${currentStep}...`);
|
|
18095
|
+
task.logger.info(`[shipinhaoPublish] 上传图片 ${i + 1}/${images.length}...`);
|
|
18674
18096
|
const uploadResult = await uploadImageComplete(images[i], taskId, finderUsername, uin, authKey, http);
|
|
18675
18097
|
console.log(JSON.stringify(uploadResult));
|
|
18676
18098
|
if (!uploadResult.DownloadURL) return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(500, `图片上传失败: ${uploadResult.errMsg}`, "");
|
|
@@ -18687,7 +18109,6 @@ const shipinhaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
18687
18109
|
urlCdnTaskId: ""
|
|
18688
18110
|
});
|
|
18689
18111
|
}
|
|
18690
|
-
currentStep = "发布图文内容";
|
|
18691
18112
|
task.logger.info("[shipinhaoPublish] 正在发布...");
|
|
18692
18113
|
const topicNames = params.topic || void 0;
|
|
18693
18114
|
const addressInfo = params.address ? {
|
|
@@ -18774,15 +18195,9 @@ const shipinhaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
18774
18195
|
});
|
|
18775
18196
|
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(resultCode || 500, errorMessage, "");
|
|
18776
18197
|
} catch (error) {
|
|
18777
|
-
const
|
|
18778
|
-
|
|
18779
|
-
|
|
18780
|
-
task.logger.error(`[shipinhaoPublish] 发布流程异常: ${errorMsg}`, stringifyError(error), handledError.extra);
|
|
18781
|
-
await updateTaskState?.({
|
|
18782
|
-
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
18783
|
-
error: errorMsg
|
|
18784
|
-
});
|
|
18785
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(errorCode, errorMsg, "");
|
|
18198
|
+
const errorMsg = error instanceof Error ? error.message : "发布失败";
|
|
18199
|
+
task.logger.error(`[shipinhaoPublish] 发布异常: ${errorMsg}`);
|
|
18200
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(500, errorMsg, "");
|
|
18786
18201
|
}
|
|
18787
18202
|
};
|
|
18788
18203
|
const shipinhaoPublish_rpa_rpaAction = async (task, params)=>{
|
|
@@ -25288,24 +24703,6 @@ const bjhConfigDataSchema = schemas_object({
|
|
|
25288
24703
|
likeNumYesterday: schemas_number().nullable(),
|
|
25289
24704
|
commentNumYesterday: schemas_number().nullable()
|
|
25290
24705
|
});
|
|
25291
|
-
const douyinConfigDataSchema = schemas_object({
|
|
25292
|
-
fansNum: schemas_number(),
|
|
25293
|
-
favedNum: schemas_number(),
|
|
25294
|
-
fansNumLastWeek: schemas_number(),
|
|
25295
|
-
watchNumLastWeek: schemas_number(),
|
|
25296
|
-
likeNumLastWeek: schemas_number(),
|
|
25297
|
-
commentNumLastWeek: schemas_number(),
|
|
25298
|
-
shareNumLastWeek: schemas_number(),
|
|
25299
|
-
visitNumLastWeek: schemas_number()
|
|
25300
|
-
});
|
|
25301
|
-
const shipinhaoConfigDataSchema = schemas_object({
|
|
25302
|
-
fansNum: schemas_number(),
|
|
25303
|
-
feedsCount: schemas_number(),
|
|
25304
|
-
fansNumYesterday: schemas_number().nullable(),
|
|
25305
|
-
playNumYesterday: schemas_number().nullable(),
|
|
25306
|
-
likeNumYesterday: schemas_number().nullable(),
|
|
25307
|
-
commentNumYesterday: schemas_number().nullable()
|
|
25308
|
-
});
|
|
25309
24706
|
const BetaFlag = "HuiwenCanary";
|
|
25310
24707
|
class Action {
|
|
25311
24708
|
constructor(task){
|
|
@@ -25588,7 +24985,6 @@ class Action {
|
|
|
25588
24985
|
}
|
|
25589
24986
|
}
|
|
25590
24987
|
var __webpack_exports__version = package_namespaceObject.i8;
|
|
25591
|
-
export { Action, ActionCommonParamsSchema, BaijiahaoPublishParamsSchema, BetaFlag, CollectionDetailSchema, ConfigDataSchema, DouyinCheckVerifyQrCodeParamsSchema, DouyinCreateCommentReplyParamsSchema, DouyinGetCollectionParamsSchema, DouyinGetCommentListParamsSchema, DouyinGetCommentReplyListParamsSchema, DouyinGetHotParamsSchema, DouyinGetLocationParamsSchema, DouyinGetMusicByCategoryParamsSchema, DouyinGetMusicCategoryParamsSchema, DouyinGetMusicParamsSchema, DouyinGetTopicsParamsSchema, DouyinGetVerifyQrCodeParamsSchema, DouyinGetWorkListParamsSchema, DouyinPublishParamsSchema, FetchArticlesDataSchema, FetchArticlesParamsSchema, Http, ProxyAgent, SearchAccountInfoParamsSchema, SessionCheckResultSchema, ShipinhaoCheckLinkValidateParamsSchema, ShipinhaoGetLocationParamsSchema, ShipinhaoGetMsgParamsSchema, ShipinhaoPublishParamsSchema, ShipinhaoSendMsgParamsSchema, ToutiaoPublishParamsSchema, UnreadCountSchema, WeixinPublishParamsSchema, WxBjhSessionParamsSchema, XhsWebSearchParamsSchema, XiaohongshuPublishParamsSchema, bjhConfigDataSchema,
|
|
24988
|
+
export { Action, ActionCommonParamsSchema, BaijiahaoPublishParamsSchema, BetaFlag, CollectionDetailSchema, ConfigDataSchema, DouyinCheckVerifyQrCodeParamsSchema, DouyinCreateCommentReplyParamsSchema, DouyinGetCollectionParamsSchema, DouyinGetCommentListParamsSchema, DouyinGetCommentReplyListParamsSchema, DouyinGetHotParamsSchema, DouyinGetLocationParamsSchema, DouyinGetMusicByCategoryParamsSchema, DouyinGetMusicCategoryParamsSchema, DouyinGetMusicParamsSchema, DouyinGetTopicsParamsSchema, DouyinGetVerifyQrCodeParamsSchema, DouyinGetWorkListParamsSchema, DouyinPublishParamsSchema, FetchArticlesDataSchema, FetchArticlesParamsSchema, Http, ProxyAgent, SearchAccountInfoParamsSchema, SessionCheckResultSchema, ShipinhaoCheckLinkValidateParamsSchema, ShipinhaoGetLocationParamsSchema, ShipinhaoGetMsgParamsSchema, ShipinhaoPublishParamsSchema, ShipinhaoSendMsgParamsSchema, ToutiaoPublishParamsSchema, UnreadCountSchema, WeixinPublishParamsSchema, WxBjhSessionParamsSchema, XhsWebSearchParamsSchema, XiaohongshuPublishParamsSchema, bjhConfigDataSchema, getFileState, reportLogger, rpaAction_Server_Mock, ttConfigDataSchema, wxConfigDataSchema, xhsConfigDataSchema, __webpack_exports__version as version };
|
|
25592
24989
|
|
|
25593
|
-
//# sourceMappingURL=index.mjs.map
|
|
25594
|
-
//# debugId=b88e36bc-ad59-5586-98ef-aba93fe1c33f
|
|
24990
|
+
//# sourceMappingURL=index.mjs.map
|