星之子 发表于 2025-5-10 23:40:59

【油猴脚本】二手市场寄售情况统计(兼容博物馆传送门)

本帖最后由 星之子 于 2025-5-10 23:46 编辑

动机
上周调教DeepSeek写了一个二手市场勋章数量统计的脚本【油猴脚本】二手市场寄售情况统计。而后在使用过程中,我发现这个脚本似乎和博物馆传送门不兼容,会使其失效:二手市场块内的勋章图片、下方记录中的勋章名称文字,均无法点击跳转。
于是编写了这么一个新版本来优化兼容性。现在除了修复上面提到的两点,统计结果块内的勋章图片也能跳转了。

功能
排序逻辑:优先按照数量,从高到低排列。如果数量相同,则按照出现在市场中的先后顺序排列。
外观设计:沿用已有格式,宽度字体颜色等均相同,以确保设计语言的统一。上方统计结果可以可以和下方勋章一一对齐。
兼容性:新版本保持了DOM结构一致性,而博物馆传送门的modifyHref()函数依赖这个结构来查找并替换链接。这使得统计结果块也能被识别并添加跳转链接。

代码
@Name@Match@Icon
// ==UserScript==
// @name         勋章:二手市场寄售情况统计
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description统计二手市场同类勋章数量(与博物馆兼容)
// @author       Étoiles & DeepSeek
// @match      https://www.gamemale.com/wodexunzhang-showxunzhang.html?action=showjishou
// @icon         https://www.google.com/s2/favicons?sz=64&domain=gamemale.com
// @grant      GM_log
// ==/UserScript==

(function () {
    'use strict';

    // 调试日志函数
    function debugLog(message) {
      if (typeof GM_log !== 'undefined') {
            GM_log(message);
      }
      console.log('[勋章统计]', message);
    }

    // 新版元素查找函数
    function findMarketTitle() {
      const titles = document.querySelectorAll('.my_biaoti');
      for (let title of titles) {
            if (title.textContent.includes('二手市场')) {
                debugLog('找到标题元素');
                return title;
            }
      }
      debugLog('未找到标题元素');
      return null;
    }

    // 主执行函数
    function main() {
      const titleDiv = findMarketTitle();
      if (!titleDiv) {
            debugLog('中止:未找到标题元素');
            return;
      }

      // 创建统计容器
      const statsDiv = document.createElement('div');
      statsDiv.id = 'medal-stats-box';
      statsDiv.style.cssText = `
            padding: 5px 0px 10px 0px;
            background: #f5f5f5;
            border: 0px solid #ddd;
            margin: 0px 0px 10px 0px;
            color: #666;
            font-size: 14px;
      `;

      // 修改后的统计逻辑(记录图片路径)
      const medals = {};
      const blocks = document.querySelectorAll('.myblok');
      debugLog(`找到 ${blocks.length} 个勋章区块`);

      blocks.forEach((blok, index) => {
            const img = blok.querySelector('.myimg img');
            if (!img) {
                debugLog(`区块 ${index} 缺少图片元素`);
                return;
            }
            const name = img.alt.trim();
            const src = img.src; // 新增:获取图片路径
            if (!name) {
                debugLog(`区块 ${index} 图片alt为空`);
                return;
            }

            // 记录图片路径和数量
            if (!medals) {
                medals = {
                  count: 1,
                  src: src
                };
            } else {
                medals.count++;
            }
      });

      // 修改后的统计内容生成部分 保持DOM结构一致性以兼容博物馆
      statsDiv.innerHTML = `
            <div style="font-size:16px; margin:5px 19px; font-weight:bold">当前 / ${blocks.length} </div>
            <div class="myfldiv clearfix">
                ${Object.entries(medals)
                        .sort((a, b) => b.count - a.count)
                        .map(() => `
                  <div class="myblok" style="width:145px;height:120px;">
                        <div class="myimg" style="font-size:12px;color:#383a42">
                            <a href="javascript:void(0);">
                              <img src="${data.src}"
                                    alt="${name}"
                                    style="${getOriginalImgStyle()}">
                            </a>
                            <p title="${name}"><b>${shortenName(name)}</b></p>
                            <p>
                              <button type="button" class="pn"
                                        style="cursor:default; background:#e5e5e5">
                                    <em>${data.count}</em>
                              </button>
                            </p>
                        </div>
                        <div class="mytip" style="display:none"></div>
                  </div>
                  `).join('')}
            </div>
      `;

      // 获取原始图片样式函数
      function getOriginalImgStyle() {
            const sampleImg = document.querySelector('.myblok .myimg img');
            return sampleImg ? sampleImg.getAttribute('style') || '' : '';
      }

      // 名称截断函数(保持原始处理逻辑)
      function shortenName(name) {
            return name.length > 14 ? name.substring(0, 12) + "..." : name;
      }

      // 插入元素
      titleDiv.insertAdjacentElement('afterend', statsDiv);
      debugLog('统计信息已插入');
    }

    // 启动方式:先尝试立即执行,然后每500ms检查一次,最多检查5次
    let checkCount = 0;
    function checkAndRun() {
      if (checkCount++ > 5) {
            debugLog('超过最大重试次数');
            return;
      }

      if (document.querySelector('.my_biaoti')) {
            main();
      } else {
            setTimeout(checkAndRun, 500);
      }
    }

    // 使用DOMContentLoaded替代load事件
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', checkAndRun);
    } else {
      checkAndRun();
    }
})();


星象占卜

zibatco2 发表于 2025-5-10 23:50:18

感谢星大佬分享优化太棒惹~之前版本二手市场上面不能连原来是不相容~

更新后上面的也可以直连方便很多呢~{:6_200:}{:6_200:}{:6_200:}

娱乐法师火布偶 发表于 2025-5-10 23:52:45

优化以后确实更有好的兼容性了

rayyyyy 发表于 2025-5-11 00:09:26

感谢分享,之后在二手市场找勋章更方便了

柏芸 发表于 2025-5-11 00:16:28

怪不得之前勋章博物馆不能用了,更新后相比之前来说确实要更方便了呢,赞https://img.gamemale.com/album/202404/14/192135uh93px1t3hgp7pgx.gif

ilovepizza 发表于 2025-5-11 00:26:47

感謝分享
現在看二手市場不用這麼麻煩了

油漆王 发表于 2025-5-11 00:47:57

可以可以,星佬玩勋章真的太牛了,各种高科技手段都用上了,严谨!

娱乐伙伴琴键猴 发表于 2025-5-11 00:54:15

现在使用的脚本越来越多了,脚本之间的兼容性也是需要考量的内容了

毛茸茸兽兽 发表于 2025-5-11 00:54:27

吼(´×ω×`)看着是修复bug版本吧~
喝茶ing好勋章一般都露头就没了吧,还是得熟悉一些稀有勋章的

ComParo 发表于 2025-5-11 00:55:22

能兼容传送门真是太好了,之前还以为是自己电脑的问题呢

Riverlethe 发表于 2025-5-11 00:57:13

勋章越积累越多的时候想要的好东西很难在二手露面。

cinder 发表于 2025-5-11 01:25:45

感謝大老持續更新腳本,
程式衝突真的是很麻煩./w\

要有礼帽 发表于 2025-5-11 01:54:18

本人完全不懂代码什么的,只能说大佬nb

Kogenta 发表于 2025-5-11 01:54:57

二手情况查询x
赔钱货一览   ✓

相见忧 发表于 2025-5-11 03:32:56

挺好的,可以为不熟悉的萌新快速找到勋章属性

you9632587 发表于 2025-5-11 07:22:34

兼容确实挺重要的,不过其实现在二手已经很难买到好东西了

lishan 发表于 2025-5-11 09:16:25

ds写脚本还是有一手的~ 每每留意二手勋章还是太麻烦了, 这个倒是可以解决一部分问题~

诺鸦cc 发表于 2025-5-11 12:55:41

感谢楼主优化脚本
二手勋章能买的合适的还蛮难的)这个很好用~

2297988 发表于 2025-5-11 15:44:33

能够兼容真的是太好了XD,方便筛选好东西和赔钱货,是很大的功能提升呢~~
感谢星佬的分享~~

KurisuV 发表于 2025-5-11 17:41:02

感谢楼主技术分享惹,能兼容传送门就很方便了,可以帮助萌新快速熟悉勋章
页: [1] 2
查看完整版本: 【油猴脚本】二手市场寄售情况统计(兼容博物馆传送门)