编程猫绕屏蔽词

绕过编程猫屏蔽词限制

// ==UserScript==
// @name         编程猫绕屏蔽词
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  绕过编程猫屏蔽词限制
// @author       Fantasy
// @match        *://*.codemao.cn/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
  'use strict';

  function addZeroWidthChars(htmlString) {
    const parser = new DOMParser();
    const doc = parser.parseFromString(htmlString, 'text/html');
    const zeroWidthChar = '\u200B';
    function traverseAndModify(node) {
        if (node.nodeType === Node.TEXT_NODE) {
            node.textContent = node.textContent.split('').map(char => char + zeroWidthChar).join('');
        } else {
            for (let child of node.childNodes) {
                traverseAndModify(child);
            }
        }
    }
    traverseAndModify(doc.body);
    return doc.body.innerHTML;
  }

  const originalOpen = XMLHttpRequest.prototype.open;
  XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
      this._url = url;
      originalOpen.apply(this, arguments);
  };

  const originalSend = XMLHttpRequest.prototype.send;
  XMLHttpRequest.prototype.send = function(data) {
    // 如果 data 是 FormData,则不处理直接发送
    if (data instanceof FormData) {
      return originalSend.call(this, data);
    }

    let jsonData = null;
    try {
      if (typeof data === 'string') {
        jsonData = JSON.parse(data);
      }
    } catch (e) {
      console.error('Failed to parse JSON: ', e);
      return originalSend.call(this, data); // 如果解析失败,原样发送
    }

    // 根据URL修改相应的字段
    if (/^https:\/\/api\.codemao\.cn\/web\/forums\/boards\/\d+\/posts$/.test(this._url)) {
      jsonData.content = addZeroWidthChars(jsonData.content);
      jsonData.title = addZeroWidthChars(jsonData.title);
    }
    if (/^https:\/\/api-creation\.codemao\.cn\/kitten\/r2\/work\/\d+\/publish$/.test(this._url)) {
      jsonData.description = addZeroWidthChars(jsonData.description);
      jsonData.name = addZeroWidthChars(jsonData.name);
    }
    if (/^https:\/\/api\.codemao\.cn\/(?:web\/forums\/(posts|replies)\/\d+\/(replies|comments)|creation-tools\/v1\/works\/\d+\/comment)$/.test(this._url) || /^https:\/\/api\.codemao\.cn\/creation-tools\/v1\/works\/\d+\/comment\/\d+\/reply$/.test(this._url)) {
      jsonData.content = addZeroWidthChars(jsonData.content);
    }
    if (this._url.includes('https://api.codemao.cn/tiger/v3/web/accounts/info')) {
      jsonData.nickname = addZeroWidthChars(jsonData.nickname);
    }

    // 将修改后的jsonData重新转换成字符串
    data = JSON.stringify(jsonData);
    return originalSend.call(this, data);
  };
})();