|
@@ -1,5 +1,5 @@
|
|
|
/*! tiktok-auto v1.0.0
|
|
/*! tiktok-auto v1.0.0
|
|
|
- * built 2026-10-20T08:08:36.158Z
|
|
|
|
|
|
|
+ * built 2026-10-20T08:37:51.597Z
|
|
|
* modules: logger, bridge, config, wait, layout, ui, popups, tiktok, player, comment, flow, parse, uidset, filters, profile, idsource, idflow, main
|
|
* modules: logger, bridge, config, wait, layout, ui, popups, tiktok, player, comment, flow, parse, uidset, filters, profile, idsource, idflow, main
|
|
|
* 由 tools/build.js 自动生成 —— 请不要直接编辑本文件,改 src/ 后重新构建。
|
|
* 由 tools/build.js 自动生成 —— 请不要直接编辑本文件,改 src/ 后重新构建。
|
|
|
*/
|
|
*/
|
|
@@ -4348,16 +4348,88 @@ TikTokAuto.profile = (function () {
|
|
|
return previous;
|
|
return previous;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 截屏授权状态:null = 还没试过,true = 已就绪,false = 不可用。
|
|
|
|
|
+ *
|
|
|
|
|
+ * ★ 真机实测(2026-10-20):**`requestScreenCapture(false)` 是静默的** ——
|
|
|
|
|
+ * AutoX 的无障碍服务带 `CAPABILITY_CAN_TAKE_SCREENSHOT`,申请当场返回 true,
|
|
|
|
|
+ * 不弹 MediaProjection 确认框,1 秒内完成,随后 `captureScreen()` 直接可用。
|
|
|
|
|
+ * 而**不主动申请**时 `captureScreen()` 会抛 `No screen capture permission` ——
|
|
|
|
|
+ * 这就是早先"排除无头像一直不生效、每个账号还刷一条错误"的全部原因。
|
|
|
|
|
+ *
|
|
|
|
|
+ * 代价与风险:某些设备/ROM 上申请会弹一次系统授权框并阻塞。
|
|
|
|
|
+ * 所以申请失败就锁定"不可用"并**只告知一次**,不让它把整轮拖住或刷屏。
|
|
|
|
|
+ */
|
|
|
|
|
+ var screenCaptureReady = null;
|
|
|
|
|
+
|
|
|
|
|
+ function ensureScreenCapture() {
|
|
|
|
|
+ if (screenCaptureReady !== null) {
|
|
|
|
|
+ return screenCaptureReady;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (typeof requestScreenCapture !== "function") {
|
|
|
|
|
+ screenCaptureReady = false;
|
|
|
|
|
+ logger().warn('profile', '这个运行时不支持截屏申请,本次运行的头像判定会跳过');
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ try {
|
|
|
|
|
+ screenCaptureReady = requestScreenCapture(false) === true;
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ screenCaptureReady = false;
|
|
|
|
|
+ logger().warn('profile', '申请截屏授权失败,本次运行的头像判定会跳过:' + error);
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (screenCaptureReady) {
|
|
|
|
|
+ logger().info('profile', '截屏授权已就绪,头像判定可用');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ logger().warn('profile', '截屏授权未获批准,本次运行的头像判定会跳过');
|
|
|
|
|
+ }
|
|
|
|
|
+ return screenCaptureReady;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 头像是默认剪影吗?
|
|
* 头像是默认剪影吗?
|
|
|
*
|
|
*
|
|
|
|
|
+ * ★ "判为无头像"必须**再采一次**才采信。
|
|
|
|
|
+ * 实测发现:刚进用户页时(`waitProfile` 只等到 `@username` 出现,约 585ms),
|
|
|
|
|
+ * 头像图片往往还在下载,截到的是**灰色占位块** → 高饱和 0.000 → 误判"无头像"
|
|
|
|
|
+ * → 一个明明有头像的账号被错误跳过。
|
|
|
|
|
+ * 有色的情况不必二次确认(灰底不会自己变彩色),所以这个额外开销只落在
|
|
|
|
|
+ * "疑似无头像"的那部分账号上,约多花 400ms。
|
|
|
|
|
+ *
|
|
|
* @returns true(有头像)/ false(默认剪影)/ null(判不了)
|
|
* @returns true(有头像)/ false(默认剪影)/ null(判不了)
|
|
|
*/
|
|
*/
|
|
|
function readAvatarState() {
|
|
function readAvatarState() {
|
|
|
|
|
+ if (!ensureScreenCapture()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
var node = avatarNode();
|
|
var node = avatarNode();
|
|
|
if (!node) {
|
|
if (!node) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ var first = sampleAvatar(node);
|
|
|
|
|
+ if (first === null || first === true) {
|
|
|
|
|
+ return first;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /* 第一次判为"无色":等图片加载完再确认一次 */
|
|
|
|
|
+ TikTokAuto.wait.tick(400);
|
|
|
|
|
+ var second = sampleAvatar(node);
|
|
|
|
|
+ if (second === null) {
|
|
|
|
|
+ return first;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (second !== first) {
|
|
|
|
|
+ logger().info('profile', '头像两次采样不一致(' + first + ' → ' + second +
|
|
|
|
|
+ '),采用第二次 —— 第一次多半是图片还没加载');
|
|
|
|
|
+ }
|
|
|
|
|
+ return second;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 对头像区域采样一次,返回"是否有头像"。
|
|
|
|
|
+ * @returns true / false / null(拿不到节点或截屏失败)
|
|
|
|
|
+ */
|
|
|
|
|
+ function sampleAvatar(node) {
|
|
|
var box = node.bounds();
|
|
var box = node.bounds();
|
|
|
var saturated = 0;
|
|
var saturated = 0;
|
|
|
var total = 0;
|
|
var total = 0;
|
|
@@ -4366,12 +4438,14 @@ TikTokAuto.profile = (function () {
|
|
|
try {
|
|
try {
|
|
|
image = captureScreen();
|
|
image = captureScreen();
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
- /* Android 14 上截屏要 MediaProjection 授权。拿不到不是"没头像",
|
|
|
|
|
|
|
+ /* 申请过了却还是拿不到(被系统撤销 / ROM 限制):不是"没头像",
|
|
|
* 是"这次判不了" —— 必须返回 null,由上层如实告知。 */
|
|
* 是"这次判不了" —— 必须返回 null,由上层如实告知。 */
|
|
|
- logger().info('profile', '头像判定不可用(无法截屏):' + error);
|
|
|
|
|
|
|
+ screenCaptureReady = false;
|
|
|
|
|
+ logger().warn('profile', '截屏不可用,后续账号不再尝试头像判定:' + error);
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
if (!image) {
|
|
if (!image) {
|
|
|
|
|
+ screenCaptureReady = false;
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
|
|
|