@iflyrpa/actions 4.0.0-beta.1 → 4.0.0-beta.12
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 +326 -87
- package/dist/bundle.js.map +1 -1
- package/dist/index.js +294 -72
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +294 -72
- 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.11"}');
|
|
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,116 @@ 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
|
-
|
|
14442
|
-
|
|
14443
|
-
|
|
14444
|
-
|
|
14445
|
-
|
|
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
|
+
}
|
|
14526
|
+
let ticket = webProtectData.ticket;
|
|
14527
|
+
let ts_sign = webProtectData.ts_sign;
|
|
14528
|
+
const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
|
|
14529
|
+
if (serverDataCookie) try {
|
|
14530
|
+
const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
|
|
14531
|
+
if (decoded.ticket && decoded.ts_sign) {
|
|
14532
|
+
if (decoded.ticket !== ticket) task.logger.info("使用 cookie 中的最新 ticket(web_protect 已过期)");
|
|
14533
|
+
ticket = decoded.ticket;
|
|
14534
|
+
ts_sign = decoded.ts_sign;
|
|
14535
|
+
}
|
|
14536
|
+
} catch (error) {
|
|
14537
|
+
task.logger.warn(`解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
|
|
14538
|
+
}
|
|
14539
|
+
let ec_privateKey;
|
|
14540
|
+
try {
|
|
14541
|
+
ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
|
|
14542
|
+
if (!ec_privateKey) {
|
|
14543
|
+
task.logger.error("ec_privateKey 为空");
|
|
14544
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
|
|
14545
|
+
}
|
|
14546
|
+
} catch (error) {
|
|
14547
|
+
task.logger.error(`解析 ec_privateKey 失败: ${error}`);
|
|
14548
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
|
|
14549
|
+
}
|
|
14550
|
+
let certificate;
|
|
14551
|
+
try {
|
|
14552
|
+
certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
|
|
14553
|
+
if (!certificate) {
|
|
14554
|
+
task.logger.error("certificate 为空");
|
|
14555
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
|
|
14556
|
+
}
|
|
14557
|
+
} catch (error) {
|
|
14558
|
+
task.logger.error(`解析 certificate 失败: ${error}`);
|
|
14559
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
|
|
14560
|
+
}
|
|
14446
14561
|
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
|
-
|
|
14562
|
+
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket?.substring(0, 20)}..., ts_sign: ${ts_sign}, ree_public_key: ${ree_public_key?.substring(0, 20)}...`);
|
|
14563
|
+
let bdTicketGuardClientData;
|
|
14564
|
+
try {
|
|
14565
|
+
bdTicketGuardClientData = getBdV2({
|
|
14566
|
+
ticket,
|
|
14567
|
+
ts_sign: ts_sign,
|
|
14568
|
+
ec_privateKey: ec_privateKey,
|
|
14569
|
+
certificate: certificate,
|
|
14570
|
+
bd_ticket_guard_ree_public_key: ree_public_key
|
|
14571
|
+
});
|
|
14572
|
+
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
14573
|
+
task.logger.error(`bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
14574
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
14575
|
+
}
|
|
14576
|
+
} catch (error) {
|
|
14577
|
+
task.logger.error(`生成 bdTicketGuardClientData 失败: ${error}`);
|
|
14578
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
|
|
14579
|
+
}
|
|
14580
|
+
task.logger.info("bdTicketGuardClientData 生成成功");
|
|
14458
14581
|
const publishQuery = {
|
|
14459
14582
|
...publishParams,
|
|
14460
14583
|
a_bogus: ""
|
|
14461
14584
|
};
|
|
14462
14585
|
const queryString = new URLSearchParams(publishQuery).toString();
|
|
14463
|
-
|
|
14586
|
+
let aBogus;
|
|
14587
|
+
try {
|
|
14588
|
+
aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
|
|
14589
|
+
if (!aBogus || aBogus.length < 10) {
|
|
14590
|
+
task.logger.error(`a_bogus 生成异常,长度过短: ${aBogus}`);
|
|
14591
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
|
|
14592
|
+
}
|
|
14593
|
+
task.logger.info(`a_bogus 生成成功: ${aBogus.substring(0, 20)}...`);
|
|
14594
|
+
} catch (error) {
|
|
14595
|
+
task.logger.error(`生成 a_bogus 失败: ${error}`);
|
|
14596
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
|
|
14597
|
+
}
|
|
14464
14598
|
publishQuery.a_bogus = aBogus;
|
|
14465
14599
|
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
14466
|
-
|
|
14467
|
-
|
|
14468
|
-
|
|
14469
|
-
|
|
14470
|
-
|
|
14471
|
-
|
|
14472
|
-
|
|
14600
|
+
let csrfToken;
|
|
14601
|
+
try {
|
|
14602
|
+
csrfToken = mock_generateCsrfTokenAdvanced({
|
|
14603
|
+
cookies: params.cookies,
|
|
14604
|
+
url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
|
|
14605
|
+
method: "POST",
|
|
14606
|
+
userAgent
|
|
14607
|
+
});
|
|
14608
|
+
if (!csrfToken || csrfToken.length < 10) {
|
|
14609
|
+
task.logger.error(`csrfToken 生成异常,长度过短: ${csrfToken}`);
|
|
14610
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
|
|
14611
|
+
}
|
|
14612
|
+
task.logger.info(`csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
|
|
14613
|
+
} catch (error) {
|
|
14614
|
+
task.logger.error(`生成 csrfToken 失败: ${error}`);
|
|
14615
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
|
|
14616
|
+
}
|
|
14617
|
+
let sessionDtrait;
|
|
14618
|
+
try {
|
|
14619
|
+
sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
|
|
14620
|
+
task.logger.info(`sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
|
|
14621
|
+
} catch (error) {
|
|
14622
|
+
task.logger.error(`生成 sessionDtrait 失败: ${error}`);
|
|
14623
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
|
|
14624
|
+
}
|
|
14473
14625
|
task.logger.info("发布数据", {
|
|
14474
14626
|
data: JSON.stringify(publishData)
|
|
14475
14627
|
});
|
|
@@ -14514,19 +14666,28 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14514
14666
|
task.logger.info("========== api调用完成 ==========");
|
|
14515
14667
|
task.logger.info(`decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
|
|
14516
14668
|
if (needsVerification(decision)) {
|
|
14669
|
+
const details = [
|
|
14670
|
+
publishResult.status_msg,
|
|
14671
|
+
decision?.verify_title,
|
|
14672
|
+
decision?.verify_desc
|
|
14673
|
+
].filter(Boolean).join(" ");
|
|
14674
|
+
const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
14517
14675
|
task.logger.warn(`TaskId:${task.taskId},检测到需要验证,准备返回验证信息`);
|
|
14518
|
-
|
|
14519
|
-
|
|
14676
|
+
let decisionObj = {};
|
|
14677
|
+
if (decision) decisionObj = decision;
|
|
14678
|
+
const mockData = {
|
|
14679
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
14680
|
+
error: message,
|
|
14520
14681
|
result: {
|
|
14521
|
-
|
|
14682
|
+
...decisionObj,
|
|
14683
|
+
data: decision,
|
|
14684
|
+
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
14522
14685
|
}
|
|
14523
|
-
}
|
|
14524
|
-
|
|
14686
|
+
};
|
|
14687
|
+
await updateTaskState?.(mockData);
|
|
14525
14688
|
return {
|
|
14526
14689
|
code: 0,
|
|
14527
|
-
data:
|
|
14528
|
-
result: decision
|
|
14529
|
-
},
|
|
14690
|
+
data: mockData,
|
|
14530
14691
|
message: "操作成功"
|
|
14531
14692
|
};
|
|
14532
14693
|
}
|
|
@@ -14548,10 +14709,13 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14548
14709
|
const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
14549
14710
|
const data = isSuccess ? publishResult.item_id || "" : "";
|
|
14550
14711
|
if (!isSuccess) {
|
|
14712
|
+
let decisionObj = {};
|
|
14713
|
+
if (decision) decisionObj = decision;
|
|
14551
14714
|
await updateTaskState?.({
|
|
14552
14715
|
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
14553
14716
|
error: message,
|
|
14554
14717
|
result: {
|
|
14718
|
+
...decisionObj,
|
|
14555
14719
|
data: decision,
|
|
14556
14720
|
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
14557
14721
|
}
|
|
@@ -15226,15 +15390,41 @@ const rpaAction_Server = async (task, params)=>{
|
|
|
15226
15390
|
}
|
|
15227
15391
|
task.logger?.info("准备发布...");
|
|
15228
15392
|
await page.waitForTimeout(1000);
|
|
15229
|
-
const
|
|
15393
|
+
const result = await new Promise((resolve, reject)=>{
|
|
15230
15394
|
const handleResponse = async (res)=>{
|
|
15231
15395
|
if (res.url().includes("/web/api/media/aweme/create_v2")) {
|
|
15232
15396
|
task.logger?.info("匹配到发布接口响应");
|
|
15397
|
+
let decision = null;
|
|
15398
|
+
try {
|
|
15399
|
+
const headers = await res.allHeaders();
|
|
15400
|
+
decision = parseVerifyPassportDecision(headers["x-tt-verify-passport-decision"]);
|
|
15401
|
+
} catch (error) {
|
|
15402
|
+
task.logger?.warn(`解析验证决策头失败: ${error}`);
|
|
15403
|
+
}
|
|
15233
15404
|
const jsonResponse = await res.json();
|
|
15234
15405
|
task.logger?.info(`发布接口响应数据: ${JSON.stringify(jsonResponse)}`);
|
|
15235
15406
|
page.off("response", handleResponse);
|
|
15236
|
-
if (
|
|
15237
|
-
|
|
15407
|
+
if (needsVerification(decision)) {
|
|
15408
|
+
task.logger?.warn("检测到需要二次验证,文章未真正发布");
|
|
15409
|
+
resolve({
|
|
15410
|
+
itemId: "",
|
|
15411
|
+
decision
|
|
15412
|
+
});
|
|
15413
|
+
return;
|
|
15414
|
+
}
|
|
15415
|
+
if (jsonResponse?.status_code !== 0) {
|
|
15416
|
+
reject(new Error(jsonResponse?.status_msg || "发布失败"));
|
|
15417
|
+
return;
|
|
15418
|
+
}
|
|
15419
|
+
const itemId = jsonResponse?.data?.item_id || jsonResponse?.item_id || "";
|
|
15420
|
+
if (!itemId) {
|
|
15421
|
+
reject(new Error(jsonResponse?.status_msg || "发布异常:未返回作品ID,文章可能未真正发布"));
|
|
15422
|
+
return;
|
|
15423
|
+
}
|
|
15424
|
+
resolve({
|
|
15425
|
+
itemId,
|
|
15426
|
+
decision: null
|
|
15427
|
+
});
|
|
15238
15428
|
}
|
|
15239
15429
|
};
|
|
15240
15430
|
page.on("response", handleResponse);
|
|
@@ -15256,20 +15446,42 @@ const rpaAction_Server = async (task, params)=>{
|
|
|
15256
15446
|
await page.close();
|
|
15257
15447
|
return null;
|
|
15258
15448
|
});
|
|
15259
|
-
if (!
|
|
15449
|
+
if (!result) return {
|
|
15260
15450
|
code: 414,
|
|
15261
15451
|
message: "发布失败",
|
|
15262
15452
|
data: ""
|
|
15263
15453
|
};
|
|
15264
|
-
|
|
15454
|
+
if (needsVerification(result.decision)) {
|
|
15455
|
+
const decision = result.decision;
|
|
15456
|
+
const details = [
|
|
15457
|
+
decision?.verify_title,
|
|
15458
|
+
decision?.verify_desc
|
|
15459
|
+
].filter(Boolean).join(" ");
|
|
15460
|
+
const message = `发布失败,需要二次验证${details ? `:${details}` : ""}`;
|
|
15461
|
+
task.logger?.warn(message);
|
|
15462
|
+
await updateTaskState?.({
|
|
15463
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
15464
|
+
error: message,
|
|
15465
|
+
result: {
|
|
15466
|
+
data: decision
|
|
15467
|
+
}
|
|
15468
|
+
});
|
|
15469
|
+
await page.close();
|
|
15470
|
+
return {
|
|
15471
|
+
code: 414,
|
|
15472
|
+
message,
|
|
15473
|
+
data: ""
|
|
15474
|
+
};
|
|
15475
|
+
}
|
|
15476
|
+
task.logger?.info(`✓ 发布成功,item_id: ${result.itemId}`);
|
|
15265
15477
|
await updateTaskState?.({
|
|
15266
15478
|
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
|
|
15267
15479
|
result: {
|
|
15268
|
-
response
|
|
15480
|
+
response: result.itemId
|
|
15269
15481
|
}
|
|
15270
15482
|
});
|
|
15271
15483
|
await page.close();
|
|
15272
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(
|
|
15484
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(result.itemId);
|
|
15273
15485
|
};
|
|
15274
15486
|
const DouyinPublishParamsSchema = ActionCommonParamsSchema.extend({
|
|
15275
15487
|
title: schemas_string(),
|
|
@@ -16049,26 +16261,26 @@ async function getToutiaoData(_task, params) {
|
|
|
16049
16261
|
const http = new Http({
|
|
16050
16262
|
headers: {
|
|
16051
16263
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
16052
|
-
referer: "https://mp.toutiao.com/profile_v4/graphic/publish"
|
|
16264
|
+
referer: "https://mp.toutiao.com/profile_v4/graphic/publish",
|
|
16265
|
+
"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"
|
|
16266
|
+
}
|
|
16267
|
+
});
|
|
16268
|
+
const totalData = await http.api({
|
|
16269
|
+
method: "get",
|
|
16270
|
+
url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
|
|
16271
|
+
params: {
|
|
16272
|
+
app_id: 1231
|
|
16273
|
+
}
|
|
16274
|
+
});
|
|
16275
|
+
await new Promise((r)=>setTimeout(r, 1000));
|
|
16276
|
+
const contentDataYesterday = await http.api({
|
|
16277
|
+
method: "get",
|
|
16278
|
+
url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
|
|
16279
|
+
params: {
|
|
16280
|
+
type: 0,
|
|
16281
|
+
app_id: 1231
|
|
16053
16282
|
}
|
|
16054
16283
|
});
|
|
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
16284
|
const isSuccess = !!(totalData?.data?.statistic && contentDataYesterday?.author_stat);
|
|
16073
16285
|
if (!isSuccess || !totalData?.data || !contentDataYesterday?.author_stat) return types_errorResponse(totalData?.message || contentDataYesterday?.message || "头条号数据获取失败,请检查Cookie是否有效", 414);
|
|
16074
16286
|
const ttData = {
|
|
@@ -20241,8 +20453,10 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
20241
20453
|
tuwen_wtt_trans_flag: params.settingInfo?.toutiaoTransWtt ? "2" : "0",
|
|
20242
20454
|
info_source: sourceData,
|
|
20243
20455
|
...location ? {
|
|
20244
|
-
|
|
20245
|
-
|
|
20456
|
+
manual_selected_city: JSON.stringify({
|
|
20457
|
+
city: location.label,
|
|
20458
|
+
city_code: location.value
|
|
20459
|
+
})
|
|
20246
20460
|
} : null,
|
|
20247
20461
|
...params.settingInfo?.toutiaoCollectionId ? {
|
|
20248
20462
|
want_join_collection_id: params.settingInfo.toutiaoCollectionId
|
|
@@ -20292,6 +20506,12 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
20292
20506
|
claim_exclusive: toutiaoExclusive ? toutiaoExclusive : toutiaoOriginal?.includes("exclusive") ? 1 : 0
|
|
20293
20507
|
};
|
|
20294
20508
|
task._timerRecord.PrePublish = Date.now();
|
|
20509
|
+
task.logger.info(`[toutiaoPublish] ${"draft" === params.saveType ? "同步草稿" : "发布文章"}参数`, {
|
|
20510
|
+
saveType: params.saveType,
|
|
20511
|
+
title: params.title,
|
|
20512
|
+
extra: extraData,
|
|
20513
|
+
publishData
|
|
20514
|
+
});
|
|
20295
20515
|
const msToken = params.cookies.find((it)=>"msToken" === it.name)?.value;
|
|
20296
20516
|
let publishOption = {};
|
|
20297
20517
|
if (msToken) {
|
|
@@ -21487,8 +21707,8 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
|
|
|
21487
21707
|
headers
|
|
21488
21708
|
});
|
|
21489
21709
|
const proxyHttp = new Http(...args);
|
|
21490
|
-
|
|
21491
|
-
const responseData = response
|
|
21710
|
+
const baseRespFinder = (response)=>{
|
|
21711
|
+
const responseData = response?.data;
|
|
21492
21712
|
const msgType = "draft" === params.saveType ? "同步" : "发布";
|
|
21493
21713
|
if (response && responseData?.base_resp && 0 !== responseData.base_resp.ret && !ignoreErrno.includes(responseData.base_resp.ret)) {
|
|
21494
21714
|
const errmsg = weixinPublish_mock_errnoMap[responseData.base_resp.ret] || response.config.defaultErrorMsg || responseData.base_resp.err_msg || `文章${msgType}异常,请稍后重试。`;
|
|
@@ -21498,7 +21718,9 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
|
|
|
21498
21718
|
data: responseData
|
|
21499
21719
|
};
|
|
21500
21720
|
}
|
|
21501
|
-
}
|
|
21721
|
+
};
|
|
21722
|
+
http.addResponseInterceptor(baseRespFinder);
|
|
21723
|
+
proxyHttp.addResponseInterceptor(baseRespFinder);
|
|
21502
21724
|
await http.api({
|
|
21503
21725
|
method: "get",
|
|
21504
21726
|
url: "https://mp.weixin.qq.com/cgi-bin/appmsgpublish",
|