zhihu_弹窗打开评论列表

劫持resource,强制comment通过modal打开!

目前為 2025-05-16 提交的版本,檢視 最新版本

// ==UserScript==
// @name         zhihu_弹窗打开评论列表
// @namespace    http://tampermonkey.net/
// @version      2025-05-15
// @description  劫持resource,强制comment通过modal打开!
// @author       https://github.com/Hojondo
// @run-at       document-start
// @match        https://www.zhihu.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zhihu.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
  "use strict";

  const waitForChunkReady = (maxAttempts = 150, interval = 50) => {
    let attempts = 0;

    const tryHook = () => {
      if (window.webpackChunkheifetz) {
        patchWebpackChunkSystem();
        return;
      }

      attempts++;
      if (attempts < maxAttempts) {
        setTimeout(tryHook, interval);
      } else {
        console.warn("❌ 未找到 window.webpackChunkheifetz");
      }
    };

    tryHook();
  };

  const FEATURE_STRING = 'fixed:"modal",bottom:"list"';

  const patchWebpackChunkSystem = () => {
    // const chunkKey = Object.keys(window).find(k => k.startsWith("webpackChunk"));
    const globalChunk = window.webpackChunkheifetz;

    const originalPush = globalChunk.push;

    Object.defineProperty(globalChunk, "push", {
      configurable: true,
      enumerable: false,
      writable: true,
      value: function (args) {
        try {
          const [chunkId, modules] = args;

          for (const key in modules) {
            const factory = modules[key];
            if (
              typeof factory === "function" &&
              factory.toString().includes(FEATURE_STRING)
            ) {
              console.log(`🎯 匹配到目标模块 ${key} in chunk ${chunkId}`);

              const wrappedFactory = function (module, exports, require) {
                factory.call(this, module, exports, require);

                // 截取原始函数引用
                const original = module.exports.default;
                if (typeof original === 'function') {
                  module.exports = {
                    __esModule: true,
                    default: function (...args) {
                      const result = original.apply(this, args);
                      const props = result?.props;

                      if (props && typeof props === 'object' && 'commentPattern' in props) {
                        props.commentPattern = 'fixed';
                        console.log('✅ 成功注入 commentPattern = "fixed"');
                      }

                      return result;
                    }
                  };
                }
              };

              modules[key] = wrappedFactory;
            }
          }
        } catch (err) {
          console.error("❌ Webpack patch error:", err);
        }

        return originalPush.call(this, args);
      },
    });

    console.log(
      "✅ Webpack chunk push hook injected (default function override)"
    );
  };

  const enableChunkErrorRecovery = () => {
    window.addEventListener("error", function (e) {
      const msg = e?.message || "";
      if (msg.includes("ChunkLoadError") || msg.includes("Loading chunk")) {
        console.warn("💥 Chunk load error detected, reloading...");
        setTimeout(() => location.reload(), 1000);
      }
    });
  };

  window.addEventListener("DOMContentLoaded", () => {
    waitForChunkReady();
  });
  enableChunkErrorRecovery();
})();