GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1025|回复: 41
收起左侧

[功能优化] 【油猴脚本】把“勛章信息 - 即時動態”插入勋章商城页

[复制链接] |关注本帖

咆哮虎的冠军之路裸体克里斯圣甲虫秘典永远的克叔【新春限定】果体 隆新神的赐福凯登‧阿兰科隐秘的讯息魂灵魔典炙热的格拉迪欧拉斯

     楼主| 星之子 发表于 前天 17:35 | 显示全部楼层 |阅读模式 <
    动机
    有一个官方的勋章交易帖,就在勋章公会板块下的“【勛章信息 - 即時動態】”这里。哪怕是对勋章已经有了一定的了解,也可能不常看,甚至根本不知道有这个帖子。
    由于论坛是基于Discuz!架构,没法达到即时通讯软件那样的时效性,所以在这里回复内容已经算是最高效的方法了。

    功能

    这个脚本在“勋章商城”主页面增加了一个小窗口,会直接出现在 https://www.gamemale.com/wodexunzhang-showxunzhang.html 页面的 #div.myfenleilist.clearfix.myfenleilist_1 元素前。这张图片会展示地更加一目了然:


    代码

    @Name  @Match  @Icon
    1. // ==UserScript==
    2. // @name         勋章:把[勛章信息 - 即時動態]插入勋章商城页
    3. // @namespace    https://www.gamemale.com/
    4. // @version      1.0.0
    5. // @description  在访问“我的勋章”页面时,将论坛页的 #livethread(即时动态)插入到 #div.myfenleilist.clearfix.myfenleilist_1 前,并尽量保留全部功能(刷新、回复等)。
    6. // @match        https://www.gamemale.com/wodexunzhang-showxunzhang.html
    7. // @run-at       document-end
    8. // @grant        none
    9. // ==/UserScript==

    10. (function () {
    11.   'use strict';

    12.   const SOURCE_URL = 'https://www.gamemale.com/forum-128-1.html';
    13.   const TARGET_SELECTOR ='div.myfenleilist.clearfix.myfenleilist_1';
    14.   const INSERT_BEFORE = true;

    15.   function log(...args) {
    16.     console.log('[GM-livethread]', ...args);
    17.   }

    18.   function waitForElement(selector, timeoutMs = 15000) {
    19.     return new Promise((resolve, reject) => {
    20.       const el = document.querySelector(selector);
    21.       if (el) return resolve(el);

    22.       const obs = new MutationObserver(() => {
    23.         const el2 = document.querySelector(selector);
    24.         if (el2) {
    25.           obs.disconnect();
    26.           resolve(el2);
    27.         }
    28.       });

    29.       obs.observe(document.documentElement, { childList: true, subtree: true });

    30.       setTimeout(() => {
    31.         obs.disconnect();
    32.         reject(new Error('Timeout waiting for ' + selector));
    33.       }, timeoutMs);
    34.     });
    35.   }

    36.   function createHostBox() {
    37.     const host = document.createElement('div');
    38.     host.id = 'gm_livethread_host';
    39.     host.style.margin = '12px 0';
    40.     host.style.border = '1px solid #e5e5e5';
    41.     host.style.borderRadius = '8px';
    42.     host.style.overflow = 'hidden';
    43.     host.style.background = '#fff';

    44.     const iframe = document.createElement('iframe');
    45.     iframe.id = 'gm_livethread_iframe';
    46.     iframe.src = SOURCE_URL;
    47.     iframe.style.width = '100%';
    48.     iframe.style.border = '0';
    49.     iframe.style.display = 'block';
    50.     iframe.style.height = '0px'; // 初始高度,加载后会自动调
    51.     iframe.referrerPolicy = 'no-referrer-when-downgrade';

    52.     host.appendChild(iframe);

    53.     return { host, iframe };
    54.   }

    55.   function cropIframeToLiveThread(iframe) {
    56.     iframe.addEventListener('load', () => {
    57.       try {
    58.         const doc = iframe.contentDocument;
    59.         const win = iframe.contentWindow;
    60.         if (!doc) return;

    61.         const live = doc.querySelector('#livethread');
    62.         if (!live) {
    63.           log('iframe内未找到 #livethread,可能页面结构变了。');
    64.           return;
    65.         }

    66.         // 注入样式:隐藏其他所有内容,只展示 #livethread
    67.         const style = doc.createElement('style');
    68.         style.textContent = `
    69.           html, body { margin: 0 !important; padding: 0 !important; background: transparent !important; }
    70.           body > * { display: none !important; }
    71.           #livethread { display: block !important; margin: 0 !important; }
    72.           /* 让它在“我的勋章”页更贴合 */
    73.           #livethread { padding: 10px 12px !important; }
    74.           #livethread .livethreadtitle img { vertical-align: middle; }
    75.         `;
    76.         doc.head.appendChild(style);

    77.         // 把 #livethread 挪到 body 直接子级(避免它原本嵌套导致 body>* 隐藏规则误伤)
    78.         // 注意:这样仍然在同一个页面环境内,功能不会丢。
    79.         if (live.parentElement !== doc.body) {
    80.           doc.body.appendChild(live);
    81.         }

    82.         // 自动高度:随内容变化而变
    83.         const resize = () => {
    84.           // 给一点余量,避免滚动条闪烁
    85.           const h = Math.max(200, live.scrollHeight + 24);
    86.           iframe.style.height = h + 'px';
    87.         };

    88.         resize();

    89.         // 监听内容变化:新回复、展开等
    90.         const mo = new MutationObserver(() => resize());
    91.         mo.observe(live, { childList: true, subtree: true, characterData: true });

    92.         // 更稳妥:ResizeObserver(如果浏览器支持)
    93.         if ('ResizeObserver' in win) {
    94.           const ro = new win.ResizeObserver(() => resize());
    95.           ro.observe(live);
    96.         }

    97.         // 兜底:定时修正(避免某些异步资源加载导致高度不准)
    98.         let ticks = 0;
    99.         const timer = win.setInterval(() => {
    100.           resize();
    101.           ticks += 1;
    102.           if (ticks >= 20) win.clearInterval(timer);
    103.         }, 500);

    104.         log('已裁剪并嵌入 #livethread');
    105.       } catch (e) {
    106.         log('裁剪iframe失败:', e);
    107.         // 常见原因:X-Frame-Options / CSP 阻止、或跨域(一般同域不会)
    108.       }
    109.     });
    110.   }

    111.   (async function main() {
    112.     // 避免重复插入
    113.     if (document.querySelector('#gm_livethread_host')) return;

    114.     let target;
    115.     try {
    116.       target = await waitForElement(TARGET_SELECTOR);
    117.     } catch (e) {
    118.       console.warn('[GM-livethread] 未找到网页②插入点元素:', TARGET_SELECTOR, e);
    119.       return;
    120.     }

    121.     const { host, iframe } = createHostBox();

    122.     // 插入到目标前
    123.     if (INSERT_BEFORE && target.parentNode) {
    124.       target.parentNode.insertBefore(host, target);
    125.     } else {
    126.       target.prepend(host);
    127.     }

    128.     cropIframeToLiveThread(iframe);
    129.   })();

    130. })();
    复制代码



    来自群组: 星象占卜

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 1血液 +1 收起 理由
    1417432518 + 1

    查看全部评分

    回复

    使用道具 举报

    光明奇幻木偶『天圆地方』Amicus鎏彩万幢女巫之路虚空之海的鲸永远的克叔業火死鬥实现梦想官复原职

      娱乐法师火布偶 发表于 前天 17:38 | 显示全部楼层 <
      回复

      使用道具 举报

      永远的克叔极·龙の意新神的赐福官复原职实现梦想亚瑟‧摩根传奇業火死鬥虚空之海的鲸不朽之恋

        2297988 发表于 前天 17:42 | 显示全部楼层 <
        其实可以关注帖子,不过只能关注到最新回复而且很多都是没用消息所以就放弃了
        看到这个脚本感觉眼前一亮=3=~
        回复

        使用道具 举报

        自定义男从Homunculus【夏日限定】夏日的泰凯斯永远的克叔虚空之海的鲸果体76『天圆地方』猫咪点唱机Amicus光明奇幻木偶

          PURO_ 发表于 前天 17:49 | 显示全部楼层 <
          补货之后是勋章交换的高峰期,可以选择在那个时间点打开这个脚本,能更方便一点呢
          回复

          使用道具 举报

          鎏彩万幢牧羊人呆猫传说中的黑龙灯载情绵眼镜蛇图腾GM論壇初心者畢業證書

            KlausVReinherz 发表于 前天 18:15 | 显示全部楼层 <
            回复

            使用道具 举报

            近地夜航雷文克劳『天圆地方』Amicus光明奇幻木偶遭遇死神诺克提斯·路西斯·伽拉姆Beauty and the Beast

              Rolf_0 发表于 前天 18:16 | 显示全部楼层 <
              回复

              使用道具 举报

              Futūrum(未来)神奇宝贝大师球果体76呆猫炙热的格拉迪欧拉斯永远的克叔亭亭如盖光之少女の魔法书圣甲虫秘典死灵之书

                Makima 发表于 前天 18:21 | 显示全部楼层 <
                回复

                使用道具 举报

                阿努比斯信徒

                  野生阿努厨 发表于 前天 18:22 | 显示全部楼层 <
                  致远星战况激烈,我也是火星人……原来还真的有坛内勋章交易渠道,还以为必须进什么群之类的,火速上了脚本
                  回复

                  使用道具 举报

                  自定义男从Homunculus诺克提斯·路西斯·伽拉姆Forever Titanic钢铁侠永远的克叔【夏日限定】夏日的泰凯斯极·龙の意苏格兰圆脸胖鸡[Pro Max]虚空之海的鲸史莱姆牧场

                    轮回2L 发表于 前天 18:28 | 显示全部楼层 <
                    回复

                    使用道具 举报

                    帅气的本・比格Amicus肉乖乖光明奇幻木偶『天圆地方』弗雷迪玩偶遗留之人的城堡吃饱金币的Doge夏日柯基永远的克叔

                      zibatco2 发表于 前天 18:30 | 显示全部楼层 <
                      还真没什么注意有这个勋章交易帖~小插件方进去确实更直观不少惹呢~感谢大佬分享
                      回复

                      使用道具 举报

                      炼金之心收到情书神秘商店贵宾卡诺克提斯·路西斯·伽拉姆亚当‧简森詹米·多南双贤辉石头罩

                        Se7en 发表于 前天 18:32 | 显示全部楼层 <
                        回复

                        使用道具 举报

                        时间变异管理局双重身份邦尼尼不灭狂雷人鱼之泪帅气的本・比格弗雷迪玩偶妙手空空

                          盘上雷 发表于 前天 19:00 | 显示全部楼层 <
                          回复

                          使用道具 举报

                          我的天使GM吸血伯爵吃饱金币的Doge苏格兰圆脸胖鸡小小舞台守卫: 坚守眼位永浴爱河肉垫手套御医神兔『搓粉团珠』

                            毛茸茸兽兽 发表于 前天 19:06 | 显示全部楼层 <
                            回复

                            使用道具 举报

                            召唤古代战士救命饮料『天圆地方』Amicus捡到了肥皂千杯不醉萨赫的蛋糕神秘商店贵宾卡变骚喷雾水泡术

                              赴约波波 发表于 前天 19:08 | 显示全部楼层 <
                              回复

                              使用道具 举报

                              業火死鬥传奇竹取物语Amicus虚空之海的鲸『厢庭望远』『搓粉团珠』『天圆地方』缘起星空鎏彩万幢

                                柏芸 发表于 前天 19:09 | 显示全部楼层 <
                                感觉是好东西啊这,只不过最近大家的交换欲望确实是低了不少,更何况我想要的目前基本没什么人换
                                  收起(2)
                                回复

                                使用道具 举报

                                这是怎么辉石呢

                                  DIMDANMAS 发表于 前天 19:11 | 显示全部楼层 <
                                  回复

                                  使用道具 举报

                                  【夏日限定】夏日的泰凯斯裸体克里斯男用贞操带不曾寄出的信件破损的旧书雪王的心脏幽灵竹筒冒险用指南针GM論壇榮譽勛章龙腾世纪:审判

                                    crino66666 发表于 前天 19:52 | 显示全部楼层 <
                                    回复

                                    使用道具 举报

                                    牧羊人小菜鸟GM論壇初心者畢業證書寻觅【新手友好】昆進

                                      aaaa4644 发表于 前天 19:56 | 显示全部楼层 <
                                      回复

                                      使用道具 举报

                                      宵眼定死猎个痛快!『搓粉团珠』帅气的本・比格呆猫炽焰咆哮虎虚空之海的鲸传奇亚瑟‧摩根

                                        克莱因蓝 发表于 前天 20:12 | 显示全部楼层 <
                                        回复

                                        使用道具 举报

                                        卡斯迪奥我的路从时间蜿蜒而出男巫之歌女巫之路『伊黎丝的赞美词』『星河碎片』『流星赶月:宙刃』『林中过夜』『厢庭望远』幸运女神的微笑

                                          Hadley0T 发表于 前天 20:18 | 显示全部楼层 <
                                          这样的话其实我觉得只限定在二手市场会更好,商城抢勋章时加载容易浪费时间来着,
                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          关闭

                                          站长公告上一条 /1 下一条

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2026-2-3 01:29 , Processed in 0.152672 second(s), 146 queries , Redis On.

                                          Copyright © 2013-2026 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表