Greasy Fork

来自缓存

Greasy Fork is available in English.

花心拯救者

白嫖没有错,花心也没有猜错,错的是这个破站直播!

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         花心拯救者
// @namespace    Cutemon
// @version      1.60
// @description  白嫖没有错,花心也没有猜错,错的是这个破站直播!
// @author       Cutemon
// @include      /https?:\/\/live\.bilibili\.com\/\d+\??.*/
// @require      https://static.hdslb.com/live-static/libs/jquery/jquery-1.11.3.min.js
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    let room_id = window.location.pathname.slice(1),
        medal_id = '';
    let xx, yy;
    let left, top;

    // 获取用户cookie
    let getCookie = Name => {
        let search = Name + '='; //查询检索的值
        let returnvalue = ''; //返回值
        if (document.cookie.length > 0) {
            let sd = document.cookie.indexOf(search);
            if (sd != -1) {
                sd += search.length;
                let end = document.cookie.indexOf(';', sd);
                if (end == -1) end = document.cookie.length;
                //unescape() 函数可对通过 escape() 编码的字符串进行解码。
                returnvalue = unescape(document.cookie.substring(sd, end));
            }
        }
        return returnvalue;
    };

    function bindInput() {
        let bindTimer = setInterval(() => {
            console.log(`弹幕输入框事件绑定中……`);

            if ($('.chat-input').length) {
                // 一般情况下获取dom
                $('.chat-input').focus(checkMedal);
                left = $('#control-panel-ctnr-box').offset().left + 8 + 'px';
                top = $('#control-panel-ctnr-box').offset().top - 50 + 'px';
                console.log(`勋章自动切换功能已启动`);
                toast('勋章自动切换功能已启动', 'success');
                clearInterval(bindTimer);
            } else {
                // iframe情况下获取dom
                try {
                    let ifr = document
                        .getElementById('player-ctnr')
                        .getElementsByTagName('iframe');
                    if (ifr.length) {
                        $('head').append(`<style type="text/css">/*
                    *  Link Toast Style By LancerComet at 17:31, 2015.12.16.
                    *  # Carry Your World #
                    *  ---
                    *  直播站 Toast 组件样式文件.
                    */
                   .link-toast {
                     position: absolute;
                     padding: 12px 24px;
                     font-size: 14px;
                     border-radius: 8px;
                     white-space: nowrap;
                     color: #fff;
                     -webkit-animation: link-msg-move-in-top cubic-bezier(0.22, 0.58, 0.12, 0.98) 0.4s;
                             animation: link-msg-move-in-top cubic-bezier(0.22, 0.58, 0.12, 0.98) 0.4s;
                     z-index: 10000;
                   }
                   .link-toast.fixed {
                     position: fixed;
                   }
                   .link-toast.success {
                     background-color: #47d279;
                     -webkit-box-shadow: 0 0.2em 0.1em 0.1em rgba(71,210,121,0.2);
                             box-shadow: 0 0.2em 0.1em 0.1em rgba(71,210,121,0.2);
                   }
                   .link-toast.caution {
                     background-color: #ffb243;
                     -webkit-box-shadow: 0 0.2em 0.1em 0.1em rgba(255,190,68,0.2);
                             box-shadow: 0 0.2em 0.1em 0.1em rgba(255,190,68,0.2);
                   }
                   .link-toast.error {
                     background-color: #ff6464;
                     -webkit-box-shadow: 0 0.2em 1em 0.1em rgba(255,100,100,0.2);
                             box-shadow: 0 0.2em 1em 0.1em rgba(255,100,100,0.2);
                   }
                   .link-toast.info {
                     background-color: #48bbf8;
                     -webkit-box-shadow: 0 0.2em 0.1em 0.1em rgba(72,187,248,0.2);
                             box-shadow: 0 0.2em 0.1em 0.1em rgba(72,187,248,0.2);
                   }
                   .link-toast.out {
                     -webkit-animation: link-msg-fade-out cubic-bezier(0.22, 0.58, 0.12, 0.98) 0.4s;
                             animation: link-msg-fade-out cubic-bezier(0.22, 0.58, 0.12, 0.98) 0.4s;
                   }
                   @-webkit-keyframes link-msg-move-in-top {
                     from {
                       opacity: 0;
                       -webkit-transform: translate(0, 5em);
                               transform: translate(0, 5em);
                     }
                     to {
                       opacity: 1;
                       -webkit-transform: translate(0, 0);
                               transform: translate(0, 0);
                     }
                   }
                   @keyframes link-msg-move-in-top {
                     from {
                       opacity: 0;
                       -webkit-transform: translate(0, 5em);
                               transform: translate(0, 5em);
                     }
                     to {
                       opacity: 1;
                       -webkit-transform: translate(0, 0);
                               transform: translate(0, 0);
                     }
                   }
                   @-webkit-keyframes link-msg-fade-out {
                     from {
                       opacity: 1;
                     }
                     to {
                       opacity: 0;
                     }
                   }
                   @keyframes link-msg-fade-out {
                     from {
                       opacity: 1;
                     }
                     to {
                       opacity: 0;
                     }
                   }
                   </style>`);

                        let domChat = ifr[0].contentWindow.document.getElementsByClassName(
                            'chat-input'
                        )[0];
                        $(domChat).focus(checkMedal);
                        let domPanel = ifr[0].contentWindow.document.getElementById(
                            'control-panel-ctnr-box'
                        );
                        left = $(domPanel).offset().left + 8 + 'px';
                        top = $(domPanel).offset().top - 50 + 'px';
                        console.log(`勋章自动切换功能已启动`);
                        toast('勋章自动切换功能已启动', 'success');
                        clearInterval(bindTimer);
                    }
                } catch (err) {
                    let ifr = document
                        .getElementById('player-ctnr')
                        .getElementsByTagName('iframe');
                    console.log(
                        `chatinput: ${$('.chat-input')
                            .length}\niframe: ${ifr.length}`
                    );
                }
            }
        }, 1e3);

        $('body').mousemove(e => {
            xx = e.originalEvent.x || e.originalEvent.layerX || 0;
            yy = e.originalEvent.y || e.originalEvent.layerY || 0;
            //let d = document.getElementById("div");获取某div在当前窗口的位置
            //let dx = xx - p.getBoundingClientRect().left;
            //let dy = yy - p.getBoundingClientRect().top;
            //$(this).text(dx + '---' + dy);鼠标在该div内位置
        });
    }

    function getMedal() {
        $.ajax({
            type: 'GET',
            url:
                '//api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom',
            data: {
                room_id
            },
            success: res => {
                if (res.code == 0) {
                    console.log('勋章id获取成功');
                    medal_id = res.data.anchor_info.medal_info.medal_id;
                    bindInput();
                }
            }
        });
    }

    function checkMedal() {
        // let left = '85%',
        //     top = '70%';
        $.ajax({
            type: 'GET',
            // url: '//api.live.bilibili.com/i/ajaxWearFansMedal',
            url:
                '//api.live.bilibili.com/live_user/v1/UserInfo/get_weared_medal',
            success: res => {
                if (medal_id == res.data.medal_id) {
                    toast('已经佩戴本房间勋章,无需重复佩戴', 'caution');
                } else {
                    wearMedal(medal_id);
                }
            }
        });
    }

    function wearMedal(medal_id) {
        // let left = xx - 100 + 'px',
        //     top = yy - 100 + 'px';
        // let left = '85%',
        //     top = '70%';
        $.ajax({
            type: 'POST',
            // url: '//api.live.bilibili.com/i/ajaxWearFansMedal',
            url: '//api.live.bilibili.com/xlive/web-room/v1/fansMedal/wear',
            data: {
                medal_id
            },
            success: res => {
                if (res.code == 0) {
                    toast(res.message || res.msg, 'success');
                    console.log(left, top, res.message || res.msg);
                } else {
                    toast(res.message || res.msg, 'caution');
                    // $('.chat-input').unbind();
                }
            }
        });
    }

    function toast(text, level) {
        text = text || '这是一个提示';
        level = level || 'success'; // success,caution,info,error
        // left = left || '75%';
        // top = top || '80%';
        if (level != 'success') {
            console.log(text);
        }
        let id = new Date().valueOf();

        $('body').append(
            '<div class="link-toast ' +
                level +
                '"data-id="' +
                id +
                '" style="position: fixed; left: ' +
                left +
                '; top: ' +
                top +
                ';"><span class="toast-text">' +
                text +
                '</span></div>'
        );
        $(
            "div.link-toast[data-id='" + id + "']"
        ).slideDown('normal', function() {
            setTimeout(function() {
                $(
                    "div.link-toast[data-id='" + id + "']"
                ).fadeOut('normal', function() {
                    $("div.link-toast[data-id='" + id + "']").remove();
                });
            }, 1500);
        });
    }

    window.onload = function() {
        let token = getCookie('bili_jct');
        $.ajaxSetup({
            crossDomain: true,
            xhrFields: {
                withCredentials: true
            },
            data: {
                csrf: token,
                csrf_token: token
            }
        });
        console.log(`花心拯救者脚本已开始工作!`);
        getMedal();
    };
})();