@iflyrpa/actions 4.0.0-beta.0 → 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 +332 -79
- package/dist/bundle.js.map +1 -1
- package/dist/index.js +300 -64
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +300 -64
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -5434,9 +5434,7 @@ function __webpack_require__(moduleId) {
|
|
|
5434
5434
|
return module;
|
|
5435
5435
|
};
|
|
5436
5436
|
})();
|
|
5437
|
-
var package_namespaceObject = {
|
|
5438
|
-
i8: "3.0.4"
|
|
5439
|
-
};
|
|
5437
|
+
var package_namespaceObject = JSON.parse('{"i8":"4.0.0-beta.9"}');
|
|
5440
5438
|
var dist = __webpack_require__("../../node_modules/.pnpm/https-proxy-agent@7.0.6/node_modules/https-proxy-agent/dist/index.js");
|
|
5441
5439
|
async function ProxyAgent(task, ip, adr, accountId, refresh) {
|
|
5442
5440
|
const http = new Http({
|
|
@@ -5526,6 +5524,13 @@ class Http {
|
|
|
5526
5524
|
}
|
|
5527
5525
|
};
|
|
5528
5526
|
if (foundError) Object.assign(errorResponse, foundError);
|
|
5527
|
+
if (error.response?.status === 403) {
|
|
5528
|
+
this.logger?.warn(`[403 详细信息] URL: ${error.config?.url}`);
|
|
5529
|
+
this.logger?.warn(`[403 响应头] ${JSON.stringify(error.response?.headers || {})}`);
|
|
5530
|
+
this.logger?.warn(`[403 响应体] ${JSON.stringify(error.response?.data || null)}`);
|
|
5531
|
+
const verifyDecision = error.response?.headers?.["x-tt-verify-passport-decision"];
|
|
5532
|
+
if (verifyDecision) this.logger?.warn(`[403 验证决策] x-tt-verify-passport-decision: ${verifyDecision}`);
|
|
5533
|
+
}
|
|
5529
5534
|
if (error.response?.data) {
|
|
5530
5535
|
if ("object" == typeof error.response.data) {
|
|
5531
5536
|
const serverError = error.response.data;
|
|
@@ -5617,7 +5622,7 @@ class Http {
|
|
|
5617
5622
|
599
|
|
5618
5623
|
].includes(handledError.code);
|
|
5619
5624
|
if (Rtimes < retries && isRetry) {
|
|
5620
|
-
this.logger?.info(`进入第${Rtimes + 1}
|
|
5625
|
+
this.logger?.info(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}`);
|
|
5621
5626
|
await new Promise((resolve)=>setTimeout(resolve, retryDelay));
|
|
5622
5627
|
return sessionRt(Rtimes + 1);
|
|
5623
5628
|
}
|
|
@@ -11815,16 +11820,35 @@ const WxSessionCheck = async (_task, params)=>{
|
|
|
11815
11820
|
}, "微信账号有效性检测完成!");
|
|
11816
11821
|
};
|
|
11817
11822
|
const XhsSessionCheck = async (_task, params)=>{
|
|
11823
|
+
const logger = _task.logger;
|
|
11824
|
+
const startedAt = Date.now();
|
|
11818
11825
|
const check = {
|
|
11819
11826
|
isValidSession: false,
|
|
11820
11827
|
isValidWebSession: false
|
|
11821
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
|
+
});
|
|
11822
11840
|
const a1Cookie = params.cookies.find((it)=>"a1" === it.name)?.value;
|
|
11823
|
-
if (!a1Cookie)
|
|
11824
|
-
|
|
11825
|
-
|
|
11826
|
-
|
|
11827
|
-
|
|
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
|
+
}
|
|
11828
11852
|
const headers = {
|
|
11829
11853
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
11830
11854
|
referer: "https://creator.xiaohongshu.com/new/home?source=official"
|
|
@@ -11852,6 +11876,7 @@ const XhsSessionCheck = async (_task, params)=>{
|
|
|
11852
11876
|
return acc;
|
|
11853
11877
|
}, {});
|
|
11854
11878
|
const loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
|
|
11879
|
+
const baseInfoStart = Date.now();
|
|
11855
11880
|
const _baseInfo = http.api({
|
|
11856
11881
|
method: "get",
|
|
11857
11882
|
baseURL: "https://creator.xiaohongshu.com",
|
|
@@ -11861,7 +11886,28 @@ const XhsSessionCheck = async (_task, params)=>{
|
|
|
11861
11886
|
retries: 3,
|
|
11862
11887
|
retryDelay: 20,
|
|
11863
11888
|
timeout: 3000
|
|
11864
|
-
}).
|
|
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();
|
|
11865
11911
|
const _web_session = http.api({
|
|
11866
11912
|
method: "get",
|
|
11867
11913
|
url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
|
|
@@ -11869,6 +11915,26 @@ const XhsSessionCheck = async (_task, params)=>{
|
|
|
11869
11915
|
retries: 3,
|
|
11870
11916
|
retryDelay: 20,
|
|
11871
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;
|
|
11872
11938
|
});
|
|
11873
11939
|
const [baseInfo, web_session] = await Promise.all([
|
|
11874
11940
|
_baseInfo,
|
|
@@ -11876,8 +11942,18 @@ const XhsSessionCheck = async (_task, params)=>{
|
|
|
11876
11942
|
]);
|
|
11877
11943
|
if (baseInfo?.code === 0) check.isValidSession = true;
|
|
11878
11944
|
if (0 === web_session.code) check.isValidWebSession = true;
|
|
11879
|
-
baseInfo?.code
|
|
11945
|
+
const _isSuccess = baseInfo?.code === web_session.code;
|
|
11880
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
|
+
});
|
|
11881
11957
|
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(check, message);
|
|
11882
11958
|
};
|
|
11883
11959
|
const BjhSessionCheck = async (_task, params)=>{
|
|
@@ -14406,7 +14482,10 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14406
14482
|
task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
14407
14483
|
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
14408
14484
|
if (needsVerification(decision)) {
|
|
14409
|
-
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}`);
|
|
14410
14489
|
return;
|
|
14411
14490
|
}
|
|
14412
14491
|
if (!response || !response.data) return;
|
|
@@ -14433,38 +14512,105 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14433
14512
|
});
|
|
14434
14513
|
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.response)(0, message, data);
|
|
14435
14514
|
}
|
|
14436
|
-
|
|
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
|
+
}
|
|
14437
14526
|
const ticket = webProtectData.ticket;
|
|
14438
14527
|
const ts_sign = webProtectData.ts_sign;
|
|
14439
|
-
|
|
14440
|
-
|
|
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
|
+
}
|
|
14441
14550
|
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
14442
|
-
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket
|
|
14443
|
-
|
|
14444
|
-
|
|
14445
|
-
|
|
14446
|
-
|
|
14447
|
-
|
|
14448
|
-
|
|
14449
|
-
|
|
14450
|
-
|
|
14451
|
-
|
|
14452
|
-
|
|
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 生成成功");
|
|
14453
14570
|
const publishQuery = {
|
|
14454
14571
|
...publishParams,
|
|
14455
14572
|
a_bogus: ""
|
|
14456
14573
|
};
|
|
14457
14574
|
const queryString = new URLSearchParams(publishQuery).toString();
|
|
14458
|
-
|
|
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
|
+
}
|
|
14459
14587
|
publishQuery.a_bogus = aBogus;
|
|
14460
14588
|
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
14461
|
-
|
|
14462
|
-
|
|
14463
|
-
|
|
14464
|
-
|
|
14465
|
-
|
|
14466
|
-
|
|
14467
|
-
|
|
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
|
+
}
|
|
14468
14614
|
task.logger.info("发布数据", {
|
|
14469
14615
|
data: JSON.stringify(publishData)
|
|
14470
14616
|
});
|
|
@@ -14506,6 +14652,35 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14506
14652
|
retries: 3,
|
|
14507
14653
|
retryDelay: 2000
|
|
14508
14654
|
});
|
|
14655
|
+
task.logger.info("========== api调用完成 ==========");
|
|
14656
|
+
task.logger.info(`decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
|
|
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}` : ""}`;
|
|
14664
|
+
task.logger.warn(`TaskId:${task.taskId},检测到需要验证,准备返回验证信息`);
|
|
14665
|
+
let decisionObj = {};
|
|
14666
|
+
if (decision) decisionObj = decision;
|
|
14667
|
+
const mockData = {
|
|
14668
|
+
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
14669
|
+
error: message,
|
|
14670
|
+
result: {
|
|
14671
|
+
...decisionObj,
|
|
14672
|
+
data: decision,
|
|
14673
|
+
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
14674
|
+
}
|
|
14675
|
+
};
|
|
14676
|
+
await updateTaskState?.(mockData);
|
|
14677
|
+
return {
|
|
14678
|
+
code: 0,
|
|
14679
|
+
data: mockData,
|
|
14680
|
+
message: "操作成功"
|
|
14681
|
+
};
|
|
14682
|
+
}
|
|
14683
|
+
task.logger.info("不需要验证,继续正常流程");
|
|
14509
14684
|
reportLogger({
|
|
14510
14685
|
token: params.huiwenToken || "",
|
|
14511
14686
|
enverionment: task.enverionment || "development",
|
|
@@ -14523,10 +14698,13 @@ const mock_mockAction = async (task, params)=>{
|
|
|
14523
14698
|
const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
14524
14699
|
const data = isSuccess ? publishResult.item_id || "" : "";
|
|
14525
14700
|
if (!isSuccess) {
|
|
14701
|
+
let decisionObj = {};
|
|
14702
|
+
if (decision) decisionObj = decision;
|
|
14526
14703
|
await updateTaskState?.({
|
|
14527
14704
|
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.FAILED,
|
|
14528
14705
|
error: message,
|
|
14529
14706
|
result: {
|
|
14707
|
+
...decisionObj,
|
|
14530
14708
|
data: decision,
|
|
14531
14709
|
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
14532
14710
|
}
|
|
@@ -15201,15 +15379,41 @@ const rpaAction_Server = async (task, params)=>{
|
|
|
15201
15379
|
}
|
|
15202
15380
|
task.logger?.info("准备发布...");
|
|
15203
15381
|
await page.waitForTimeout(1000);
|
|
15204
|
-
const
|
|
15382
|
+
const result = await new Promise((resolve, reject)=>{
|
|
15205
15383
|
const handleResponse = async (res)=>{
|
|
15206
15384
|
if (res.url().includes("/web/api/media/aweme/create_v2")) {
|
|
15207
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
|
+
}
|
|
15208
15393
|
const jsonResponse = await res.json();
|
|
15209
15394
|
task.logger?.info(`发布接口响应数据: ${JSON.stringify(jsonResponse)}`);
|
|
15210
15395
|
page.off("response", handleResponse);
|
|
15211
|
-
if (
|
|
15212
|
-
|
|
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
|
+
});
|
|
15213
15417
|
}
|
|
15214
15418
|
};
|
|
15215
15419
|
page.on("response", handleResponse);
|
|
@@ -15231,20 +15435,42 @@ const rpaAction_Server = async (task, params)=>{
|
|
|
15231
15435
|
await page.close();
|
|
15232
15436
|
return null;
|
|
15233
15437
|
});
|
|
15234
|
-
if (!
|
|
15438
|
+
if (!result) return {
|
|
15235
15439
|
code: 414,
|
|
15236
15440
|
message: "发布失败",
|
|
15237
15441
|
data: ""
|
|
15238
15442
|
};
|
|
15239
|
-
|
|
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}`);
|
|
15240
15466
|
await updateTaskState?.({
|
|
15241
15467
|
state: __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.TaskState.SUCCESS,
|
|
15242
15468
|
result: {
|
|
15243
|
-
response
|
|
15469
|
+
response: result.itemId
|
|
15244
15470
|
}
|
|
15245
15471
|
});
|
|
15246
15472
|
await page.close();
|
|
15247
|
-
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(
|
|
15473
|
+
return (0, __WEBPACK_EXTERNAL_MODULE__iflyrpa_share_f7afdc8c__.success)(result.itemId);
|
|
15248
15474
|
};
|
|
15249
15475
|
const DouyinPublishParamsSchema = ActionCommonParamsSchema.extend({
|
|
15250
15476
|
title: schemas_string(),
|
|
@@ -16024,26 +16250,26 @@ async function getToutiaoData(_task, params) {
|
|
|
16024
16250
|
const http = new Http({
|
|
16025
16251
|
headers: {
|
|
16026
16252
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
16027
|
-
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
|
|
16028
16271
|
}
|
|
16029
16272
|
});
|
|
16030
|
-
const [totalData, contentDataYesterday] = await Promise.all([
|
|
16031
|
-
http.api({
|
|
16032
|
-
method: "get",
|
|
16033
|
-
url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
|
|
16034
|
-
params: {
|
|
16035
|
-
app_id: 1231
|
|
16036
|
-
}
|
|
16037
|
-
}),
|
|
16038
|
-
http.api({
|
|
16039
|
-
method: "get",
|
|
16040
|
-
url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
|
|
16041
|
-
params: {
|
|
16042
|
-
type: 0,
|
|
16043
|
-
app_id: 1231
|
|
16044
|
-
}
|
|
16045
|
-
})
|
|
16046
|
-
]);
|
|
16047
16273
|
const isSuccess = !!(totalData?.data?.statistic && contentDataYesterday?.author_stat);
|
|
16048
16274
|
if (!isSuccess || !totalData?.data || !contentDataYesterday?.author_stat) return types_errorResponse(totalData?.message || contentDataYesterday?.message || "头条号数据获取失败,请检查Cookie是否有效", 414);
|
|
16049
16275
|
const ttData = {
|
|
@@ -20216,8 +20442,10 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
20216
20442
|
tuwen_wtt_trans_flag: params.settingInfo?.toutiaoTransWtt ? "2" : "0",
|
|
20217
20443
|
info_source: sourceData,
|
|
20218
20444
|
...location ? {
|
|
20219
|
-
|
|
20220
|
-
|
|
20445
|
+
manual_selected_city: JSON.stringify({
|
|
20446
|
+
city: location.label,
|
|
20447
|
+
city_code: location.value
|
|
20448
|
+
})
|
|
20221
20449
|
} : null,
|
|
20222
20450
|
...params.settingInfo?.toutiaoCollectionId ? {
|
|
20223
20451
|
want_join_collection_id: params.settingInfo.toutiaoCollectionId
|
|
@@ -20267,6 +20495,12 @@ const toutiaoPublish_mock_mockAction = async (task, params)=>{
|
|
|
20267
20495
|
claim_exclusive: toutiaoExclusive ? toutiaoExclusive : toutiaoOriginal?.includes("exclusive") ? 1 : 0
|
|
20268
20496
|
};
|
|
20269
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
|
+
});
|
|
20270
20504
|
const msToken = params.cookies.find((it)=>"msToken" === it.name)?.value;
|
|
20271
20505
|
let publishOption = {};
|
|
20272
20506
|
if (msToken) {
|
|
@@ -21462,8 +21696,8 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
|
|
|
21462
21696
|
headers
|
|
21463
21697
|
});
|
|
21464
21698
|
const proxyHttp = new Http(...args);
|
|
21465
|
-
|
|
21466
|
-
const responseData = response
|
|
21699
|
+
const baseRespFinder = (response)=>{
|
|
21700
|
+
const responseData = response?.data;
|
|
21467
21701
|
const msgType = "draft" === params.saveType ? "同步" : "发布";
|
|
21468
21702
|
if (response && responseData?.base_resp && 0 !== responseData.base_resp.ret && !ignoreErrno.includes(responseData.base_resp.ret)) {
|
|
21469
21703
|
const errmsg = weixinPublish_mock_errnoMap[responseData.base_resp.ret] || response.config.defaultErrorMsg || responseData.base_resp.err_msg || `文章${msgType}异常,请稍后重试。`;
|
|
@@ -21473,7 +21707,9 @@ const weixinPublish_mock_mockAction = async (task, params)=>{
|
|
|
21473
21707
|
data: responseData
|
|
21474
21708
|
};
|
|
21475
21709
|
}
|
|
21476
|
-
}
|
|
21710
|
+
};
|
|
21711
|
+
http.addResponseInterceptor(baseRespFinder);
|
|
21712
|
+
proxyHttp.addResponseInterceptor(baseRespFinder);
|
|
21477
21713
|
await http.api({
|
|
21478
21714
|
method: "get",
|
|
21479
21715
|
url: "https://mp.weixin.qq.com/cgi-bin/appmsgpublish",
|