@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.js
CHANGED
|
@@ -5489,7 +5489,7 @@ var __webpack_exports__ = {};
|
|
|
5489
5489
|
});
|
|
5490
5490
|
const package_json_namespaceObject = require("@iflyrpa/share/package.json");
|
|
5491
5491
|
var package_json_default = /*#__PURE__*/ __webpack_require__.n(package_json_namespaceObject);
|
|
5492
|
-
var package_namespaceObject = JSON.parse('{"i8":"
|
|
5492
|
+
var package_namespaceObject = JSON.parse('{"i8":"4.0.0-beta.11"}');
|
|
5493
5493
|
const share_namespaceObject = require("@iflyrpa/share");
|
|
5494
5494
|
const external_node_fs_namespaceObject = require("node:fs");
|
|
5495
5495
|
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
@@ -5692,7 +5692,7 @@ var __webpack_exports__ = {};
|
|
|
5692
5692
|
599
|
|
5693
5693
|
].includes(handledError.code);
|
|
5694
5694
|
if (Rtimes < retries && isRetry) {
|
|
5695
|
-
this.logger?.info(`进入第${Rtimes + 1}
|
|
5695
|
+
this.logger?.info(`进入第${Rtimes + 1}次重试!错误码: ${handledError.code}`);
|
|
5696
5696
|
await new Promise((resolve)=>setTimeout(resolve, retryDelay));
|
|
5697
5697
|
return sessionRt(Rtimes + 1);
|
|
5698
5698
|
}
|
|
@@ -11896,16 +11896,35 @@ var __webpack_exports__ = {};
|
|
|
11896
11896
|
}, "微信账号有效性检测完成!");
|
|
11897
11897
|
};
|
|
11898
11898
|
const XhsSessionCheck = async (_task, params)=>{
|
|
11899
|
+
const logger = _task.logger;
|
|
11900
|
+
const startedAt = Date.now();
|
|
11899
11901
|
const check = {
|
|
11900
11902
|
isValidSession: false,
|
|
11901
11903
|
isValidWebSession: false
|
|
11902
11904
|
};
|
|
11905
|
+
const cookieNames = params.cookies.map((it)=>it.name);
|
|
11906
|
+
logger?.info("[XhsSessionCheck] 开始执行小红书账号有效性检测", {
|
|
11907
|
+
accountId: params.accountId,
|
|
11908
|
+
proxyLoc: params.proxyLoc,
|
|
11909
|
+
localIP: params.localIP,
|
|
11910
|
+
willUseProxyAgent: !!params.localIP,
|
|
11911
|
+
cookieCount: params.cookies.length,
|
|
11912
|
+
cookieNames,
|
|
11913
|
+
hasA1: cookieNames.includes("a1"),
|
|
11914
|
+
hasWebSession: cookieNames.includes("web_session")
|
|
11915
|
+
});
|
|
11903
11916
|
const a1Cookie = params.cookies.find((it)=>"a1" === it.name)?.value;
|
|
11904
|
-
if (!a1Cookie)
|
|
11905
|
-
|
|
11906
|
-
|
|
11907
|
-
|
|
11908
|
-
|
|
11917
|
+
if (!a1Cookie) {
|
|
11918
|
+
logger?.warn("[XhsSessionCheck] 缺失关键 cookie a1,提前返回", {
|
|
11919
|
+
accountId: params.accountId,
|
|
11920
|
+
cookieNames
|
|
11921
|
+
});
|
|
11922
|
+
return {
|
|
11923
|
+
code: 414,
|
|
11924
|
+
message: "账号数据异常,请重新绑定账号后重试。",
|
|
11925
|
+
data: check
|
|
11926
|
+
};
|
|
11927
|
+
}
|
|
11909
11928
|
const headers = {
|
|
11910
11929
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
11911
11930
|
referer: "https://creator.xiaohongshu.com/new/home?source=official"
|
|
@@ -11933,6 +11952,7 @@ var __webpack_exports__ = {};
|
|
|
11933
11952
|
return acc;
|
|
11934
11953
|
}, {});
|
|
11935
11954
|
const loginBaseXsHeader = sessionCheck_xsEncrypt.signHeadersGet(loginBasePath, recordCookie, "xhs-pc-web", null);
|
|
11955
|
+
const baseInfoStart = Date.now();
|
|
11936
11956
|
const _baseInfo = http.api({
|
|
11937
11957
|
method: "get",
|
|
11938
11958
|
baseURL: "https://creator.xiaohongshu.com",
|
|
@@ -11942,7 +11962,28 @@ var __webpack_exports__ = {};
|
|
|
11942
11962
|
retries: 3,
|
|
11943
11963
|
retryDelay: 20,
|
|
11944
11964
|
timeout: 3000
|
|
11945
|
-
}).
|
|
11965
|
+
}).then((res)=>{
|
|
11966
|
+
logger?.info("[XhsSessionCheck] creator base 接口请求成功", {
|
|
11967
|
+
accountId: params.accountId,
|
|
11968
|
+
duration: Date.now() - baseInfoStart,
|
|
11969
|
+
code: res?.code,
|
|
11970
|
+
msg: res?.msg,
|
|
11971
|
+
proxyInfo: http.proxyInfo
|
|
11972
|
+
});
|
|
11973
|
+
return res;
|
|
11974
|
+
}).catch((e)=>{
|
|
11975
|
+
logger?.warn("[XhsSessionCheck] creator base 接口请求失败", {
|
|
11976
|
+
accountId: params.accountId,
|
|
11977
|
+
duration: Date.now() - baseInfoStart,
|
|
11978
|
+
code: e?.code,
|
|
11979
|
+
message: e?.message,
|
|
11980
|
+
data: e?.data,
|
|
11981
|
+
extra: e?.extra,
|
|
11982
|
+
proxyInfo: http.proxyInfo
|
|
11983
|
+
});
|
|
11984
|
+
return e.data;
|
|
11985
|
+
});
|
|
11986
|
+
const webSessionStart = Date.now();
|
|
11946
11987
|
const _web_session = http.api({
|
|
11947
11988
|
method: "get",
|
|
11948
11989
|
url: "https://edith.xiaohongshu.com/api/sns/web/unread_count"
|
|
@@ -11950,6 +11991,26 @@ var __webpack_exports__ = {};
|
|
|
11950
11991
|
retries: 3,
|
|
11951
11992
|
retryDelay: 20,
|
|
11952
11993
|
timeout: 3000
|
|
11994
|
+
}).then((res)=>{
|
|
11995
|
+
logger?.info("[XhsSessionCheck] edith unread_count 接口请求成功", {
|
|
11996
|
+
accountId: params.accountId,
|
|
11997
|
+
duration: Date.now() - webSessionStart,
|
|
11998
|
+
code: res?.code,
|
|
11999
|
+
msg: res?.msg,
|
|
12000
|
+
proxyInfo: http.proxyInfo
|
|
12001
|
+
});
|
|
12002
|
+
return res;
|
|
12003
|
+
}).catch((e)=>{
|
|
12004
|
+
logger?.warn("[XhsSessionCheck] edith unread_count 接口请求失败", {
|
|
12005
|
+
accountId: params.accountId,
|
|
12006
|
+
duration: Date.now() - webSessionStart,
|
|
12007
|
+
code: e?.code,
|
|
12008
|
+
message: e?.message,
|
|
12009
|
+
data: e?.data,
|
|
12010
|
+
extra: e?.extra,
|
|
12011
|
+
proxyInfo: http.proxyInfo
|
|
12012
|
+
});
|
|
12013
|
+
throw e;
|
|
11953
12014
|
});
|
|
11954
12015
|
const [baseInfo, web_session] = await Promise.all([
|
|
11955
12016
|
_baseInfo,
|
|
@@ -11957,8 +12018,18 @@ var __webpack_exports__ = {};
|
|
|
11957
12018
|
]);
|
|
11958
12019
|
if (baseInfo?.code === 0) check.isValidSession = true;
|
|
11959
12020
|
if (0 === web_session.code) check.isValidWebSession = true;
|
|
11960
|
-
baseInfo?.code
|
|
12021
|
+
const _isSuccess = baseInfo?.code === web_session.code;
|
|
11961
12022
|
const message = `小红书账号有效性检测成功${_task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
12023
|
+
logger?.info("[XhsSessionCheck] 检测完成", {
|
|
12024
|
+
accountId: params.accountId,
|
|
12025
|
+
totalDuration: Date.now() - startedAt,
|
|
12026
|
+
baseInfoCode: baseInfo?.code,
|
|
12027
|
+
webSessionCode: web_session?.code,
|
|
12028
|
+
isValidSession: check.isValidSession,
|
|
12029
|
+
isValidWebSession: check.isValidWebSession,
|
|
12030
|
+
codeAligned: _isSuccess,
|
|
12031
|
+
proxyInfo: http.proxyInfo
|
|
12032
|
+
});
|
|
11962
12033
|
return (0, share_namespaceObject.success)(check, message);
|
|
11963
12034
|
};
|
|
11964
12035
|
const BjhSessionCheck = async (_task, params)=>{
|
|
@@ -14492,7 +14563,10 @@ var __webpack_exports__ = {};
|
|
|
14492
14563
|
task.logger.info(`拦截器收到响应response.data: ${JSON.stringify(response.data)} `);
|
|
14493
14564
|
decision = parseVerifyPassportDecision(response.headers["x-tt-verify-passport-decision"]);
|
|
14494
14565
|
if (needsVerification(decision)) {
|
|
14495
|
-
task.logger.
|
|
14566
|
+
task.logger.warn(`检测到需要验证: ${JSON.stringify(decision)}`);
|
|
14567
|
+
task.logger.warn(`验证类型: ${decision?.verify_ways?.join(", ")}`);
|
|
14568
|
+
task.logger.warn(`验证标题: ${decision?.verify_title}`);
|
|
14569
|
+
task.logger.warn(`验证描述: ${decision?.verify_desc}`);
|
|
14496
14570
|
return;
|
|
14497
14571
|
}
|
|
14498
14572
|
if (!response || !response.data) return;
|
|
@@ -14519,38 +14593,116 @@ var __webpack_exports__ = {};
|
|
|
14519
14593
|
});
|
|
14520
14594
|
return (0, share_namespaceObject.response)(0, message, data);
|
|
14521
14595
|
}
|
|
14522
|
-
|
|
14523
|
-
|
|
14524
|
-
|
|
14525
|
-
|
|
14526
|
-
|
|
14596
|
+
let webProtectData;
|
|
14597
|
+
try {
|
|
14598
|
+
webProtectData = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_sign_data_key/web_protect"] || "{}").data || "{}");
|
|
14599
|
+
if (!webProtectData.ticket || !webProtectData.ts_sign || !webProtectData.client_cert) {
|
|
14600
|
+
task.logger.error(`webProtectData 关键字段缺失: ${JSON.stringify(webProtectData)}`);
|
|
14601
|
+
return (0, share_namespaceObject.response)(414, "安全参数 webProtectData 不完整,请重新获取后重试", "");
|
|
14602
|
+
}
|
|
14603
|
+
} catch (error) {
|
|
14604
|
+
task.logger.error(`解析 webProtectData 失败: ${error}`);
|
|
14605
|
+
return (0, share_namespaceObject.response)(414, "安全参数 webProtectData 解析失败,请重新获取后重试", "");
|
|
14606
|
+
}
|
|
14607
|
+
let ticket = webProtectData.ticket;
|
|
14608
|
+
let ts_sign = webProtectData.ts_sign;
|
|
14609
|
+
const serverDataCookie = params.cookies.find((it)=>"bd_ticket_guard_server_data" === it.name)?.value;
|
|
14610
|
+
if (serverDataCookie) try {
|
|
14611
|
+
const decoded = JSON.parse(Buffer.from(decodeURIComponent(serverDataCookie), "base64").toString("utf8"));
|
|
14612
|
+
if (decoded.ticket && decoded.ts_sign) {
|
|
14613
|
+
if (decoded.ticket !== ticket) task.logger.info("使用 cookie 中的最新 ticket(web_protect 已过期)");
|
|
14614
|
+
ticket = decoded.ticket;
|
|
14615
|
+
ts_sign = decoded.ts_sign;
|
|
14616
|
+
}
|
|
14617
|
+
} catch (error) {
|
|
14618
|
+
task.logger.warn(`解析 bd_ticket_guard_server_data 失败,回退到 web_protect: ${error}`);
|
|
14619
|
+
}
|
|
14620
|
+
let ec_privateKey;
|
|
14621
|
+
try {
|
|
14622
|
+
ec_privateKey = JSON.parse(JSON.parse(params.extraParam["security-sdk/s_sdk_crypt_sdk"] || "{}").data || "{}").ec_privateKey;
|
|
14623
|
+
if (!ec_privateKey) {
|
|
14624
|
+
task.logger.error("ec_privateKey 为空");
|
|
14625
|
+
return (0, share_namespaceObject.response)(414, "安全参数 ec_privateKey 缺失,请重新获取后重试", "");
|
|
14626
|
+
}
|
|
14627
|
+
} catch (error) {
|
|
14628
|
+
task.logger.error(`解析 ec_privateKey 失败: ${error}`);
|
|
14629
|
+
return (0, share_namespaceObject.response)(414, "安全参数 ec_privateKey 解析失败,请重新获取后重试", "");
|
|
14630
|
+
}
|
|
14631
|
+
let certificate;
|
|
14632
|
+
try {
|
|
14633
|
+
certificate = JSON.parse(params.extraParam["security-sdk/s_sdk_server_cert_key"] || "{}").cert;
|
|
14634
|
+
if (!certificate) {
|
|
14635
|
+
task.logger.error("certificate 为空");
|
|
14636
|
+
return (0, share_namespaceObject.response)(414, "安全参数 certificate 缺失,请重新获取后重试", "");
|
|
14637
|
+
}
|
|
14638
|
+
} catch (error) {
|
|
14639
|
+
task.logger.error(`解析 certificate 失败: ${error}`);
|
|
14640
|
+
return (0, share_namespaceObject.response)(414, "安全参数 certificate 解析失败,请重新获取后重试", "");
|
|
14641
|
+
}
|
|
14527
14642
|
const ree_public_key = webProtectData.client_cert.replace("pub.", "");
|
|
14528
|
-
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket
|
|
14529
|
-
|
|
14530
|
-
|
|
14531
|
-
|
|
14532
|
-
|
|
14533
|
-
|
|
14534
|
-
|
|
14535
|
-
|
|
14536
|
-
|
|
14537
|
-
|
|
14538
|
-
|
|
14643
|
+
task.logger.info(`生成 bdTicketGuardClientData 的参数: ticket: ${ticket?.substring(0, 20)}..., ts_sign: ${ts_sign}, ree_public_key: ${ree_public_key?.substring(0, 20)}...`);
|
|
14644
|
+
let bdTicketGuardClientData;
|
|
14645
|
+
try {
|
|
14646
|
+
bdTicketGuardClientData = getBdV2({
|
|
14647
|
+
ticket,
|
|
14648
|
+
ts_sign: ts_sign,
|
|
14649
|
+
ec_privateKey: ec_privateKey,
|
|
14650
|
+
certificate: certificate,
|
|
14651
|
+
bd_ticket_guard_ree_public_key: ree_public_key
|
|
14652
|
+
});
|
|
14653
|
+
if (!bdTicketGuardClientData || !bdTicketGuardClientData["headers_bd_ticket_guard_client_data"]) {
|
|
14654
|
+
task.logger.error(`bdTicketGuardClientData 生成失败或不完整: ${JSON.stringify(bdTicketGuardClientData)}`);
|
|
14655
|
+
return (0, share_namespaceObject.response)(414, "安全参数 bdTicketGuardClientData 生成失败,请重新获取后重试", "");
|
|
14656
|
+
}
|
|
14657
|
+
} catch (error) {
|
|
14658
|
+
task.logger.error(`生成 bdTicketGuardClientData 失败: ${error}`);
|
|
14659
|
+
return (0, share_namespaceObject.response)(414, "安全参数 bdTicketGuardClientData 生成异常,请重新获取后重试", "");
|
|
14660
|
+
}
|
|
14661
|
+
task.logger.info("bdTicketGuardClientData 生成成功");
|
|
14539
14662
|
const publishQuery = {
|
|
14540
14663
|
...publishParams,
|
|
14541
14664
|
a_bogus: ""
|
|
14542
14665
|
};
|
|
14543
14666
|
const queryString = new URLSearchParams(publishQuery).toString();
|
|
14544
|
-
|
|
14667
|
+
let aBogus;
|
|
14668
|
+
try {
|
|
14669
|
+
aBogus = mock_getABogus(`https://creator.douyin.com/web/api/media/aweme/create_v2/?${queryString}`, publishData, userAgent);
|
|
14670
|
+
if (!aBogus || aBogus.length < 10) {
|
|
14671
|
+
task.logger.error(`a_bogus 生成异常,长度过短: ${aBogus}`);
|
|
14672
|
+
return (0, share_namespaceObject.response)(414, "安全参数 a_bogus 生成失败,请重试", "");
|
|
14673
|
+
}
|
|
14674
|
+
task.logger.info(`a_bogus 生成成功: ${aBogus.substring(0, 20)}...`);
|
|
14675
|
+
} catch (error) {
|
|
14676
|
+
task.logger.error(`生成 a_bogus 失败: ${error}`);
|
|
14677
|
+
return (0, share_namespaceObject.response)(414, "安全参数 a_bogus 生成异常,请重试", "");
|
|
14678
|
+
}
|
|
14545
14679
|
publishQuery.a_bogus = aBogus;
|
|
14546
14680
|
const publishQueryParams = new URLSearchParams(publishQuery).toString();
|
|
14547
|
-
|
|
14548
|
-
|
|
14549
|
-
|
|
14550
|
-
|
|
14551
|
-
|
|
14552
|
-
|
|
14553
|
-
|
|
14681
|
+
let csrfToken;
|
|
14682
|
+
try {
|
|
14683
|
+
csrfToken = mock_generateCsrfTokenAdvanced({
|
|
14684
|
+
cookies: params.cookies,
|
|
14685
|
+
url: "https://creator.douyin.com/web/api/media/aweme/create_v2/",
|
|
14686
|
+
method: "POST",
|
|
14687
|
+
userAgent
|
|
14688
|
+
});
|
|
14689
|
+
if (!csrfToken || csrfToken.length < 10) {
|
|
14690
|
+
task.logger.error(`csrfToken 生成异常,长度过短: ${csrfToken}`);
|
|
14691
|
+
return (0, share_namespaceObject.response)(414, "安全参数 csrfToken 生成失败,请重试", "");
|
|
14692
|
+
}
|
|
14693
|
+
task.logger.info(`csrfToken 生成成功: ${csrfToken.substring(0, 20)}...`);
|
|
14694
|
+
} catch (error) {
|
|
14695
|
+
task.logger.error(`生成 csrfToken 失败: ${error}`);
|
|
14696
|
+
return (0, share_namespaceObject.response)(414, "安全参数 csrfToken 生成异常,请重试", "");
|
|
14697
|
+
}
|
|
14698
|
+
let sessionDtrait;
|
|
14699
|
+
try {
|
|
14700
|
+
sessionDtrait = mock_generateDtrait("/web/api/media/aweme/create_v2/");
|
|
14701
|
+
task.logger.info(`sessionDtrait 生成成功: ${sessionDtrait || "(空)"}`);
|
|
14702
|
+
} catch (error) {
|
|
14703
|
+
task.logger.error(`生成 sessionDtrait 失败: ${error}`);
|
|
14704
|
+
return (0, share_namespaceObject.response)(414, "安全参数 sessionDtrait 生成异常,请重试", "");
|
|
14705
|
+
}
|
|
14554
14706
|
task.logger.info("发布数据", {
|
|
14555
14707
|
data: JSON.stringify(publishData)
|
|
14556
14708
|
});
|
|
@@ -14595,19 +14747,28 @@ var __webpack_exports__ = {};
|
|
|
14595
14747
|
task.logger.info("========== api调用完成 ==========");
|
|
14596
14748
|
task.logger.info(`decision值: ${JSON.stringify(decision)}, needsVerification(decision): ${needsVerification(decision)}`);
|
|
14597
14749
|
if (needsVerification(decision)) {
|
|
14750
|
+
const details = [
|
|
14751
|
+
publishResult.status_msg,
|
|
14752
|
+
decision?.verify_title,
|
|
14753
|
+
decision?.verify_desc
|
|
14754
|
+
].filter(Boolean).join(" ");
|
|
14755
|
+
const message = `图文发布失败,原因:${details}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
14598
14756
|
task.logger.warn(`TaskId:${task.taskId},检测到需要验证,准备返回验证信息`);
|
|
14599
|
-
|
|
14600
|
-
|
|
14757
|
+
let decisionObj = {};
|
|
14758
|
+
if (decision) decisionObj = decision;
|
|
14759
|
+
const mockData = {
|
|
14760
|
+
state: share_namespaceObject.TaskState.FAILED,
|
|
14761
|
+
error: message,
|
|
14601
14762
|
result: {
|
|
14602
|
-
|
|
14763
|
+
...decisionObj,
|
|
14764
|
+
data: decision,
|
|
14765
|
+
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
14603
14766
|
}
|
|
14604
|
-
}
|
|
14605
|
-
|
|
14767
|
+
};
|
|
14768
|
+
await updateTaskState?.(mockData);
|
|
14606
14769
|
return {
|
|
14607
14770
|
code: 0,
|
|
14608
|
-
data:
|
|
14609
|
-
result: decision
|
|
14610
|
-
},
|
|
14771
|
+
data: mockData,
|
|
14611
14772
|
message: "操作成功"
|
|
14612
14773
|
};
|
|
14613
14774
|
}
|
|
@@ -14629,10 +14790,13 @@ var __webpack_exports__ = {};
|
|
|
14629
14790
|
const message = `图文发布${isSuccess ? "成功" : `失败,原因:${publishResult.status_msg} ${decision?.verify_title} ${decision?.verify_desc}`}${task.debug ? ` ${http.proxyInfo}` : ""}`;
|
|
14630
14791
|
const data = isSuccess ? publishResult.item_id || "" : "";
|
|
14631
14792
|
if (!isSuccess) {
|
|
14793
|
+
let decisionObj = {};
|
|
14794
|
+
if (decision) decisionObj = decision;
|
|
14632
14795
|
await updateTaskState?.({
|
|
14633
14796
|
state: share_namespaceObject.TaskState.FAILED,
|
|
14634
14797
|
error: message,
|
|
14635
14798
|
result: {
|
|
14799
|
+
...decisionObj,
|
|
14636
14800
|
data: decision,
|
|
14637
14801
|
uploadedImgList: JSON.stringify(publishData.item.common.images)
|
|
14638
14802
|
}
|
|
@@ -15307,15 +15471,41 @@ var __webpack_exports__ = {};
|
|
|
15307
15471
|
}
|
|
15308
15472
|
task.logger?.info("准备发布...");
|
|
15309
15473
|
await page.waitForTimeout(1000);
|
|
15310
|
-
const
|
|
15474
|
+
const result = await new Promise((resolve, reject)=>{
|
|
15311
15475
|
const handleResponse = async (res)=>{
|
|
15312
15476
|
if (res.url().includes("/web/api/media/aweme/create_v2")) {
|
|
15313
15477
|
task.logger?.info("匹配到发布接口响应");
|
|
15478
|
+
let decision = null;
|
|
15479
|
+
try {
|
|
15480
|
+
const headers = await res.allHeaders();
|
|
15481
|
+
decision = parseVerifyPassportDecision(headers["x-tt-verify-passport-decision"]);
|
|
15482
|
+
} catch (error) {
|
|
15483
|
+
task.logger?.warn(`解析验证决策头失败: ${error}`);
|
|
15484
|
+
}
|
|
15314
15485
|
const jsonResponse = await res.json();
|
|
15315
15486
|
task.logger?.info(`发布接口响应数据: ${JSON.stringify(jsonResponse)}`);
|
|
15316
15487
|
page.off("response", handleResponse);
|
|
15317
|
-
if (
|
|
15318
|
-
|
|
15488
|
+
if (needsVerification(decision)) {
|
|
15489
|
+
task.logger?.warn("检测到需要二次验证,文章未真正发布");
|
|
15490
|
+
resolve({
|
|
15491
|
+
itemId: "",
|
|
15492
|
+
decision
|
|
15493
|
+
});
|
|
15494
|
+
return;
|
|
15495
|
+
}
|
|
15496
|
+
if (jsonResponse?.status_code !== 0) {
|
|
15497
|
+
reject(new Error(jsonResponse?.status_msg || "发布失败"));
|
|
15498
|
+
return;
|
|
15499
|
+
}
|
|
15500
|
+
const itemId = jsonResponse?.data?.item_id || jsonResponse?.item_id || "";
|
|
15501
|
+
if (!itemId) {
|
|
15502
|
+
reject(new Error(jsonResponse?.status_msg || "发布异常:未返回作品ID,文章可能未真正发布"));
|
|
15503
|
+
return;
|
|
15504
|
+
}
|
|
15505
|
+
resolve({
|
|
15506
|
+
itemId,
|
|
15507
|
+
decision: null
|
|
15508
|
+
});
|
|
15319
15509
|
}
|
|
15320
15510
|
};
|
|
15321
15511
|
page.on("response", handleResponse);
|
|
@@ -15337,20 +15527,42 @@ var __webpack_exports__ = {};
|
|
|
15337
15527
|
await page.close();
|
|
15338
15528
|
return null;
|
|
15339
15529
|
});
|
|
15340
|
-
if (!
|
|
15530
|
+
if (!result) return {
|
|
15341
15531
|
code: 414,
|
|
15342
15532
|
message: "发布失败",
|
|
15343
15533
|
data: ""
|
|
15344
15534
|
};
|
|
15345
|
-
|
|
15535
|
+
if (needsVerification(result.decision)) {
|
|
15536
|
+
const decision = result.decision;
|
|
15537
|
+
const details = [
|
|
15538
|
+
decision?.verify_title,
|
|
15539
|
+
decision?.verify_desc
|
|
15540
|
+
].filter(Boolean).join(" ");
|
|
15541
|
+
const message = `发布失败,需要二次验证${details ? `:${details}` : ""}`;
|
|
15542
|
+
task.logger?.warn(message);
|
|
15543
|
+
await updateTaskState?.({
|
|
15544
|
+
state: share_namespaceObject.TaskState.FAILED,
|
|
15545
|
+
error: message,
|
|
15546
|
+
result: {
|
|
15547
|
+
data: decision
|
|
15548
|
+
}
|
|
15549
|
+
});
|
|
15550
|
+
await page.close();
|
|
15551
|
+
return {
|
|
15552
|
+
code: 414,
|
|
15553
|
+
message,
|
|
15554
|
+
data: ""
|
|
15555
|
+
};
|
|
15556
|
+
}
|
|
15557
|
+
task.logger?.info(`✓ 发布成功,item_id: ${result.itemId}`);
|
|
15346
15558
|
await updateTaskState?.({
|
|
15347
15559
|
state: share_namespaceObject.TaskState.SUCCESS,
|
|
15348
15560
|
result: {
|
|
15349
|
-
response
|
|
15561
|
+
response: result.itemId
|
|
15350
15562
|
}
|
|
15351
15563
|
});
|
|
15352
15564
|
await page.close();
|
|
15353
|
-
return (0, share_namespaceObject.success)(
|
|
15565
|
+
return (0, share_namespaceObject.success)(result.itemId);
|
|
15354
15566
|
};
|
|
15355
15567
|
const DouyinPublishParamsSchema = ActionCommonParamsSchema.extend({
|
|
15356
15568
|
title: schemas_string(),
|
|
@@ -16130,26 +16342,26 @@ var __webpack_exports__ = {};
|
|
|
16130
16342
|
const http = new Http({
|
|
16131
16343
|
headers: {
|
|
16132
16344
|
cookie: params.cookies.map((it)=>`${it.name}=${it.value}`).join(";"),
|
|
16133
|
-
referer: "https://mp.toutiao.com/profile_v4/graphic/publish"
|
|
16345
|
+
referer: "https://mp.toutiao.com/profile_v4/graphic/publish",
|
|
16346
|
+
"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"
|
|
16347
|
+
}
|
|
16348
|
+
});
|
|
16349
|
+
const totalData = await http.api({
|
|
16350
|
+
method: "get",
|
|
16351
|
+
url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
|
|
16352
|
+
params: {
|
|
16353
|
+
app_id: 1231
|
|
16354
|
+
}
|
|
16355
|
+
});
|
|
16356
|
+
await new Promise((r)=>setTimeout(r, 1000));
|
|
16357
|
+
const contentDataYesterday = await http.api({
|
|
16358
|
+
method: "get",
|
|
16359
|
+
url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
|
|
16360
|
+
params: {
|
|
16361
|
+
type: 0,
|
|
16362
|
+
app_id: 1231
|
|
16134
16363
|
}
|
|
16135
16364
|
});
|
|
16136
|
-
const [totalData, contentDataYesterday] = await Promise.all([
|
|
16137
|
-
http.api({
|
|
16138
|
-
method: "get",
|
|
16139
|
-
url: "https://mp.toutiao.com/mp/fe_api/home/merge_v2",
|
|
16140
|
-
params: {
|
|
16141
|
-
app_id: 1231
|
|
16142
|
-
}
|
|
16143
|
-
}),
|
|
16144
|
-
http.api({
|
|
16145
|
-
method: "get",
|
|
16146
|
-
url: "https://mp.toutiao.com/mp/agw/statistic/v2/content_stat",
|
|
16147
|
-
params: {
|
|
16148
|
-
type: 0,
|
|
16149
|
-
app_id: 1231
|
|
16150
|
-
}
|
|
16151
|
-
})
|
|
16152
|
-
]);
|
|
16153
16365
|
const isSuccess = !!(totalData?.data?.statistic && contentDataYesterday?.author_stat);
|
|
16154
16366
|
if (!isSuccess || !totalData?.data || !contentDataYesterday?.author_stat) return types_errorResponse(totalData?.message || contentDataYesterday?.message || "头条号数据获取失败,请检查Cookie是否有效", 414);
|
|
16155
16367
|
const ttData = {
|
|
@@ -20326,8 +20538,10 @@ var __webpack_exports__ = {};
|
|
|
20326
20538
|
tuwen_wtt_trans_flag: params.settingInfo?.toutiaoTransWtt ? "2" : "0",
|
|
20327
20539
|
info_source: sourceData,
|
|
20328
20540
|
...location ? {
|
|
20329
|
-
|
|
20330
|
-
|
|
20541
|
+
manual_selected_city: JSON.stringify({
|
|
20542
|
+
city: location.label,
|
|
20543
|
+
city_code: location.value
|
|
20544
|
+
})
|
|
20331
20545
|
} : null,
|
|
20332
20546
|
...params.settingInfo?.toutiaoCollectionId ? {
|
|
20333
20547
|
want_join_collection_id: params.settingInfo.toutiaoCollectionId
|
|
@@ -20377,6 +20591,12 @@ var __webpack_exports__ = {};
|
|
|
20377
20591
|
claim_exclusive: toutiaoExclusive ? toutiaoExclusive : toutiaoOriginal?.includes("exclusive") ? 1 : 0
|
|
20378
20592
|
};
|
|
20379
20593
|
task._timerRecord.PrePublish = Date.now();
|
|
20594
|
+
task.logger.info(`[toutiaoPublish] ${"draft" === params.saveType ? "同步草稿" : "发布文章"}参数`, {
|
|
20595
|
+
saveType: params.saveType,
|
|
20596
|
+
title: params.title,
|
|
20597
|
+
extra: extraData,
|
|
20598
|
+
publishData
|
|
20599
|
+
});
|
|
20380
20600
|
const msToken = params.cookies.find((it)=>"msToken" === it.name)?.value;
|
|
20381
20601
|
let publishOption = {};
|
|
20382
20602
|
if (msToken) {
|
|
@@ -21572,8 +21792,8 @@ var __webpack_exports__ = {};
|
|
|
21572
21792
|
headers
|
|
21573
21793
|
});
|
|
21574
21794
|
const proxyHttp = new Http(...args);
|
|
21575
|
-
|
|
21576
|
-
const responseData = response
|
|
21795
|
+
const baseRespFinder = (response)=>{
|
|
21796
|
+
const responseData = response?.data;
|
|
21577
21797
|
const msgType = "draft" === params.saveType ? "同步" : "发布";
|
|
21578
21798
|
if (response && responseData?.base_resp && 0 !== responseData.base_resp.ret && !ignoreErrno.includes(responseData.base_resp.ret)) {
|
|
21579
21799
|
const errmsg = weixinPublish_mock_errnoMap[responseData.base_resp.ret] || response.config.defaultErrorMsg || responseData.base_resp.err_msg || `文章${msgType}异常,请稍后重试。`;
|
|
@@ -21583,7 +21803,9 @@ var __webpack_exports__ = {};
|
|
|
21583
21803
|
data: responseData
|
|
21584
21804
|
};
|
|
21585
21805
|
}
|
|
21586
|
-
}
|
|
21806
|
+
};
|
|
21807
|
+
http.addResponseInterceptor(baseRespFinder);
|
|
21808
|
+
proxyHttp.addResponseInterceptor(baseRespFinder);
|
|
21587
21809
|
await http.api({
|
|
21588
21810
|
method: "get",
|
|
21589
21811
|
url: "https://mp.weixin.qq.com/cgi-bin/appmsgpublish",
|