@iflyrpa/actions 4.0.0-beta.1 → 4.0.0-beta.10
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 +313 -85
- package/dist/bundle.js.map +1 -1
- package/dist/index.js +281 -70
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +281 -70
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -5434,7 +5434,7 @@ function __webpack_require__(moduleId) {
|
|
|
5434
5434
|
return module;
|
|
5435
5435
|
};
|
|
5436
5436
|
})();
|
|
5437
|
-
var package_namespaceObject = JSON.parse('{"i8":"
|
|
5437
|
+
var package_namespaceObject = JSON.parse('{"i8":"4.0.0-beta.9"}');
|
|
5438
5438
|
var dist = __webpack_require__("../../node_modules/.pnpm/https-proxy-agent@7.0.6/node_modules/https-proxy-agent/dist/index.js");
|
|
5439
5439
|
async function ProxyAgent(task, ip, adr, accountId, refresh) {
|
|
5440
5440
|
const http = new Http({
|
|
@@ -5622,7 +5622,7 @@ class Http {
|
|
|
5622
5622
|
599
|
|
5623
5623
|
].includes(handledError.code);
|
|
5624
5624
|
if (Rtimes < retries && isRetry) {
|
|
5625
|
-
this.logger?.info(`进入第${Rtimes + 1}
|
|
5625
|
+
this.logger?.info(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}`);
|
|
5626
5626
|
await new Promise((resolve)=>setTimeout(resolve, retryDelay));
|
|
5627
5627
|
return sessionRt(Rtimes + 1);
|
|
5628
5628
|
}
|
|
@@ -11820,16 +11820,35 @@ const WxSessionCheck = async (_task, params)=>{
|
|
|
11820
11820
|
}, "微信账号有效性检测完成!");
|
|
11821
11821
|
};
|
|
11822
11822
|
const XhsSessionCheck = async (_task, params)=>{
|
|
11823
|
+
const logger = _task.logger;
|
|
11824
|
+
const startedAt = Date.now();
|
|
11823
11825
|
const check = {
|
|
11824
11826
|
isValidSession: false,
|
|
11825
11827
|
isValidWebSession: false
|
|
11826
11828
|
};
|
|
11829
|
+
const cookieNames = params.cookies.map((it)=>it.name);
|
|
11830
|
+
logger?.info("[XhsSessionCheck] 开始执行小红书账号有效性检测", {
|
|
11831
|
+
accountId: params.accountId,
|
|
11832
|
+
proxyLoc: params.proxyLoc,
|
|
11833
|
+
localIP: params.localIP,
|
|
11834
|
+
willUseProxyAgent: !!params.localIP,
|
|
11835
|
+
cookieCount: params.cookies.length,
|
|
11836
|
+
cookieNames,
|
|
11837
|
+
hasA1: cookieNames.includes("a1"),
|
|
11838
|
+
hasWebSession: cookieNames.includes("web_session")
|
|
11839
|
+
});
|
|
11827
11840
|
const a1Cookie = params.cookies.find((it)=>"a1" === it.name)?.value;
|
|
11828
|
-
if (!a1Cookie)
|
|
11829
|
-
|
|
11830
|
-
|
|
11831
|
-
|
|
11832
|
-
|
|
11841
|
+
if (!a1Cookie) {
|
|
11842
|
+
logger?.warn("[XhsSessionCheck] 缺失关键 cookie a1,提前返回", {
|
|
11843
|
+
accountId: params.accountId,
|
|
11844
|
+
cookieNames
|
|
11845
|
+
});
|
|
11846
|
+
return {
|
|
11847
|
+
code: 414,
|
|
11848
|
+
message: "账号数据异常,请重新绑定账号后重试。",
|
|
11849
|
+
data: check
|
|
11850
|
+
};
|
|
11851
|
+
}
|
|
11833
11852
|
const headers = {
|
|
11834
11853
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
11835
11854
|
referer: "https://creator.xiaohongshu.com/new/home?source=official"
|
|
@@ -11857,6 +11876,7 @@ const XhsSessionCheck = async (_task, params)=>{
|
|
|
11857
11876
|
return acc;
|
|
11858
11877
|
}, {});
|
|
11859
11878
|
const loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
|
|
11879
|
+
const baseInfoStart = Date.now();
|
|
11860
11880
|
const _baseInfo = http.api({
|
|
11861
11881
|
method: "get",
|
|
11862
11882
|
baseURL: "https://creator.xiaohongshu.com",
|
|
@@ -11866,7 +11886,28 @@ const XhsSessionCheck = async (_task, params)=>{
|
|
|
11866
11886
|
retries: 3,
|
|
11867
11887
|
retryDelay: 20,
|
|
11868
11888
|
timeout: 3000
|
|
11869
|
-
}).
|
|
11889
|
+
}).then((res)=>{
|
|
11890
|
+
logger?.info("[XhsSessionCheck] creator base 接口请求成功", {
|
|
11891
|
+
accountId: params.accountId,
|
|
11892
|
+
duration: Date.now() - baseInfoStart,
|
|
11893
|
+
code: res?.code,
|
|
11894
|
+
msg: res?.msg,
|
|
11895
|
+
proxyInfo: http.proxyInfo
|
|
11896
|
+
});
|
|
11897
|
+
return res;
|
|
11898
|
+
}).catch((e)=>{
|
|
11899
|
+
logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
|
|
11900
|
+
accountId: params.accountId,
|
|
11901
|
+
duration: Date.now() - baseInfoStart,
|
|
11902
|
+
code: e?.code,
|
|
11903
|
+
message: e?.message,
|
|
11904
|
+
data: e?.data,
|
|
11905
|
+
extra: e?.extra,
|
|
11906
|
+
proxyInfo: http.proxyInfo
|
|
11907
|
+
});
|
|
11908
|
+
return e.data;
|
|
11909
|
+
});
|
|
11910
|
+
const webSessionStart = Date.now();
|
|
11870
11911
|
const _web_session = http.api({
|
|
11871
11912
|
method: "get",
|
|
11872
11913
|
url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
|
|
@@ -11874,6 +11915,26 @@ const XhsSessionCheck = async (_task, params)=>{
|
|
|
11874
11915
|
retries: 3,
|
|
11875
11916
|
retryDelay: 20,
|
|
11876
11917
|
timeout: 3000
|
|
11918
|
+
}).then((res)=>{
|
|
11919
|
+
logger?.info("[XhsSessionCheck] edith unread_count 接口请求成功", {
|
|
11920
|
+
accountId: params.accountId,
|
|
11921
|
+
duration: Date.now() - webSessionStart,
|
|
11922
|
+
code: res?.code,
|
|
11923
|
+
msg: res?.msg,
|
|
11924
|
+
proxyInfo: http.proxyInfo
|
|
11925
|
+
});
|
|
11926
|
+
return res;
|
|
11927
|
+
}).catch((e)=>{
|
|
11928
|
+
logger?.warn("[XhsSessionCheck] edith unread_count 接口请求失败", {
|
|
11929
|
+
accountId: params.accountId,
|
|
11930
|
+
duration: Date.now() - webSessionStart,
|
|
11931
|
+
code: e?.code,
|
|
11932
|
+
message: e?.message,
|
|
11933
|
+
data: e?.data,
|
|
11934
|
+
extra: e?.extra,
|
|
11935
|
+
proxyInfo: http.proxyInfo
|
|
11936
|
+
});
|
|
11937
|
+
throw e;
|
|
11877
11938
|
});
|
|
11878
11939
|
const [baseInfo, web_session] = await Promise.all([
|
|
11879
11940
|
_baseInfo,
|
|
@@ -11881,8 +11942,18 @@ const XhsSessionCheck = async (_task, params)=>{
|
|
|
11881
11942
|
]);
|
|
11882
11943
|
if (baseInfo?.code === 0) check.isValidSession = true;
|
|
11883
11944
|
if (0 === web_session.code) check.isValidWebSession = true;
|
|
11884
|
-
baseInfo?.code
|
|
11945
|
+
const _isSuccess = baseInfo?.code === web_session.code;
|
|
11885
11946
|
const message = `小红书账号有效性检测成功${_task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
11947
|
+
logger?.info("[XhsSessionCheck] 检测完成", {
|
|
11948
|
+
accountId: params.accountId,
|
|
11949
|
+
totalDuration: Date.now() - startedAt,
|
|
11950
|
+
baseInfoCode: baseInfo?.code,
|
|
11951
|
+
webSessionCode: web_session?.code,
|
|
11952
|
+
isValidSession: check.isValidSession,
|
|
11953
|
+
isValidWebSession: check.isValidWebSession,
|
|
11954
|
+
codeAligned: _isSuccess,
|
|
11955
|
+
proxyInfo: http.proxyInfo
|
|
11956
|
+
});
|
|
11886
11957
|
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(check, message);
|
|
11887
11958
|
};
|
|
11888
11959
|
const BjhSessionCheck = async (_task, params)=>{
|
|
@@ -14411,7 +14482,10 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14411
14482
|
task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
14412
14483
|
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
14413
14484
|
if (needsVerification(decision)) {
|
|
14414
|
-
task.logger.
|
|
14485
|
+
task.logger.warn(`检测到需要验证: ${JSON.stringify(decision)}`);
|
|
14486
|
+
task.logger.warn(`验证类型: ${decision?.verify_ways?.join(", ")}`);
|
|
14487
|
+
task.logger.warn(`验证标题: ${decision?.verify_title}`);
|
|
14488
|
+
task.logger.warn(`验证描述: ${decision?.verify_desc}`);
|
|
14415
14489
|
return;
|
|
14416
14490
|
}
|
|
14417
14491
|
if (!response || !response.data) return;
|
|
@@ -14438,38 +14512,105 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14438
14512
|
});
|
|
14439
14513
|
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, message, data);
|
|
14440
14514
|
}
|
|
14441
|
-
|
|
14515
|
+
let webProtectData;
|
|
14516
|
+
try {
|
|
14517
|
+
webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
|
|
14518
|
+
if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
|
|
14519
|
+
task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
|
|
14520
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
|
|
14521
|
+
}
|
|
14522
|
+
} catch (error) {
|
|
14523
|
+
task.logger.error(`解析 webProtectData 失败: ${error}`);
|
|
14524
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
|
|
14525
|
+
}
|
|
14442
14526
|
const ticket = webProtectData.ticket;
|
|
14443
14527
|
const ts_sign = webProtectData.ts_sign;
|
|
14444
|
-
|
|
14445
|
-
|
|
14528
|
+
let ec_privateKey;
|
|
14529
|
+
try {
|
|
14530
|
+
ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
|
|
14531
|
+
if (!ec_privateKey) {
|
|
14532
|
+
task.logger.error("ec_privateKey 为空");
|
|
14533
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
|
|
14534
|
+
}
|
|
14535
|
+
} catch (error) {
|
|
14536
|
+
task.logger.error(`解析 ec_privateKey 失败: ${error}`);
|
|
14537
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
|
|
14538
|
+
}
|
|
14539
|
+
let certificate;
|
|
14540
|
+
try {
|
|
14541
|
+
certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
|
|
14542
|
+
if (!certificate) {
|
|
14543
|
+
task.logger.error("certificate 为空");
|
|
14544
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
|
|
14545
|
+
}
|
|
14546
|
+
} catch (error) {
|
|
14547
|
+
task.logger.error(`解析 certificate 失败: ${error}`);
|
|
14548
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
|
|
14549
|
+
}
|
|
14446
14550
|
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
14447
|
-
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket
|
|
14448
|
-
|
|
14449
|
-
|
|
14450
|
-
|
|
14451
|
-
|
|
14452
|
-
|
|
14453
|
-
|
|
14454
|
-
|
|
14455
|
-
|
|
14456
|
-
|
|
14457
|
-
|
|
14551
|
+
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket?.substring(0, 20)}..., ts_sign: ${ts_sign}, ree_public_key: ${ree_public_key?.substring(0, 20)}...`);
|
|
14552
|
+
let bdTicketGuardClientData;
|
|
14553
|
+
try {
|
|
14554
|
+
bdTicketGuardClientData = getBdV2({
|
|
14555
|
+
ticket,
|
|
14556
|
+
ts_sign: ts_sign,
|
|
14557
|
+
ec_privateKey: ec_privateKey,
|
|
14558
|
+
certificate: certificate,
|
|
14559
|
+
bd_ticket_guard_ree_public_key: ree_public_key
|
|
14560
|
+
});
|
|
14561
|
+
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
14562
|
+
task.logger.error(`bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
14563
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
14564
|
+
}
|
|
14565
|
+
} catch (error) {
|
|
14566
|
+
task.logger.error(`生成 bdTicketGuardClientData 失败: ${error}`);
|
|
14567
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
|
|
14568
|
+
}
|
|
14569
|
+
task.logger.info("bdTicketGuardClientData 生成成功");
|
|
14458
14570
|
const publishQuery = {
|
|
14459
14571
|
...publishParams,
|
|
14460
14572
|
a_bogus: ""
|
|
14461
14573
|
};
|
|
14462
14574
|
const queryString = new URLSearchParams(publishQuery).toString();
|
|
14463
|
-
|
|
14575
|
+
let aBogus;
|
|
14576
|
+
try {
|
|
14577
|
+
aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
|
|
14578
|
+
if (!aBogus || aBogus.length < 10) {
|
|
14579
|
+
task.logger.error(`a_bogus 生成异常,长度过短: ${aBogus}`);
|
|
14580
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
|
|
14581
|
+
}
|
|
14582
|
+
task.logger.info(`a_bogus 生成成功: ${aBogus.substring(0, 20)}...`);
|
|
14583
|
+
} catch (error) {
|
|
14584
|
+
task.logger.error(`生成 a_bogus 失败: ${error}`);
|
|
14585
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
|
|
14586
|
+
}
|
|
14464
14587
|
publishQuery.a_bogus = aBogus;
|
|
14465
14588
|
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
14466
|
-
|
|
14467
|
-
|
|
14468
|
-
|
|
14469
|
-
|
|
14470
|
-
|
|
14471
|
-
|
|
14472
|
-
|
|
14589
|
+
let csrfToken;
|
|
14590
|
+
try {
|
|
14591
|
+
csrfToken = mock_generateCsrfTokenAdvanced({
|
|
14592
|
+
cookies: params.cookies,
|
|
14593
|
+
url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
|
|
14594
|
+
method: "POST",
|
|
14595
|
+
userAgent
|
|
14596
|
+
});
|
|
14597
|
+
if (!csrfToken || csrfToken.length < 10) {
|
|
14598
|
+
task.logger.error(`csrfToken 生成异常,长度过短: ${csrfToken}`);
|
|
14599
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
|
|
14600
|
+
}
|
|
14601
|
+
task.logger.info(`csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
|
|
14602
|
+
} catch (error) {
|
|
14603
|
+
task.logger.error(`生成 csrfToken 失败: ${error}`);
|
|
14604
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
|
|
14605
|
+
}
|
|
14606
|
+
let sessionDtrait;
|
|
14607
|
+
try {
|
|
14608
|
+
sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
|
|
14609
|
+
task.logger.info(`sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
|
|
14610
|
+
} catch (error) {
|
|
14611
|
+
task.logger.error(`生成 sessionDtrait 失败: ${error}`);
|
|
14612
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
|
|
14613
|
+
}
|
|
14473
14614
|
task.logger.info("发布数据", {
|
|
14474
14615
|
data: JSON.stringify(publishData)
|
|
14475
14616
|
});
|
|
@@ -14514,19 +14655,28 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14514
14655
|
task.logger.info("========== api调用完成 ==========");
|
|
14515
14656
|
task.logger.info(`decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
|
|
14516
14657
|
if (needsVerification(decision)) {
|
|
14658
|
+
const details = [
|
|
14659
|
+
publishResult.status_msg,
|
|
14660
|
+
decision?.verify_title,
|
|
14661
|
+
decision?.verify_desc
|
|
14662
|
+
].filter(Boolean).join(" ");
|
|
14663
|
+
const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
14517
14664
|
task.logger.warn(`TaskId:${task.taskId},检测到需要验证,准备返回验证信息`);
|
|
14518
|
-
|
|
14519
|
-
|
|
14665
|
+
let decisionObj = {};
|
|
14666
|
+
if (decision) decisionObj = decision;
|
|
14667
|
+
const mockData = {
|
|
14668
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
14669
|
+
error: message,
|
|
14520
14670
|
result: {
|
|
14521
|
-
|
|
14671
|
+
...decisionObj,
|
|
14672
|
+
data: decision,
|
|
14673
|
+
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
14522
14674
|
}
|
|
14523
|
-
}
|
|
14524
|
-
|
|
14675
|
+
};
|
|
14676
|
+
await updateTaskState?.(mockData);
|
|
14525
14677
|
return {
|
|
14526
14678
|
code: 0,
|
|
14527
|
-
data:
|
|
14528
|
-
result: decision
|
|
14529
|
-
},
|
|
14679
|
+
data: mockData,
|
|
14530
14680
|
message: "操作成功"
|
|
14531
14681
|
};
|
|
14532
14682
|
}
|
|
@@ -14548,10 +14698,13 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14548
14698
|
const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
14549
14699
|
const data = isSuccess ? publishResult.item_id || "" : "";
|
|
14550
14700
|
if (!isSuccess) {
|
|
14701
|
+
let decisionObj = {};
|
|
14702
|
+
if (decision) decisionObj = decision;
|
|
14551
14703
|
await updateTaskState?.({
|
|
14552
14704
|
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
14553
14705
|
error: message,
|
|
14554
14706
|
result: {
|
|
14707
|
+
...decisionObj,
|
|
14555
14708
|
data: decision,
|
|
14556
14709
|
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
14557
14710
|
}
|
|
@@ -15226,15 +15379,41 @@ const rpaAction_Server = async (task, params)=>{
|
|
|
15226
15379
|
}
|
|
15227
15380
|
task.logger?.info("准备发布...");
|
|
15228
15381
|
await page.waitForTimeout(1000);
|
|
15229
|
-
const
|
|
15382
|
+
const result = await new Promise((resolve, reject)=>{
|
|
15230
15383
|
const handleResponse = async (res)=>{
|
|
15231
15384
|
if (res.url().includes("/web/api/media/aweme/create_v2")) {
|
|
15232
15385
|
task.logger?.info("匹配到发布接口响应");
|
|
15386
|
+
let decision = null;
|
|
15387
|
+
try {
|
|
15388
|
+
const headers = await res.allHeaders();
|
|
15389
|
+
decision = parseVerifyPassportDecision(headers["x-tt-verify-passport-decision"]);
|
|
15390
|
+
} catch (error) {
|
|
15391
|
+
task.logger?.warn(`解析验证决策头失败: ${error}`);
|
|
15392
|
+
}
|
|
15233
15393
|
const jsonResponse = await res.json();
|
|
15234
15394
|
task.logger?.info(`发布接口响应数据: ${JSON.stringify(jsonResponse)}`);
|
|
15235
15395
|
page.off("response", handleResponse);
|
|
15236
|
-
if (
|
|
15237
|
-
|
|
15396
|
+
if (needsVerification(decision)) {
|
|
15397
|
+
task.logger?.warn("检测到需要二次验证,文章未真正发布");
|
|
15398
|
+
resolve({
|
|
15399
|
+
itemId: "",
|
|
15400
|
+
decision
|
|
15401
|
+
});
|
|
15402
|
+
return;
|
|
15403
|
+
}
|
|
15404
|
+
if (jsonResponse?.status_code !== 0) {
|
|
15405
|
+
reject(new Error(jsonResponse?.status_msg || "发布失败"));
|
|
15406
|
+
return;
|
|
15407
|
+
}
|
|
15408
|
+
const itemId = jsonResponse?.data?.item_id || jsonResponse?.item_id || "";
|
|
15409
|
+
if (!itemId) {
|
|
15410
|
+
reject(new Error(jsonResponse?.status_msg || "发布异常:未返回作品ID,文章可能未真正发布"));
|
|
15411
|
+
return;
|
|
15412
|
+
}
|
|
15413
|
+
resolve({
|
|
15414
|
+
itemId,
|
|
15415
|
+
decision: null
|
|
15416
|
+
});
|
|
15238
15417
|
}
|
|
15239
15418
|
};
|
|
15240
15419
|
page.on("response", handleResponse);
|
|
@@ -15256,20 +15435,42 @@ const rpaAction_Server = async (task, params)=>{
|
|
|
15256
15435
|
await page.close();
|
|
15257
15436
|
return null;
|
|
15258
15437
|
});
|
|
15259
|
-
if (!
|
|
15438
|
+
if (!result) return {
|
|
15260
15439
|
code: 414,
|
|
15261
15440
|
message: "发布失败",
|
|
15262
15441
|
data: ""
|
|
15263
15442
|
};
|
|
15264
|
-
|
|
15443
|
+
if (needsVerification(result.decision)) {
|
|
15444
|
+
const decision = result.decision;
|
|
15445
|
+
const details = [
|
|
15446
|
+
decision?.verify_title,
|
|
15447
|
+
decision?.verify_desc
|
|
15448
|
+
].filter(Boolean).join(" ");
|
|
15449
|
+
const message = `发布失败,需要二次验证${details ? `:${details}` : ""}`;
|
|
15450
|
+
task.logger?.warn(message);
|
|
15451
|
+
await updateTaskState?.({
|
|
15452
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
15453
|
+
error: message,
|
|
15454
|
+
result: {
|
|
15455
|
+
data: decision
|
|
15456
|
+
}
|
|
15457
|
+
});
|
|
15458
|
+
await page.close();
|
|
15459
|
+
return {
|
|
15460
|
+
code: 414,
|
|
15461
|
+
message,
|
|
15462
|
+
data: ""
|
|
15463
|
+
};
|
|
15464
|
+
}
|
|
15465
|
+
task.logger?.info(`✓ 发布成功,item_id: ${result.itemId}`);
|
|
15265
15466
|
await updateTaskState?.({
|
|
15266
15467
|
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
|
|
15267
15468
|
result: {
|
|
15268
|
-
response
|
|
15469
|
+
response: result.itemId
|
|
15269
15470
|
}
|
|
15270
15471
|
});
|
|
15271
15472
|
await page.close();
|
|
15272
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(
|
|
15473
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(result.itemId);
|
|
15273
15474
|
};
|
|
15274
15475
|
const DouyinPublishParamsSchema = ActionCommonParamsSchema.extend({
|
|
15275
15476
|
title: schemas_string(),
|
|
@@ -16049,26 +16250,26 @@ async function getToutiaoData(_task, params) {
|
|
|
16049
16250
|
const http = new Http({
|
|
16050
16251
|
headers: {
|
|
16051
16252
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
16052
|
-
referer: "https://mp.toutiao.com/profile_v4/graphic/publish"
|
|
16253
|
+
referer: "https://mp.toutiao.com/profile_v4/graphic/publish",
|
|
16254
|
+
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
|
|
16255
|
+
}
|
|
16256
|
+
});
|
|
16257
|
+
const totalData = await http.api({
|
|
16258
|
+
method: "get",
|
|
16259
|
+
url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
|
|
16260
|
+
params: {
|
|
16261
|
+
app_id: 1231
|
|
16262
|
+
}
|
|
16263
|
+
});
|
|
16264
|
+
await new Promise((r)=>setTimeout(r, 1000));
|
|
16265
|
+
const contentDataYesterday = await http.api({
|
|
16266
|
+
method: "get",
|
|
16267
|
+
url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
|
|
16268
|
+
params: {
|
|
16269
|
+
type: 0,
|
|
16270
|
+
app_id: 1231
|
|
16053
16271
|
}
|
|
16054
16272
|
});
|
|
16055
|
-
const [totalData, contentDataYesterday] = await Promise.all([
|
|
16056
|
-
http.api({
|
|
16057
|
-
method: "get",
|
|
16058
|
-
url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
|
|
16059
|
-
params: {
|
|
16060
|
-
app_id: 1231
|
|
16061
|
-
}
|
|
16062
|
-
}),
|
|
16063
|
-
http.api({
|
|
16064
|
-
method: "get",
|
|
16065
|
-
url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
|
|
16066
|
-
params: {
|
|
16067
|
-
type: 0,
|
|
16068
|
-
app_id: 1231
|
|
16069
|
-
}
|
|
16070
|
-
})
|
|
16071
|
-
]);
|
|
16072
16273
|
const isSuccess = !!(totalData?.data?.statistic && contentDataYesterday?.author_stat);
|
|
16073
16274
|
if (!isSuccess || !totalData?.data || !contentDataYesterday?.author_stat) return types_errorResponse(totalData?.message || contentDataYesterday?.message || "头条号数据获取失败,请检查Cookie是否有效", 414);
|
|
16074
16275
|
const ttData = {
|
|
@@ -20241,8 +20442,10 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
20241
20442
|
tuwen_wtt_trans_flag: params.settingInfo?.toutiaoTransWtt ? "2" : "0",
|
|
20242
20443
|
info_source: sourceData,
|
|
20243
20444
|
...location ? {
|
|
20244
|
-
|
|
20245
|
-
|
|
20445
|
+
manual_selected_city: JSON.stringify({
|
|
20446
|
+
city: location.label,
|
|
20447
|
+
city_code: location.value
|
|
20448
|
+
})
|
|
20246
20449
|
} : null,
|
|
20247
20450
|
...params.settingInfo?.toutiaoCollectionId ? {
|
|
20248
20451
|
want_join_collection_id: params.settingInfo.toutiaoCollectionId
|
|
@@ -20292,6 +20495,12 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
20292
20495
|
claim_exclusive: toutiaoExclusive ? toutiaoExclusive : toutiaoOriginal?.includes("exclusive") ? 1 : 0
|
|
20293
20496
|
};
|
|
20294
20497
|
task._timerRecord.PrePublish = Date.now();
|
|
20498
|
+
task.logger.info(`[toutiaoPublish] ${"draft" === params.saveType ? "同步草稿" : "发布文章"}参数`, {
|
|
20499
|
+
saveType: params.saveType,
|
|
20500
|
+
title: params.title,
|
|
20501
|
+
extra: extraData,
|
|
20502
|
+
publishData
|
|
20503
|
+
});
|
|
20295
20504
|
const msToken = params.cookies.find((it)=>"msToken" === it.name)?.value;
|
|
20296
20505
|
let publishOption = {};
|
|
20297
20506
|
if (msToken) {
|
|
@@ -21487,8 +21696,8 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
|
|
|
21487
21696
|
headers
|
|
21488
21697
|
});
|
|
21489
21698
|
const proxyHttp = new Http(...args);
|
|
21490
|
-
|
|
21491
|
-
const responseData = response
|
|
21699
|
+
const baseRespFinder = (response)=>{
|
|
21700
|
+
const responseData = response?.data;
|
|
21492
21701
|
const msgType = "draft" === params.saveType ? "同步" : "发布";
|
|
21493
21702
|
if (response && responseData?.base_resp && 0 !== responseData.base_resp.ret && !ignoreErrno.includes(responseData.base_resp.ret)) {
|
|
21494
21703
|
const errmsg = weixinPublish_mock_errnoMap[responseData.base_resp.ret] || response.config.defaultErrorMsg || responseData.base_resp.err_msg || `文章${msgType}异常,请稍后重试。`;
|
|
@@ -21498,7 +21707,9 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
|
|
|
21498
21707
|
data: responseData
|
|
21499
21708
|
};
|
|
21500
21709
|
}
|
|
21501
|
-
}
|
|
21710
|
+
};
|
|
21711
|
+
http.addResponseInterceptor(baseRespFinder);
|
|
21712
|
+
proxyHttp.addResponseInterceptor(baseRespFinder);
|
|
21502
21713
|
await http.api({
|
|
21503
21714
|
method: "get",
|
|
21504
21715
|
url: "https://mp.weixin.qq.com/cgi-bin/appmsgpublish",
|