|
@@ -1,6 +1,6 @@
|
|
|
"ui";
|
|
"ui";
|
|
|
/*! tiktok-app v2026.10.13
|
|
/*! tiktok-app v2026.10.13
|
|
|
- * built 2026-10-20T03:14:59.125Z
|
|
|
|
|
|
|
+ * built 2026-10-20T11:32:21.394Z
|
|
|
* modules: theme, store, records, sources, device, service, engine, session, widgets, dialog, floatball, page-id, page-dm, page-video, page-tasks, page-records, page-login, page-mine, main
|
|
* modules: theme, store, records, sources, device, service, engine, session, widgets, dialog, floatball, page-id, page-dm, page-video, page-tasks, page-records, page-login, page-mine, main
|
|
|
* 由 tools/build.js 自动生成 —— 请不要直接编辑本文件,改 src/ 后重新构建。
|
|
* 由 tools/build.js 自动生成 —— 请不要直接编辑本文件,改 src/ 后重新构建。
|
|
|
*/
|
|
*/
|
|
@@ -649,7 +649,18 @@ F.push(
|
|
|
{ path: "tabs.id.features.videosMin", type: "int", min: 0, max: 100000000, def: 0 },
|
|
{ path: "tabs.id.features.videosMin", type: "int", min: 0, max: 100000000, def: 0 },
|
|
|
{ path: "tabs.id.features.videosMax", type: "int", min: 0, max: 100000000, def: 500000 },
|
|
{ path: "tabs.id.features.videosMax", type: "int", min: 0, max: 100000000, def: 500000 },
|
|
|
/* 0 = 不限制。用「0 表示不限」而不是留空,是因为数字输入框留空无法表达。 */
|
|
/* 0 = 不限制。用「0 表示不限」而不是留空,是因为数字输入框留空无法表达。 */
|
|
|
- { path: "tabs.id.features.extractLimit", type: "int", min: 0, max: 100000, def: 0 }
|
|
|
|
|
|
|
+ { path: "tabs.id.features.extractLimit", type: "int", min: 0, max: 100000, def: 0 },
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 单次运行最长多少分钟(抓取阶段)。
|
|
|
|
|
+ *
|
|
|
|
|
+ * 为什么让用户可调:这个值实际决定了"一轮最多能抓多少个",而抓取速度完全取决于过滤设置
|
|
|
|
|
+ * —— 不开过滤约 1 秒/个;开了「排除私密 / 排除无头像 / 数量门槛」就要逐个开用户页,
|
|
|
|
|
+ * 约 8 秒/个。实测 225 个候选就吃满了 30 分钟。
|
|
|
|
|
+ * 所以"想抓 100 个"的人必须能把它调大,否则提取上限设多大都抓不到。
|
|
|
|
|
+ *
|
|
|
|
|
+ * 上限 240 分钟:再长还不如分几轮跑(每轮都刷盘,中断不丢)。
|
|
|
|
|
+ */
|
|
|
|
|
+ { path: "tabs.id.features.maxRuntimeMin", type: "int", min: 1, max: 240, def: 30 }
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
/* ——— UID私信页 ——— */
|
|
/* ——— UID私信页 ——— */
|
|
@@ -2729,8 +2740,15 @@ Engine.buildIdConfig = function () {
|
|
|
historyPath: Engine.ID_DIR + "/uid_extracted.txt",
|
|
historyPath: Engine.ID_DIR + "/uid_extracted.txt",
|
|
|
dedupeHistory: Store.getBool(base + "dedupeHistory"),
|
|
dedupeHistory: Store.getBool(base + "dedupeHistory"),
|
|
|
dryRun: false,
|
|
dryRun: false,
|
|
|
- /* 0 = 不限。引擎另有 30 分钟时长护栏兜底(见 idflow.js) */
|
|
|
|
|
- limit: Store.getNumber(base + "extractLimit")
|
|
|
|
|
|
|
+ /* 0 = 不限。引擎另有「单次最长运行」与「解析 uid 独立预算」两道时长护栏 */
|
|
|
|
|
+ limit: Store.getNumber(base + "extractLimit"),
|
|
|
|
|
+ /* 抓完之后换数字 uid(默认开)。界面上暂未给开关——它没有副作用,
|
|
|
|
|
+ * 只是多花时间(约 2.5 秒/个),而数字 uid 在界面上读不到,不换就得事后另跑。 */
|
|
|
|
|
+ resolveUid: true
|
|
|
|
|
+ },
|
|
|
|
|
+ guard: {
|
|
|
|
|
+ /* 抓取阶段最长多久(分钟 → 毫秒)。到点收尾,已抓的不丢。 */
|
|
|
|
|
+ maxRuntimeMs: Math.max(1, Store.getNumber(base + "maxRuntimeMin")) * 60 * 1000
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
runtime: {
|
|
runtime: {
|
|
@@ -6890,6 +6908,17 @@ function buildOutput() {
|
|
|
stopRow.addView(U.text("个 ID 后停止(0 = 不限)", Theme.m.labelSize, Theme.hex.textMuted, false));
|
|
stopRow.addView(U.text("个 ID 后停止(0 = 不限)", Theme.m.labelSize, Theme.hex.textMuted, false));
|
|
|
blocks.push(stopRow);
|
|
blocks.push(stopRow);
|
|
|
|
|
|
|
|
|
|
+ /* 单次最长运行时间。它决定"一轮最多能抓多少个"——
|
|
|
|
|
+ * 开了过滤时约 8 秒/个,30 分钟只够 200 来个候选。
|
|
|
|
|
+ * 提取上限设得比这还大是没意义的,所以要让它可见可调。 */
|
|
|
|
|
+ var runtimeRow = U.row();
|
|
|
|
|
+ runtimeRow.addView(U.text("单次最长运行", Theme.m.labelSize, Theme.hex.textSecondary, false));
|
|
|
|
|
+ runtimeRow.addView(U.flexible());
|
|
|
|
|
+ runtimeRow.addView(W.numberField(base + "maxRuntimeMin", "30").root);
|
|
|
|
|
+ runtimeRow.addView(U.hgap(6));
|
|
|
|
|
+ runtimeRow.addView(U.text("分钟(到点收尾,已抓的不丢)", Theme.m.labelSize, Theme.hex.textMuted, false));
|
|
|
|
|
+ blocks.push(runtimeRow);
|
|
|
|
|
+
|
|
|
blocks.push(W.hint("结果文件自动命名 uid_日期_时分.txt,存放在 /sdcard/Download/tiktok_app", false));
|
|
blocks.push(W.hint("结果文件自动命名 uid_日期_时分.txt,存放在 /sdcard/Download/tiktok_app", false));
|
|
|
|
|
|
|
|
W.stack(card, blocks, 12);
|
|
W.stack(card, blocks, 12);
|