GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

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

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

  [复制链接] |关注本帖

最终幻想XIV『逆境中的幸运女神』苍穹禁城琉璃玉坠黄金树的恩惠炽天使之拥森林鹿夏日柯基苏醒的格罗姆

     楼主| 咸鱼鱼 发表于 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 赞一个!

    查看全部评分

    回复

    使用道具 举报

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

      回复

      使用道具 举报

      驱逐吉尔·沃瑞克近地夜航风物长宜Forever Titanic裸体克里斯梅克军徽朴素的誓言无瑕的回忆被释放的灵魂

        回复

        使用道具 举报

        黄金树的恩惠我的冶金打火机阿拉喵?神灯双向圣杯:焕然意志『逆境中的幸运女神』阿怪小小安全帽金牌矿工幸运女神的微笑

          回复

          使用道具 举报

          不洁圣子璀璨金币小丑与格雷与星光璀璨牌中小丑 · 呼之欲出镜中小鸟无尽的怀表幸运女神的微笑遗留之人的城堡诞星之所

            回复

            使用道具 举报

            百相千面-晦永远的克叔業火死鬥实现梦想官复原职虚空之海的鲸Zootopia幸运女神的微笑『逆境中的幸运女神』御医神兔

              回复

              使用道具 举报

              无瑕的回忆镜中小鸟香蕉特饮40x43 隐形➀香喷喷的烤鸡月影狼

                昨天用java写了个自动监控的
                队伍名匹配就麻烦,亚洛斯队长把名字放在【】外,还有后面有不以”队“结束的。
                还因为某个队伍的攻击目标修改正则

                评分

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

                查看全部评分

                回复

                使用道具 举报

                火柴 - Gamemale萨菲罗斯炽天使之拥亚索诺克提斯·路西斯·伽拉姆官复原职璀璨之焰業火死鬥虚空之海的鲸

                  回复

                  使用道具 举报

                  收到情书朴素的誓言无瑕的回忆業火死鬥永浴爱河泰比里厄斯虚空之海的鲸实现梦想净化污秽的天照阿怪

                    回复

                    使用道具 举报

                    我的天使GM吸血伯爵吃饱金币的Doge阿拉喵?神灯和你一起飞行的皮卡丘小小舞台永浴爱河

                      吼吼~看u老师的话,以后还是建议都按xxx队格式好咯
                      回复

                      使用道具 举报

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

                        回复

                        使用道具 举报

                        近地夜航龙腾世纪:审判辐射:新维加斯月光骑士月光骑士瑞雪兆丰年,生灵万物新超人九尾妖狐·阿狸

                          回复

                          使用道具 举报

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

                            回复

                            使用道具 举报

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

                              回复

                              使用道具 举报

                              石鬼面小丑与格雷与星光璀璨岛田半藏岛田源氏刀锋女王 - 归宿丹妮莉丝·坦格利安官复原职实现梦想瑞雪兆丰年,生灵万物新

                                回复

                                使用道具 举报

                                男巫之歌缘起星空信仰之心不灭狂雷『不败之花』情难自抑崩朽之青铜龙王泰比里厄斯業火死鬥永远的克叔

                                  回复

                                  使用道具 举报

                                  无瑕的回忆裸体克里斯克里斯·埃文斯王者之盾BIG BOSSDrover猫化弩哥索尔·奥丁森小丑与格雷与星光璀璨

                                    回复

                                    使用道具 举报

                                    『住在GM村』格拉迪欧拉斯雪王的心脏『星河碎片』『灰域来音』预知水晶球炽天使之拥『伊黎丝的赞词』纯真护剑『随时随地开启!』

                                      回复

                                      使用道具 举报

                                      弗图AI铁汉柔情诺克提斯·路西斯·伽拉姆普隆普特·阿金塔姆不屈之枪·阿特瑞斯神灯月光骑士巴基超人

                                        回复

                                        使用道具 举报

                                        缘起星空虚空之海的鲸

                                          回复

                                          使用道具 举报

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

                                          本版积分规则

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

                                          GMT+8, 2024-12-21 22:31 , Processed in 0.145838 second(s), 143 queries , Redis On.

                                          Copyright © 2013-2024 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表