一个有意思的小脚本
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复25
  • 已保存回复25
  • 发布时间2022/7/7 17:01
  • 上次更新2024/8/19 15:49:37
查看原帖
一个有意思的小脚本
206814
封禁用户楼主2022/7/7 17:01

见博客:https://www.luogu.com.cn/blog/liutianyou/Luogu-Extra

很多人貌似很喜欢我的脚本,所以我把几个大佬的脚本整合了一下发出来,私信提示和换背景完全是我自己开发的。

下文来自上面的博客。

由于使用氩洛谷、exlg之类的插件过于麻烦,本人开发出来一个增强洛谷功能油猴脚本。

使用脚本之前,你需要安装“Tampermonkey”插件,你在你的浏览器扩展商店中可以找到。

下面是脚本内容,你需要对它进行微调,然后就可以用了。

// ==UserScript==
// @name         洛谷强化插件
// @namespace    洛谷强化插件
// @version      1.0
// @description  洛谷强化,来源自https://www.luogu.com.cn/blog/liutianyou/Luogu-Extra
// @author       LiuTianyou & rainy & 叶ID (KMnO4y_Fish, yezhiyi9670)
// @match        *://www.luogu.com.cn/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @grant        none
// ==/UserScript==

var background = new Array("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg2.huashi6.com%2Fimages%2Fresource%2F2020%2F11%2F29%2Fh85977400p0.jpg%3FimageView2%2F3%2Fq%2F100%2Finterlace%2F1%2Fw%2F1600%2Fh%2F1600&refer=http%3A%2F%2Fimg2.huashi6.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1659665788&t=df861f3…",
                          //"https://img2.baidu.com/it/u=3339913661,1461699126&fm=253&fmt=auto&app=138&f=JPEG?w=661&h=500",
                          //"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg2.huashi6.com%2Fimages%2Fresource%2F2021%2F03%2F24%2F8866197h5p0.jpg%3FimageView2%2F3%2Fq%2F100%2Finterlace%2F1%2Fw%2F1600%2Fh%2F1600&refer=http%3A%2F%2Fimg2.huashi6.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1659765695&t=e2cf5a79c0b8b29078b2f49d46db3d4f",
                          //"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg2.huashi6.com%2Fimages%2Fresource%2F2020%2F12%2F15%2F863h15947p0.jpg%3FimageView2%2F3%2Fq%2F100%2Finterlace%2F1%2Fw%2F1600%2Fh%2F1600&refer=http%3A%2F%2Fimg2.huashi6.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1659765709&t=630011f8950f3cc5fb1101502bc2ef1b",
                          //"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpatchwiki.biligame.com%2Fimages%2Fys%2F4%2F48%2Fkbpj3ldtjpmckt8lyppspsuvg1vu3yc.png&refer=http%3A%2F%2Fpatchwiki.biligame.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1659765709&t=2d6469423287dbd22d9ac0f70826602c"
                          );
function payload(){
    var back = background[Math.floor(Math.random() * background.length)];
    document.querySelector('body').style="background: url(" + back + ") fixed center;background-size: cover;";
    if(document.querySelector('main[style="background-color: rgb(239, 239, 239);"]') != null)
        document.querySelector('main[style="background-color: rgb(239, 239, 239);"]').style="opacity: 0.8;";
    if(document.querySelector('div[style="background: linear-gradient(90deg, rgb(35, 37, 38), rgb(65, 67, 69)); filter: blur(0px) brightness(100%);"]') != null)
        document.querySelector('div[style="background: linear-gradient(90deg, rgb(35, 37, 38), rgb(65, 67, 69)); filter: blur(0px) brightness(100%);"]').style="opacity: 0.8;";
    if(document.querySelector('div[style="background: rgb(51, 51, 51); filter: blur(0px) brightness(100%);"]') != null)
        document.querySelector('div[style="background: rgb(51, 51, 51); filter: blur(0px) brightness(100%);"]').style="opacity: 0.8;";
    if(document.querySelector('div[class="mdui-panel mdui-panel-gapless"]') != null)
        document.querySelector('div[class="mdui-panel mdui-panel-gapless"]').style="opacity: 0.8;";
    if(document.querySelector('div[class="mp-editor-container"]') != null)
        document.querySelector('div[class="mp-editor-container"]').style="opacity: 0.8;";
}
var chat_websocket = new WebSocket('wss://ws.luogu.com.cn/ws?host=www.luogu.com.cn');
chat_websocket.onopen = function(evt){
    chat_websocket.send('{"type":"join_channel","channel":"chat","channel_param":"206814","exclusive_key":null}');
    console.log("已经连接到洛谷私信服务器!");
}
chat_websocket.onerror = function(evt){
    console.warn("无法连接到洛谷私信服务器,请刷新页面再试!");
}
chat_websocket.onmessage = function(evt){
    //{"_channel":"chat","_channel_param":"206814","_ws_type":"join_result","client_number":2,"result":"success","type":"result","welcome_message":""}
    //{"_channel":"chat","_channel_param":"206814","_ws_type":"heartbeat","client_number":1,"type":"heartbeat"}
    //{"_channel":"chat","_channel_param":"206814","_ws_type":"server_broadcast","message":{"content":"。。。","id":9395711,"receiver":{"background":"https://cdn.luogu.com.cn/upload/image_hosting/mvku5hfx.png","badge":null,"ccfLevel":5,"color":"Green","isAdmin":false,"isBanned":false,"name":"LiuTianyou","slogan":"希望每个人在自己的道路上越走越远……","uid":206814},"sender":{"background":"https://cdn.luogu.com.cn/upload/image_hosting/9nmrc0ym.png","badge":null,"ccfLevel":0,"color":"Green","isAdmin":false,"isBanned":false,"name":"weisumouyingjinpai","slogan":"","uid":578146},"status":1,"time":1657159550}}
    var message = JSON.parse(evt.data);
    if(message._ws_type != "server_broadcast") return;
    var notice = "收到@" + message.message.sender.name + "的私信:" + message.message.content;
    var div = document.createElement("DIV");
    div.innerHTML=`
    <div class="swal2-container swal2-top-end swal2-fade swal2-shown" style="overflow-y: auto;">
        <div aria-labelledby="swal2-title" aria-describedby="swal2-content" class="swal2-popup swal2-toast swal2-show" tabindex="-1" role="alert" aria-live="polite" style="display: flex;">
            <div class="swal2-header">
                <ul class="swal2-progresssteps" style="display: none;"></ul>
        <div class="swal2-icon swal2-info" style="display: flex;">
            <span class="swal2-icon-text">i</span>
            <div class="swal2-success-circular-line-left" style="background-color: rgb(255, 255, 255);"></div>
            <span class="swal2-success-line-tip"></span>
            <span class="swal2-success-line-long"></span>
            <div class="swal2-success-ring"></div>
            <div class="swal2-success-fix" style="background-color: rgb(255, 255, 255);"></div><div class="swal2-success-circular-line-right" style="background-color: rgb(255, 255, 255);"></div>
        </div>
        <h2 class="swal2-title" id="swal2-title"><a href="https://www.luogu.com.cn/chat">` + notice + `</a></h2>
        <button type="button" class="swal2-close" style="display: flex;" onclick="document.body.removeChild(document.body.lastElementChild)">×</button>
    </div>`;
    document.body.appendChild(div);
    setTimeout("document.body.removeChild(document.body.lastElementChild)", 5000);
}
chat_websocket.onclose = function(evt){}
window.onload = function(){
    'use strict';
    payload();
    var homepage = /\/user\/(.*)/;
    if(homepage.test(window.location.pathname)){
        //练习页面题号加颜色功能,作者rainy
    	//代码来自于https://greasyfork.org/zh-CN/scripts/392036-%E6%B4%9B%E8%B0%B7%E9%A2%98%E7%9B%AE%E9%9A%BE%E5%BA%A6%E6%98%BE%E7%A4%BA-luogu-dif-render/code
        setInterval(() => {
            var problems = document.getElementsByTagName('a');
            var problems_color = [];
            var colors = ['rgb(191, 191, 191)', 'rgb(254, 76, 97)', 'rgb(243, 156, 17)', 'rgb(255, 193, 22)', 'rgb(82, 196, 26)', 'rgb(52, 152, 219)', 'rgb(157, 61, 207)', 'rgb(14, 29, 105)'];
            for(var passed of window._feInjection.currentData.passedProblems) problems_color.push({pid: passed.pid, dif: passed.difficulty, rendered: false});
            for(var tryed of window._feInjection.currentData.submittedProblems) problems_color.push({pid: tryed.pid, dif: tryed.difficulty, rendered: false});
            for(var i = 0; i < problems.length; i++){
                var number = problems[i].innerText;
                for(var j = 0; j < problems_color.length; j++){
                    if(problems_color[j].pid == number){
                        problems[i].style.color = colors[problems_color[j].dif];
                    }
                }
            }
        }, 1000);
    }
    if(window.location.pathname == "/"){
        //按难度随机跳题,作者叶ID (KMnO4y_Fish, yezhiyi9670)
        //代码来自于https://greasyfork.org/zh-CN/scripts/390181-%E6%B4%9B%E8%B0%B7%E6%8C%89%E9%9A%BE%E5%BA%A6%E9%9A%8F%E6%9C%BA%E8%B7%B3%E9%A2%98/code
        setTimeout(function () {
            document.querySelector('div[class="am-u-md-3"]').innerHTML = `
                <div class="lg-article" id="rand-problem-form">
                <h2>按难度随机跳题</h2>
                <select class="am-form-field" style="background-color:#DDD;" name="rand-problem-rating" autocomplete="off" placeholder="选择难度">
                  <option value="0">暂无评定</option>
                  <option value="1">入门</option>
                  <option value="2">普及-</option>
                  <option value="3">普及/提高-</option>
                  <option value="4">普及+/提高</option>
                  <option selected value="5">提高+/省选-</option>
                  <option value="6">省选/NOI-</option>
                  <option value="7">NOI/NOI+/CTSC</option>
                </select>
                <select class="am-form-field" style="background-color:#DDD;margin-top:16px;" name="rand-problem-source" autocomplete="off" placeholder="选择来源">
                  <option selected value="P">洛谷题库</option>
                  <option value="CF">CodeForces</option>
                  <option value="SP">SPOJ</option>
                  <option value="AT">AtCoder</option>
                  <option value="UVA">UVa</option>
                </select>
                <button class="am-btn am-btn-sm am-btn-primary" style="margin-top:16px;visibility:hidden">跳转</button>
                <button class="am-btn am-btn-sm am-btn-primary lg-right" id="rand-problem-button" style="margin-top:16px;">跳转</button>
              </div>`;
            $('#rand-problem-button').click(function() {
                $('#rand-problem-button').addClass('am-disabled');
                $.get("https://www.luogu.com.cn/problem/list?difficulty=" + $('[name=rand-problem-rating]')[0].value + "&type=" + $('[name=rand-problem-source]')[0].value + "&page=1&_contentOnly=1",
                      function (data) {
                    var arr = data;
                    if (arr['code'] != 200) {
                        $('#rand-problem-button').removeClass('am-disabled');
                        show_alert("好像哪里有点问题", arr["message"]);
                    }
                    else {
                        var problem_count = arr['currentData']['problems']['count'];
                        var page_count = Math.ceil(problem_count / 50);
                        var rand_page = Math.floor(Math.random()*page_count) + 1;
                        $.get("https://www.luogu.com.cn/problem/list?difficulty=" + $('[name=rand-problem-rating]')[0].value + "&type=" + $('[name=rand-problem-source]')[0].value + "&page=" + rand_page + "&_contentOnly=1",
                              function(data) {
                            var list = data['currentData']['problems']['result'];
                            var rand_idx = Math.floor(Math.random()*list.length);
                            var pid = list[rand_idx]['pid'];
                            location.href = "https://www.luogu.com.cn/problem/" + pid;
                        }
                             );
                    }
                }
                     );
            });
        },499);
    }
};

你需要进行的修改如下:

  • var background = 之后的URL改为你的背景图片,可以放任意个,会随机选择图片.

  • 将洛谷改为默认主题.

这个脚本的功能:

  • 修改背景图片,透明化内容

  • 实时接收私信,并在右上角以提示方式给出.

  • 主页 -> 练习中的题目带颜色.

  • 按照难度随机跳转题目

修复的Bug:

  • 更改题目颜色功能干扰验证码运行(2022年7月7日修复)

  • 透明度适用于博客编辑框(2022年7月7日修复)

  • 拒绝div不存在而错误终止脚本的情况(2022年7月7日修复)

功能会持续更新,但目前不打算放到Tampermonkey的官网上.请认准这篇博客,并检查你的更新.

这份代码是结合了其他大佬的代码而成的,具体可见代码.

效果图:

PS:这个私信提示真的好用,刚刚收私信的时候右上角就来提示了……

2022/7/7 17:01
加载中...