GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 2743|回复: 33
收起左侧

[功能优化] 【英雄再聚】快速统计英雄再聚活动队伍选择的脚本

  [复制链接] |关注本帖

组件大师

     楼主| 咸鱼鱼 发表于 2024-10-7 21:49:47 | 显示全部楼层 |阅读模式 <
    本帖最后由 咸鱼鱼 于 2024-10-8 09:19 编辑

    10.8更新了一下,因为主楼多了个队伍名,会识别错误
    昨天弄了个腾讯文档表格,写了个半成品脚本方便自己更新

    今天中午睡觉一觉,发现有好心人默默更新
    连忙把自己写的半成品脚本优化了一下发出来一起用
    主要是一个一个用眼睛看是在太累了,试试这个把


    安装完成之后点击导出excel就好了




    @Name

    1. // ==UserScript==
    2. // @name         GM论坛英雄再聚活动统计脚本
    3. // @namespace    http://tampermonkey.net/
    4. // @version      0.1
    5. // @description  Fetch data and export to Excel
    6. // @author       Your Name
    7. // @match        https://www.gamemale.com/forum.php?mod=viewthread&tid=145160*
    8. // @match        https://www.gamemale.com/thread-145160-*
    9. // @match        https://www.gamemale.com/forum.php?mod=redirect&goto=findpost&ptid=145160*
    10. // @grant        GM_xmlhttpRequest
    11. // @require      https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.17.0/xlsx.full.min.js
    12. // @grant        GM_registerMenuCommand
    13. // ==/UserScript==

    14. (function () {
    15.     'use strict';
    16.     const teams = [
    17.         "全都队", "仗剑走天涯队", "色令智昏队", "喵喵讨伐魔王队",
    18.         "小怪兽骑飞机队", "无畏猪猪队", "脑子很好但是我没有队", "稳如老狗队",
    19.         "獭獭观察队", "做得很队", "烧仙草队", "金曦遗辉队",
    20.         "猛兽出击队", "六丁六甲队", "躺着过节队", "沉默社畜队",
    21.         "背背山队", "国庆七天乐队", "Cowboy Bebope队", "鲤鱼入后门队",
    22.         "博闻广记分队", "只要努力就一定会成功的对不队", "同路英雄团",
    23.         "菜鸟被掀飞队", "龙颜大悦队", "天选之子队", "关西双虎队",
    24.         "旅行房车队", "成步堂万能事务所", "魔王勇者一家亲队",
    25.         "祈愿者队", "狂欢之椅队", "濡湿小镰刀队"
    26.     ];
    27.     const day1 = ["熔岩魔犬", "毒焰小鬼", "沼气元素"];
    28.     const equip = ["彩虹长剑", "寒冰骑枪", "飓风锁链"]
    29.     const equip2 = ["胜利徽章", "勇气徽章"]
    30.     const ulr1 = 'https://www.gamemale.com/thread-145160-1-1.html';
    31.     const ulr2 = 'https://www.gamemale.com/thread-145160-2-1.html';
    32.     const results = [];

    33.     function fetchAndParse(url) {
    34.         return new Promise((resolve, reject) => {
    35.             GM_xmlhttpRequest({
    36.                 method: "GET",
    37.                 url: url,
    38.                 onload: function (response) {
    39.                     if (response.status === 200) {
    40.                         const parser = new DOMParser();
    41.                         const doc = parser.parseFromString(response.responseText, 'text/html');

    42.                         const contentElements = doc.querySelectorAll('.plc .t_f')
    43.                         const urlResults = [];

    44.                         contentElements.forEach(element => {
    45.                             const innerHTML = element.innerText;

    46.                             const result = {};

    47.                             const foundKeywords = findKeywordsInString(innerHTML, teams);
    48.                             result['队伍名'] = foundKeywords.join('')


    49.                             if (result['队伍名']) {
    50.                                 const equipmentMatch = innerHTML.match(/当前持有装备【(.*?)】/);
    51.                                 result['持有装备'] = equipmentMatch ? equipmentMatch[1].trim() : '无';

    52.                                 // 每日攻击结果
    53.                                 const attackTargets = getAttackTargets(innerHTML, true)
    54.                                 Object.assign(result, attackTargets);

    55.                                 // 使用消耗物品
    56.                                 const courageBadgeDays = extractDays(innerHTML, '勇气徽章');
    57.                                 const victoryBadgeDays = extractDays(innerHTML, '胜利徽章');
    58.                                 Object.assign(result, {
    59.                                     勇气徽章: courageBadgeDays.join(','),
    60.                                     胜利徽章: victoryBadgeDays.join(',')
    61.                                 });
    62.                                 urlResults.push(result);
    63.                             }
    64.                         });

    65.                         resolve(urlResults);
    66.                     } else {
    67.                         reject(new Error("Network response was not ok"));
    68.                     }
    69.                 },
    70.                 onerror: function () {
    71.                     reject(new Error("Network request failed"));
    72.                 }
    73.             });
    74.         });
    75.     }

    76.     // 定义一个函数,通过参数控制是否倒序
    77.     function getAttackTargets(innerHTML, isReverse = false) {
    78.         // 匹配攻击目标
    79.         const attackTargetMatch = innerHTML.match(/攻击目标.*?【(.*?)】/g);
    80.         if (!attackTargetMatch) return {}

    81.         const targetNames = attackTargetMatch.map(item => item.match(/【(.*?)】/)[1]);

    82.         // 创建 result 对象
    83.         const result = {};

    84.         // 按照 index 存入 result
    85.         targetNames.forEach((name, index) => {
    86.             result[`攻击目标Day${index + 1}`] = name;
    87.         });

    88.         // 如果需要倒序
    89.         if (isReverse) {
    90.             const reversedResult = {};
    91.             const keys = Object.keys(result).reverse();

    92.             keys.forEach(key => {
    93.                 reversedResult[key] = result[key];
    94.             });
    95.             return reversedResult;
    96.         }

    97.         return result;
    98.     }

    99.     function exportToExcel(data, filename) {
    100.         const worksheet = XLSX.utils.json_to_sheet(data);
    101.         const workbook = XLSX.utils.book_new();
    102.         XLSX.utils.book_append_sheet(workbook, worksheet, "Results");
    103.         XLSX.writeFile(workbook, filename);
    104.     }

    105.     Promise.all([fetchAndParse(ulr1), fetchAndParse(ulr2)])
    106.         .then(allResults => {
    107.             allResults.forEach(urlResults => {
    108.                 results.push(...urlResults);
    109.             });
    110.             // 导出结果为 Excel 文件
    111.             // exportToExcel(results, 'game_results.xlsx');
    112.             const countAttack = countAttackTargets(results, 'object')
    113.             results.unshift(countAttack);
    114.             // results.push(countAttack)
    115.             console.log(results)
    116.             console.log(countAttack);

    117.             // 添加菜单命令
    118.             GM_registerMenuCommand("导出到 Excel", function () {
    119.                 exportToExcel(results, 'game_results.xlsx');
    120.             });


    121.         })
    122.         .catch(error => {
    123.             console.error('There has been a problem with your fetch operation:', error);
    124.         });



    125.     // 查找包含在字符串中的关键词
    126.     function findKeywordsInString(string, array) {
    127.         // 找到 "DAY1" 的位置
    128.         const day1Index = string.indexOf('DAY1');

    129.         // 如果找到 "DAY1",则截取字符串,否则使用原字符串
    130.         const searchString = day1Index !== -1 ? string.substring(0, day1Index) : string;

    131.         // 使用 filter 过滤出存在于截取后的字符串中的关键词
    132.         return array.filter(keyword => searchString.includes(keyword));
    133.     }

    134.     // 计算每天多少个攻击对象
    135.     function countAttackTargets(results, outputFormat = 'object') {
    136.         // 定义攻击目标
    137.         const targets = [
    138.             '攻击目标Day7',
    139.             '攻击目标Day6',
    140.             '攻击目标Day5',
    141.             '攻击目标Day4',
    142.             '攻击目标Day3',
    143.             '攻击目标Day2',
    144.             '攻击目标Day1'
    145.         ]


    146.         // 创建一个对象用于存储每个攻击目标的计数
    147.         const countTargets = { '队伍名': '合计', '持有装备': null };

    148.         // 初始化计数为 0
    149.         targets.forEach(target => {
    150.             countTargets[target] = 0;
    151.         });

    152.         // 计算每个攻击目标的数量
    153.         results.forEach(obj => {
    154.             targets.forEach(target => {
    155.                 if (obj.hasOwnProperty(target)) {
    156.                     countTargets[target]++;
    157.                 }
    158.             });
    159.         });

    160.         // 根据输出格式返回结果
    161.         if (outputFormat === 'array') {
    162.             return targets
    163.                 .map(target => ({
    164.                     target: target,
    165.                     count: countTargets[target]
    166.                 }))
    167.                 .filter(item => item.count > 0); // 过滤掉计数为 0 的项
    168.         } else {
    169.             // 在对象格式中,删除计数为 0 的项
    170.             for (const target of targets) {
    171.                 if (countTargets[target] === 0) {
    172.                     delete countTargets[target];
    173.                 }
    174.             }
    175.             return countTargets;
    176.         }
    177.     }


    178.     // 函数用于提取特定徽章的日期
    179.     function extractDays(innerHTML, badgeName) {
    180.         // 按照 "DAY" 切分成多个部分
    181.         const days = innerHTML.split(/DAY/).slice(1); // 第0项是空字符串,忽略

    182.         const badgeDays = [];

    183.         days.forEach(day => {
    184.             if (day.includes(badgeName)) {
    185.                 // 如果当前天数包含徽章名称,提取对应的天数
    186.                 const dayNumber = day.trim().split('\n')[0]; // 获取第一行,即 DAYX
    187.                 badgeDays.push(`DAY${dayNumber}`);
    188.             }
    189.         });

    190.         return badgeDays;
    191.     }


    192.     const innerHTML = `
    193. DAY1
    194. 今日使用【黄色结晶】×3,【青色结晶】×3,兑换【奥法之书】
    195. 当前持有装备【奥法之书】
    196. 攻击目标【沼气元素】风,防御1,HP50
    197. 基础伤害-防御减伤+装备加成=结算伤害
    198. 5-0+0=5


    199. DAY2
    200. 今日使用【红色结晶】×1,兑换【勇气徽章】
    201. 当前持有装备【奥法之书】【勇气徽章】
    202. 攻击目标【污水元素】,水,防御0,HP40
    203. 基础伤害-防御减伤+装备加成=结算伤害
    204. 5-0+2=7

    205. DAY3
    206. 今日使用【红色结晶】×1,兑换【胜利徽章】
    207. 当前持有装备【奥法之书】【胜利徽章】
    208. 攻击目标【污水元素】,水,防御0,HP40
    209. 基础伤害-防御减伤+装备加成=结算伤害
    210. 5-0+2=7

    211. DAY4
    212. 今日使用【红色结晶】×1,兑换【勇气徽章】
    213. 当前持有装备【奥法之书】【勇气徽章】
    214. 攻击目标【污水元素】,水,防御0,HP40
    215. 基础伤害-防御减伤+装备加成=结算伤害
    216. 5-0+2=7
    217. `


    218. })();
    复制代码




    本帖子中包含更多资源

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

    x

    评分

    参与人数 6血液 +12 追随 +6 堕落 +2 收起 理由
    木浪 + 1
    ☆Yuki☆ + 1
    油漆王 + 1
    星之子 + 5 + 1 + 1 (*/ω\*)
    Morphyus + 5 + 1 + 1
    zzy159 + 2 + 1 赞一个!

    查看全部评分

    回复

    使用道具 举报

    Lvl. 10 · I

    GM活动员

    漂洋小船冒险用指南针破损的旧书人鱼之泪雪王的心脏苏格兰圆脸胖鸡[Pro Max]丛林的鸟飞走了不曾寄出的信件幽灵竹筒『随时随地开启!』

      凯诺斯 发表于 2024-10-7 21:59:56 | 显示全部楼层 <
      回复

      使用道具 举报

      更多的珍珠猫咪点唱机桂花米糕不灭的蓝宝石被释放的灵魂红心玉『搓粉团珠』脉律辐石龙鳞石检定场

        zzy159 发表于 2024-10-7 22:03:28 | 显示全部楼层 <
        回复

        使用道具 举报

        巴哈姆特虚空之海的鲸男巫之歌

          sanweny 发表于 2024-10-7 22:06:13 | 显示全部楼层 <
          回复

          使用道具 举报

          剑指撒冷凯登‧阿兰科诺曼底号猎户座的明珠缘起星空赛博朋克2077自定义男从Homunculus检定场命运的轮廓旅行骰子!

            Morphyus 发表于 2024-10-7 22:11:41 | 显示全部楼层 <
            回复

            使用道具 举报

            弗雷迪玩偶发条八音盒桂花米糕鎏彩万幢女巫之路虚空之海的鲸【新春限定】果体 隆『召唤好运的角笛』永远的克叔業火死鬥

              娱乐法师火布偶 发表于 2024-10-7 22:21:32 | 显示全部楼层 <
              回复

              使用道具 举报

                user_login 发表于 2024-10-7 22:30:34 | 显示全部楼层 <
                昨天用java写了个自动监控的
                队伍名匹配就麻烦,亚洛斯队长把名字放在【】外,还有后面有不以”队“结束的。
                还因为某个队伍的攻击目标修改正则

                评分

                参与人数 1堕落 +1 收起 理由
                黑达克 + 1 不队不队

                查看全部评分

                回复

                使用道具 举报

                【圣诞限定】心心念念小雪人吃饱金币的Doge被释放的灵魂【新春限定】果体 隆業火死鬥男巫之歌虚空之海的鲸卡利亚权杖诺曼底号

                  折木 发表于 2024-10-7 22:37:51 | 显示全部楼层 <
                  回复

                  使用道具 举报

                  永浴爱河虚空之海的鲸不灭狂雷業火死鬥泰比里厄斯阿怪征服之王

                    silencedonkey 发表于 2024-10-7 22:49:08 | 显示全部楼层 <
                    回复

                    使用道具 举报

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

                      毛茸茸兽兽 发表于 2024-10-7 23:02:27 | 显示全部楼层 <
                      吼吼~看u老师的话,以后还是建议都按xxx队格式好咯
                      回复

                      使用道具 举报

                      亚索月影狼晓月终焉旅行骰子!卡利亚权杖

                        黑达克 发表于 2024-10-7 23:40:25 | 显示全部楼层 <
                        回复

                        使用道具 举报

                        泰比里厄斯追忆Zootopia官复原职实现梦想不为人知的小秘密呆猫弗雷迪玩偶GM吸血伯爵夏日柯基

                          桀桀桀 发表于 2024-10-7 23:42:56 | 显示全部楼层 <
                          回复

                          使用道具 举报

                          不灭的蓝宝石神人的编制发森林鹿夏日柯基吃饱的小阿尔『逆境中的幸运女神』幸运女神的微笑小丑与格雷与星光璀璨

                            仿生人2778号 发表于 2024-10-7 23:51:00 | 显示全部楼层 <
                            回复

                            使用道具 举报

                            最终幻想XIV最终幻想XVI赛博朋克2077丹妮莉丝·坦格利安希尔瓦娜斯·风行者官复原职塞巴斯蒂安·斯坦杰森‧斯坦森荒野大镖客:救赎 II

                              tuxonstar 发表于 2024-10-8 00:08:31 | 显示全部楼层 <
                              回复

                              使用道具 举报

                              鎏彩万幢传奇都市:天际线2刀锋女王 - 归宿丹妮莉丝·坦格利安官复原职实现梦想丹雀衔五穗,人间始丰登Zootopia最终幻想XVI

                                娱乐伙伴琴键猴 发表于 2024-10-8 00:28:43 | 显示全部楼层 <
                                回复

                                使用道具 举报

                                男巫之歌缘起星空信仰之心不灭狂雷『不败之花』【新春限定】果体 隆红心玉情难自抑崩朽之青铜龙王You Can Pet Blaidd

                                  Freeze123 发表于 2024-10-8 01:52:47 | 显示全部楼层 <
                                  回复

                                  使用道具 举报

                                  炽焰咆哮虎裸体克里斯弗雷迪玩偶果体76发条八音盒猫化弩哥王者之盾自定义男从Homunculus肥皂

                                    油漆王 发表于 2024-10-8 02:11:53 | 显示全部楼层 <
                                    回复

                                    使用道具 举报

                                    命运的轮廓检定场『狄文卡德的残羽』『厢庭望远』万众瞩目『搓粉团珠』神奇宝贝图鉴神奇宝贝大师球雪王的心脏肉垫手套

                                      zhuovboyan 发表于 2024-10-8 04:47:31 | 显示全部楼层 <
                                      回复

                                      使用道具 举报

                                      百相千面-戏艾吉奥岛田半藏诺克提斯·路西斯·伽拉姆萨菲罗斯岛田源氏BIG BOSS康纳/ConnorDoc普隆普特·阿金塔姆

                                        2302594 发表于 2024-10-8 06:47:27 | 显示全部楼层 <
                                        回复

                                        使用道具 举报

                                        缘起星空虚空之海的鲸

                                          you9632587 发表于 2024-10-8 08:38:40 | 显示全部楼层 <
                                          回复

                                          使用道具 举报

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

                                          本版积分规则

                                          关闭

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

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

                                          GMT+8, 2025-12-7 09:39 , Processed in 0.138871 second(s), 144 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表