// ==UserScript== // @name 逆战活动工具箱 // @namespace https://nz.qq.com/ // @version 1.2 // @description 逆战活动自动领取助手 // @author 逆战-牢鹊 // @match https://nz.qq.com/* // @grant GM_log // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @run-at document-end // @icon https://nz.qq.com/favicon.ico // @license MIT // @unwrap // ==/UserScript== (() => { 'use strict'; const ACTIVITY_CONFIGS = [ { id: 'nz_gala_202512', name: '感恩福利大放送', icon: '🎁', url: 'https://nz.qq.com/cp/a20251202gegala/', urlRegex: /a20251202gegala/, steps: [ // 抽取一次(每日登录) { name: '自动抽奖', func: 'autoClick', param: '#part1_used_1', delay: 3000 }, { name: '关闭抽奖弹窗', func: 'closePopup', param: '抽奖', delay: 1800 }, // 每日登录升一级 { name: '每日升一级', func: 'autoClick', param: '#part2_used1_1', delay: 1000 }, { name: '关闭每日升级弹窗', func: 'closePopup', param: '每日升级', delay: 1800 }, // 每周游玩三天升三级 { name: '每周升三级', func: 'autoClick', param: '#part2_used1_2', delay: 1000 }, { name: '关闭每周升级弹窗', func: 'closePopup', param: '每周升级', delay: 1800 }, // 热力等级LV3领取 { name: '领取热力等级LV3', func: 'autoClick', param: '#part2_used2_1', delay: 1000 }, { name: '关闭LV3领取弹窗', func: 'closePopup', param: '热力等级LV3', delay: 1800 }, // 热力等级LV6领取 { name: '领取热力等级LV6', func: 'autoClick', param: '#part2_used2_2', delay: 1000 }, { name: '关闭LV6领取弹窗', func: 'closePopup', param: '热力等级LV6', delay: 1800 }, // 热力等级LV9领取 { name: '领取热力等级LV9', func: 'autoClick', param: '#part2_used2_3', delay: 1000 }, { name: '关闭LV9领取弹窗', func: 'closePopup', param: '热力等级LV9', delay: 1800 }, // 热力等级LV12领取 { name: '领取热力等级LV12', func: 'autoClick', param: '#part2_used2_4', delay: 1000 }, { name: '关闭LV12领取弹窗', func: 'closePopup', param: '热力等级LV12', delay: 1800 }, // 热力等级LV15领取 { name: '领取热力等级LV15', func: 'autoClick', param: '#part2_used2_5', delay: 1000 }, { name: '关闭LV15领取弹窗', func: 'closePopup', param: '热力等级LV15', delay: 1800 }, // 立即扫雷 { name: '立即扫雷', func: 'autoClick', param: '.btn_cq:contains("立即扫雷")', delay: 1000 }, { name: '关闭扫雷弹窗', func: 'closePopup', param: '扫雷', delay: 1800 }, // 累计扫雷8次领取 { name: '领取p4GrGet(1)', func: 'autoClick', param: '.btn_cq.isGray3', delay: 1000 }, { name: '关闭p4GrGet(1)弹窗', func: 'closePopup', param: 'p4GrGet(1) 1/8次奖励', delay: 1800 }, // 累计扫雷16次领取 { name: '领取p4GrGet(2)', func: 'autoClick', param: '.btn_cq.isGray4', delay: 1000 }, { name: '关闭p4GrGet(2)弹窗', func: 'closePopup', param: 'p4GrGet(2) 1/16次奖励', delay: 1800 }, // 累计扫雷24次领取 { name: '领取p4GrGet(3)', func: 'autoClick', param: '.btn_cq.isGray5', delay: 1000 }, { name: '关闭p4GrGet(3)弹窗', func: 'closePopup', param: 'p4GrGet(3) 1/24次奖励', delay: 1800 }, // QF累计扫雷8次领取 { name: '领取p4QfGet(1)', func: 'autoClick', param: '.btn_cq.isGray6', delay: 1000 }, { name: '关闭p4QfGet(1)弹窗', func: 'closePopup', param: 'p4QfGet(1) 1/8次奖励', delay: 1800 }, // QF累计扫雷16次领取 { name: '领取p4QfGet(2)', func: 'autoClick', param: '.btn_cq.isGray7', delay: 1000 }, { name: '关闭p4QfGet(2)弹窗', func: 'closePopup', param: 'p4QfGet(2) 1/16次奖励', delay: 1800 }, // QF累计扫雷24次领取 { name: '领取p4QfGet(3)', func: 'autoClick', param: '.btn_cq.isGray8', delay: 1000 }, { name: '关闭p4QfGet(3)弹窗', func: 'closePopup', param: 'p4QfGet(3) 1/24次奖励', delay: 1800 }, ] }, { id: 'nz_celebration_202511', name: '感恩庆典全面开启', icon: '🎉', url: 'https://nz.qq.com/cp/a20251120geqd/?e_code=554044', urlRegex: /a20251120geqd/, steps: [ { name: '立即领取(P1youxiGet)', func: 'autoClick', param: '.p2btn1.isGray1', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: 'P1youxiGet', delay: 1800 }, { name: '分享直播间', func: 'autoClick', param: '.p2btn2:not(.isGray2)', delay: 1000 }, { name: '关闭分享弹窗', func: 'closePopup', param: '分享直播间', delay: 1800 }, { name: '立即领取(P1ShareGet)', func: 'autoClick', param: '.p2btn2.isGray2', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: 'P1ShareGet', delay: 1800 }, { name: '立即领取(P1kanzhiBoGet)', func: 'autoClick', param: '.p2btn1.isGray3', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: 'P1kanzhiBoGet', delay: 1800 }, { name: '立即领取(P1LonginGet)', func: 'autoClick', param: '.p2btn1.isGray4', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: 'P1LonginGet', delay: 1800 }, { name: '立即领取(youxiMapGet(1))', func: 'autoClick', param: '.p2btn1.isGray5', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: 'youxiMapGet(1)', delay: 1800 }, { name: '立即领取(youxiMapGet(2))', func: 'autoClick', param: '.p2btn1.isGray6', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: 'youxiMapGet(2)', delay: 1800 }, { name: '立即领取(youxiMapGet(3))', func: 'autoClick', param: '.p2btn1.isGray7', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: 'youxiMapGet(3)', delay: 1800 }, { name: '立即抽奖(每日登录)', func: 'autoClick', param: '.p3lotbtn1.isGray8', delay: 1000 }, { name: '关闭抽奖弹窗', func: 'closePopup', param: '每日登录抽奖', delay: 1800 }, { name: '抽取一次(完成对局)', func: 'autoClick', param: '.p3lotbtn1.isGray9', delay: 1000 }, { name: '关闭抽取弹窗', func: 'closePopup', param: '完成对局抽奖', delay: 1800 }, { name: '领取奖励(宝箱掉落卡)', func: 'autoClick', param: '.p4btn1.isGray10', delay: 1000 }, { name: '关闭奖励弹窗', func: 'closePopup', param: '宝箱掉落卡', delay: 1800 }, { name: '立即抽取掉落(每周登录)', func: 'autoClick', param: '.p4btn1.isGray11', delay: 1000 }, { name: '关闭抽取弹窗', func: 'closePopup', param: '每周登录抽取', delay: 1800 }, { name: '补打卡(daka1)', func: 'autoClick', param: '.p5btn1.daka1', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '补打卡1', delay: 1800 }, { name: '补打卡(daka2)', func: 'autoClick', param: '.p5btn1.daka2', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '补打卡2', delay: 1800 }, { name: '补打卡(daka3)', func: 'autoClick', param: '.p5btn1.daka3', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '补打卡3', delay: 1800 }, { name: '补打卡(daka4)', func: 'autoClick', param: '.p5btn1.daka4', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '补打卡4', delay: 1800 }, { name: '补打卡(daka5)', func: 'autoClick', param: '.p5btn1.daka5', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '补打卡5', delay: 1800 }, { name: '补打卡(daka6)', func: 'autoClick', param: '.p5btn1.daka6', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '补打卡6', delay: 1800 }, { name: '打卡(daka7)', func: 'autoClick', param: '.p5btn1.daka7', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '打卡7', delay: 1800 }, { name: '打卡8(敬请期待)', func: 'autoClick', param: '.p5btn1.daka8', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '打卡8', delay: 1800 }, { name: '打卡9(敬请期待)', func: 'autoClick', param: '.p5btn1.daka9', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '打卡9', delay: 1800 }, { name: '打卡10(敬请期待)', func: 'autoClick', param: '.p5btn1.daka10', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '打卡10', delay: 1800 }, { name: '打卡11(敬请期待)', func: 'autoClick', param: '.p5btn1.daka11', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '打卡11', delay: 1800 }, { name: '打卡12(敬请期待)', func: 'autoClick', param: '.p5btn1.daka12', delay: 1000 }, { name: '关闭打卡弹窗', func: 'closePopup', param: '打卡12', delay: 1800 }, { name: '领随机耀系列典藏神器', func: 'autoClick', param: '.p5btn2.isGray27', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: '耀系列神器', delay: 1800 }, { name: '非期限神器预打卡提示', func: 'autoClick', param: '.p5btn2.isGray15', delay: 1000 }, { name: '关闭提示弹窗', func: 'closePopup', param: '预打卡提示', delay: 1800 }, { name: '立即抽奖(预打卡后)', func: 'autoClick', param: '.p5btn3.isGray13', delay: 1000 }, { name: '关闭抽奖弹窗', func: 'closePopup', param: '预打卡抽奖', delay: 1800 }, { name: '预打卡', func: 'autoClick', param: '.p5btn3.isGray14', delay: 1000 }, { name: '关闭预打卡弹窗', func: 'closePopup', param: '预打卡', delay: 1800 }, { name: '解锁主武器信息', func: 'autoClick', param: '.p6btn1.isGray16', delay: 1000 }, { name: '关闭解锁弹窗', func: 'closePopup', param: '主武器信息', delay: 1800 }, { name: '解锁副武器信息', func: 'autoClick', param: '.p6btn1.isGray17', delay: 1000 }, { name: '关闭解锁弹窗', func: 'closePopup', param: '副武器信息', delay: 1800 }, { name: '解锁近战武器信息', func: 'autoClick', param: '.p6btn1.isGray18', delay: 1000 }, { name: '关闭解锁弹窗', func: 'closePopup', param: '近战武器信息', delay: 1800 }, { name: '解锁投掷武器信息', func: 'autoClick', param: '.p6btn1.isGray19', delay: 1000 }, { name: '关闭解锁弹窗', func: 'closePopup', param: '投掷武器信息', delay: 1800 }, { name: '立即领取(主副武器)', func: 'autoClick', param: '.p6btn1.isGray20', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: '主副武器领取', delay: 1800 }, { name: '立即领取(刀雷武器)', func: 'autoClick', param: '.p6btn1.isGray21', delay: 1000 }, { name: '关闭领取弹窗', func: 'closePopup', param: '刀雷武器领取', delay: 1800 }, { name: '我已完全解锁', func: 'autoClick', param: '.p6btn1.isGray22', delay: 1000 }, { name: '关闭解锁弹窗', func: 'closePopup', param: '完全解锁', delay: 1800 }, { name: '登录游戏(领名片)', func: 'autoClick', param: '.p7btn1.isGray23', delay: 1000 }, { name: '关闭名片弹窗', func: 'closePopup', param: '对应名片', delay: 1800 }, { name: '领任选名片', func: 'autoClick', param: '.p7btn1.isGray24', delay: 1000 }, { name: '关闭名片弹窗', func: 'closePopup', param: '任选名片', delay: 1800 } ] }, { id: 'nz_cafe_202511', name: '年终网吧专属福利', icon: '🚀', url: 'https://nz.qq.com/cp/a20251124wbhd/?e_code=554053', urlRegex: /a20251124wbhd/, steps: [ { name: '领取100积分(周一至周四)', func: 'autoClick', param: '.p1_ct4_btn1.zigeshow:contains("领取100积分"):nth-of-type(1)', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'jichumeiri(1)积分', delay: 1800 }, { name: '领取150积分(周五至周日)', func: 'autoClick', param: '.p1_ct4_btn1.zigeshow:contains("领取150积分"):nth-of-type(1)', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'jichumeiri(2)积分', delay: 1800 }, { name: '领取150积分(周一至周四)', func: 'autoClick', param: '.p1_ct4_btn1.zigeshow:contains("领取150积分"):nth-of-type(2)', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'jichumeiri(3)积分', delay: 1800 }, { name: '领取200积分(周五至周日)', func: 'autoClick', param: '.p1_ct4_btn1.zigeshow:contains("领取200积分")', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'jichumeiri(4)积分', delay: 1800 }, { name: '领取100积分(周一至周四)', func: 'autoClick', param: '.p1_ct4_btn1.zigeshow:contains("领取100积分"):nth-of-type(2)', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'jichumeiri(5)积分', delay: 1800 }, { name: '领取150积分(周五至周日)', func: 'autoClick', param: '.p1_ct4_btn1.zigeshow:contains("领取150积分"):nth-of-type(3)', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'jichumeiri(6)积分', delay: 1800 }, { name: '领取250积分(周一至周四)', func: 'autoClick', param: '.p1_ct4_btn1.zigeshow:contains("领取250积分")', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'jichumeiri(7)积分', delay: 1800 }, { name: '领取400积分(周五至周日)', func: 'autoClick', param: '.p1_ct4_btn1.zigeshow:contains("领取400积分")', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'jichumeiri(8)积分', delay: 1800 }, { name: '领取50积分(teshurenwu(1))', func: 'autoClick', param: '.p1_ct5_btn1.zigeshow:contains("领取50积分"):nth-of-type(1)', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'teshurenwu(1)积分', delay: 1800 }, { name: '领取50积分(逆战助手)', func: 'autoClick', param: '.p1_ct5_btn1.zigeshow:contains("领取50积分"):nth-of-type(2)', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'nizhanzhushou积分', delay: 1800 }, { name: '领取50积分(云游戏)', func: 'autoClick', param: '.p1_ct5_btn1.zigeshow:contains("领取50积分"):nth-of-type(3)', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'yunyouxi积分', delay: 1800 }, { name: '领取100积分(teshurenwu(2))', func: 'autoClick', param: '.p1_ct5_btn1.zigeshow:contains("领取100积分")', delay: 1000 }, { name: '关闭积分弹窗', func: 'closePopup', param: 'teshurenwu(2)积分', delay: 1800 } ] }, { id: 'nz_return_202512', name: '12月新老玩家回归', icon: '🎯', url: 'https://nz.qq.com/cp/a20251120pvphf/', urlRegex: /a20251120pvphf/, steps: [ // 1. 登录游戏1天 { name: '登录游戏1天', func: 'autoClick', param: '.btnA.isGray35', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '登录游戏1天', delay: 1800 }, // 2. 登录游戏2天 { name: '登录游戏2天', func: 'autoClick', param: '.btnA.isGray36', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '登录游戏2天', delay: 1800 }, // 3. 登录游戏3天 { name: '登录游戏3天', func: 'autoClick', param: '.btnA.isGray37', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '登录游戏3天', delay: 1800 }, // 4. 登录游戏4天 { name: '登录游戏4天', func: 'autoClick', param: '.btnA.isGray38', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '登录游戏4天', delay: 1800 }, // 5. 登录游戏5天领取 { name: '登录游戏5天领取', func: 'autoClick', param: '.btnB.isGray52', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '登录游戏5天领取', delay: 1800 }, // 6. 领取一张奖券 { name: '领取一张奖券', func: 'autoClick', param: '.btnA.isGray106', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '领取一张奖券', delay: 1800 }, // 7. 领取两张奖券 { name: '领取两张奖券', func: 'autoClick', param: '.btnA:contains("领取两张奖券")', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '领取两张奖券', delay: 1800 }, // 8. 立即抽奖 { name: '立即抽奖', func: 'autoClick', param: '.btnA:contains("立即抽奖")', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '立即抽奖', delay: 1800 }, // 9. 成功邀请老兵游戏一局 { name: '成功邀请老兵游戏一局', func: 'autoClick', param: '.btnB.isGray26', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '成功邀请老兵游戏一局', delay: 1800 }, // 10. 立即领取(part4_zyl_selReceive(1)) { name: '立即领取(1)', func: 'autoClick', param: '.btnA.isGray30', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '立即领取(1)', delay: 1800 }, // 11. 立即领取(part4_zyl_selReceive(2)) { name: '立即领取(2)', func: 'autoClick', param: '.btnA.isGray31', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '立即领取(2)', delay: 1800 }, // 12. 立即领取(part4_zyl_selReceive(3)) { name: '立即领取(3)', func: 'autoClick', param: '.btnA.isGray32', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '立即领取(3)', delay: 1800 }, // 13. 立即领取(part4_zyl_selReceive(4)) { name: '立即领取(4)', func: 'autoClick', param: '.btnB.isGray33', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '立即领取(4)', delay: 1800 }, // 14. 消耗0挚友力立即抽奖 { name: '消耗0挚友力立即抽奖', func: 'autoClick', param: '.btn_cj1.y.zylChouOne', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '消耗0挚友力立即抽奖', delay: 1800 }, // 15. 消耗100挚友力立即抽奖10次 { name: '消耗100挚友力立即抽奖10次', func: 'autoClick', param: '.btn_cj2.y.zylChouTen.gray', delay: 1000 }, { name: '关闭确认弹窗', func: 'closePopup', param: '消耗100挚友力立即抽奖10次', delay: 1800 } ] } ]; // 红白主题样式(极简视觉风格) const STYLE = GM_addStyle(` #nz-toolbox { position: fixed !important; top: 50px !important; left: 20px !important; z-index: 99999999 !important; width: 320px !important; background: #fff !important; border: 1px solid rgba(230, 57, 70, 0.3) !important; border-radius: 20px !important; box-shadow: 0 12px 36px rgba(0, 0, 0, 0.15) !important; font-family: 'Microsoft YaHei', 'PingFang SC', sans-serif !important; overflow: hidden !important; backdrop-filter: none !important; display: block !important; opacity: 1 !important; visibility: visible !important; pointer-events: auto !important; } #nz-toolbox-header { background: linear-gradient(90deg, #e63946 0%, #ff6b6b 100%) !important; color: #fff !important; padding: 20px 24px !important; display: flex !important; justify-content: space-between !important; align-items: center !important; cursor: move !important; user-select: none !important; border-top-left-radius: 20px !important; border-top-right-radius: 20px !important; position: relative !important; overflow: hidden !important; } #nz-toolbox-header::before { content: '' !important; position: absolute !important; top: 0 !important; left: 0 !important; right: 0 !important; height: 3px !important; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.8), transparent) !important; } .nz-toolbox-title { font-size: 18px !important; font-weight: 700 !important; display: flex !important; align-items: center !important; gap: 12px !important; letter-spacing: 0.8px !important; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2) !important; } .nz-toolbox-icon { width: 28px !important; height: 28px !important; object-fit: contain !important; border-radius: 8px !important; box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3) !important; } .nz-toolbox-mini { background: rgba(255, 255, 255, 0.2) !important; border: 1px solid rgba(255, 255, 255, 0.3) !important; color: #fff !important; font-size: 20px !important; cursor: pointer !important; width: 36px !important; height: 36px !important; border-radius: 10px !important; display: flex !important; align-items: center !important; justify-content: center !important; transition: all 0.3s !important; } .nz-toolbox-mini:hover { background: rgba(255, 255, 255, 0.3) !important; transform: translateY(-2px) !important; box-shadow: 0 6px 15px rgba(0, 0, 0, 0.2) !important; } #nz-toolbox-body { padding: 24px !important; max-height: 600px !important; height: auto !important; overflow-y: auto !important; } #nz-toolbox-body::-webkit-scrollbar { width: 8px !important; } #nz-toolbox-body::-webkit-scrollbar-track { background: rgba(230, 57, 70, 0.08) !important; border-radius: 4px !important; } #nz-toolbox-body::-webkit-scrollbar-thumb { background: linear-gradient(180deg, #e63946 0%, #ff6b6b 100%) !important; border-radius: 4px !important; } .nz-group-title { font-size: 14px !important; color: #e63946 !important; margin: 24px 0 12px 0 !important; padding-left: 10px !important; border-left: 3px solid #e63946 !important; text-transform: uppercase !important; letter-spacing: 1.2px !important; font-weight: 600 !important; } .nz-group-title:first-child { margin-top: 0 !important; } .nz-toolbox-btn { width: 100% !important; background: #f8f9fa !important; border: 1px solid rgba(230, 57, 70, 0.2) !important; color: #333 !important; padding: 14px 20px !important; margin: 8px 0 !important; border-radius: 14px !important; cursor: pointer !important; font-size: 15px !important; text-align: left !important; display: flex !important; align-items: center !important; gap: 14px !important; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; position: relative !important; overflow: hidden !important; } .nz-toolbox-btn::before { content: '' !important; position: absolute !important; top: 0 !important; left: -100% !important; width: 100% !important; height: 100% !important; background: linear-gradient(90deg, transparent, rgba(230, 57, 70, 0.1), transparent) !important; transition: left 0.6s cubic-bezier(0.4, 0, 0.2, 1) !important; } .nz-toolbox-btn:hover { background: linear-gradient(145deg, #e63946 0%, #ff6b6b 100%) !important; color: #fff !important; transform: translateY(-3px) !important; box-shadow: 0 8px 24px rgba(230, 57, 70, 0.3) !important; border-color: rgba(230, 57, 70, 0.5) !important; } .nz-toolbox-btn:hover::before { left: 100% !important; } .nz-toolbox-btn:active { transform: translateY(-1px) !important; box-shadow: 0 4px 12px rgba(230, 57, 70, 0.2) !important; } .nz-btn-icon { width: 24px !important; height: 24px !important; display: flex !important; align-items: center !important; justify-content: center !important; flex-shrink: 0 !important; font-size: 20px !important; } #nz-toolbox.mini { width: 70px !important; height: 70px !important; border-radius: 22px !important; overflow: hidden !important; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; } #nz-toolbox.mini #nz-toolbox-body, #nz-toolbox.mini .nz-toolbox-title span { display: none !important; } #nz-toolbox.mini #nz-toolbox-header { width: 100% !important; height: 100% !important; justify-content: center !important; border-radius: 22px !important; padding: 0 !important; } .nz-toast { position: fixed !important; bottom: 60px !important; left: 50% !important; transform: translateX(-50%) !important; background: #fff !important; color: #333 !important; padding: 16px 28px !important; border-radius: 14px !important; font-size: 15px !important; z-index: 99999999 !important; box-shadow: 0 12px 36px rgba(0, 0, 0, 0.15) !important; border: 1px solid rgba(230, 57, 70, 0.3) !important; animation: nzSlideUp 0.4s ease-out !important; } @keyframes nzSlideUp { from { transform: translate(-50%, 30px); opacity: 0; } to { transform: translate(-50%, 0); opacity: 1; } } `); class StorageManager { static get(key) { try { return GM_getValue(`nz_${key}`, null); } catch (e) { return null; } } static set(key, val) { try { GM_setValue(`nz_${key}`, val); } catch (e) { console.log('存储失败:', e); } } } class UIHelper { static toast(msg, duration = 2000) { const existing = document.querySelector('.nz-toast'); if (existing) existing.remove(); const el = document.createElement('div'); el.className = 'nz-toast'; el.textContent = msg; document.body.appendChild(el); setTimeout(() => el.parentNode && el.remove(), duration); } static confirm(title, msg) { return new Promise(resolve => { const overlay = document.createElement('div'); overlay.style.cssText = `position: fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.6);z-index:99999998;`; const dialog = document.createElement('div'); dialog.style.cssText = `position: fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:20px;padding:28px;width:360px;box-shadow:0 20px 60px rgba(0,0,0,0.15);border:1px solid rgba(230,57,70,0.3);z-index:99999999;`; dialog.innerHTML = `

${title}

${msg}

`; document.body.appendChild(overlay); document.body.appendChild(dialog); const cleanup = () => { overlay.parentNode && overlay.remove(); dialog.parentNode && dialog.remove(); }; dialog.querySelector('#nz-dialog-cancel').addEventListener('click', () => { resolve(false); cleanup(); }); dialog.querySelector('#nz-dialog-confirm').addEventListener('click', () => { resolve(true); cleanup(); }); overlay.addEventListener('click', () => { resolve(false); cleanup(); }); }); } } class Executor { // 弹窗关闭核心方法(适配所有活动的弹窗按钮) static closePopup(popupType = "默认") { try { // 优先检测第四个活动的弹窗按钮 .pop_btn1.sp const returnCloseBtn = document.querySelector('.pop_btn1.sp'); if (returnCloseBtn) { returnCloseBtn.click(); GM_log(`${popupType}弹窗 - 点击.pop_btn1.sp关闭按钮成功`); return true; } // 第三个活动弹窗按钮 .pop-btn2 const cafeCloseBtn = document.querySelector('.pop-btn2'); if (cafeCloseBtn) { cafeCloseBtn.click(); GM_log(`${popupType}弹窗 - 点击.pop-btn2关闭按钮成功`); return true; } // 第二个活动弹窗按钮 .pop1btn1 const confirmBtn = document.querySelector('.pop1btn1'); if (confirmBtn) { confirmBtn.click(); GM_log(`${popupType}弹窗 - 点击.pop1btn1确认按钮成功`); return true; } // 第一个活动弹窗按钮 .pop_close.pa const firstCloseBtn = document.querySelector('.pop_close.pa'); if (firstCloseBtn) { firstCloseBtn.click(); GM_log(`${popupType}弹窗 - 点击.pop_close.pa关闭按钮成功`); return true; } // 通用closeDialog函数 if (typeof closeDialog === 'function') { closeDialog(); GM_log(`${popupType}弹窗 - 调用closeDialog函数成功`); return true; } GM_log(`${popupType}弹窗 - 未检测到可关闭元素`); return false; } catch (e) { GM_log(`${popupType}弹窗 - 关闭异常:${e.message}`); return false; } } // 通用按钮点击方法(增强文本匹配,适配所有活动) static autoClick(selector, actionName = "通用按钮") { try { let btn = null; // 处理包含文本选择器的情况 if (selector.includes(':contains')) { const [baseSelector, textPart] = selector.split(':contains'); const text = textPart.replace(/[()"]/g, '').split(':nth-of-type')[0]; const nth = textPart.includes(':nth-of-type') ? parseInt(textPart.match(/:nth-of-type\((\d+)\)/)[1]) - 1 : 0; // 查找所有基础选择器的按钮,过滤文本匹配的 const allBtns = document.querySelectorAll(baseSelector.trim()); const matchedBtns = Array.from(allBtns).filter(btn => btn.textContent.includes(text)); if (matchedBtns.length > nth) { btn = matchedBtns[nth]; } } else { // 普通选择器(ID/class) btn = document.querySelector(selector); } if (!btn) { GM_log(`${actionName} - 未找到按钮(选择器:${selector})`); return false; } // 强制触发点击(兼容不同绑定方式) btn.click(); // 备用触发方式(防止click事件未绑定) if (btn.dispatchEvent) { const event = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); btn.dispatchEvent(event); } GM_log(`${actionName} - 点击成功(选择器:${selector})`); return true; } catch (e) { GM_log(`${actionName} - 点击异常(选择器:${selector}):${e.message}`); return false; } } } class Toolbox { static quickPages = { activity: { icon: '🎮', name: '活动中心', url: 'https://nz.qq.com/web202403/activity-list.shtml' } }; static create() { const oldBox = document.getElementById('nz-toolbox'); if (oldBox) oldBox.remove(); const box = document.createElement('div'); box.id = 'nz-toolbox'; const pos = StorageManager.get('toolbox_pos'); if (pos) { box.style.top = `${pos.top}px`; box.style.left = `${pos.left}px`; } if (StorageManager.get('toolbox_mini')) box.classList.add('mini'); box.innerHTML = `
逆战活动助手
快捷入口
${Object.entries(this.quickPages).map(([key, val]) => ` `).join('')}
实用功能
活动入口直达
${ACTIVITY_CONFIGS.map(activity => ` `).join('')}
`; document.body.insertBefore(box, document.body.firstChild); this.bindEvents(box); } static bindEvents(box) { let isDragging = false; const header = box.querySelector('#nz-toolbox-header'); header.addEventListener('mousedown', (e) => { isDragging = true; const rect = box.getBoundingClientRect(); const startX = e.clientX - rect.left; const startY = e.clientY - rect.top; const move = (e) => { if (!isDragging) return; box.style.left = `${e.clientX - startX}px`; box.style.top = `${e.clientY - startY}px`; }; const up = () => { isDragging = false; const rect = box.getBoundingClientRect(); StorageManager.set('toolbox_pos', { top: rect.top, left: rect.left }); document.removeEventListener('mousemove', move); document.removeEventListener('mouseup', up); }; document.addEventListener('mousemove', move); document.addEventListener('mouseup', up); }); box.querySelector('.nz-toolbox-mini').addEventListener('click', () => { box.classList.toggle('mini'); StorageManager.set('toolbox_mini', box.classList.contains('mini')); box.querySelector('.nz-toolbox-mini').textContent = box.classList.contains('mini') ? '⊕' : '—'; }); box.querySelectorAll('[data-page]').forEach(btn => { btn.addEventListener('click', () => { const key = btn.getAttribute('data-page'); window.open(Toolbox.quickPages[key].url, '_blank'); }); }); box.querySelector('#nz-refresh').addEventListener('click', () => window.location.reload()); box.querySelector('#nz-top').addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); box.querySelectorAll('[data-activity-url]').forEach(btn => { btn.addEventListener('click', () => { const url = btn.getAttribute('data-activity-url'); window.open(url, '_blank'); }); }); } static init() { setTimeout(() => this.create(), 500); } } class AutoRunner { static async checkPage() { const currentUrl = window.location.href; for (const activity of ACTIVITY_CONFIGS) { if (activity.urlRegex.test(currentUrl)) { if (activity.steps.length > 0) { const res = await UIHelper.confirm('一键领取', `检测到【${activity.name}】,是否自动领取?`); if (res) this.run(activity); } else { UIHelper.toast(`【${activity.name}】暂未开放自动领取`); } return; } } } static async run(activity) { UIHelper.toast(`开始执行【${activity.name}】,请稍候...`); let currentDelay = 0; const timeoutIds = []; // 执行所有步骤 for (const step of activity.steps) { currentDelay += step.delay; const timeoutId = setTimeout(() => { try { // 调用对应执行方法 step.param ? Executor[step.func](step.param, step.name) : Executor[step.func](); } catch (e) { console.error(`步骤执行失败:${step.name}`, e); } }, currentDelay); timeoutIds.push(timeoutId); } // 执行完成提示 setTimeout(() => { UIHelper.toast(`【${activity.name}】自动领取执行完成!`); // 清理超时器 timeoutIds.forEach(id => clearTimeout(id)); }, currentDelay + 1000); } static init() { setTimeout(() => this.checkPage(), 1000); } } // 初始化工具箱 try { Toolbox.init(); AutoRunner.init(); } catch (e) { console.error('逆战工具箱初始化失败:', e); const errorBox = document.createElement('div'); errorBox.id = 'nz-toolbox-error'; errorBox.style.cssText = 'position:fixed;top:20px;left:20px;z-index:99999999;background:#fff;padding:20px;border:1px solid #e63946;border-radius:12px;color:#333;font-size:14px;box-shadow:0 4px 12px rgba(0,0,0,0.1);'; errorBox.innerHTML = `

逆战工具箱初始化失败

错误信息:${e.message}

请刷新页面重试,或检查脚本权限

`; document.body.appendChild(errorBox); } })();