获取哔哩哔哩高清图片

Ctrl+右键图片在新标签页打开高清图片,如果未指向图片则尝试打开本页的高清封面。

// ==UserScript==
// @name         获取哔哩哔哩高清图片
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  Ctrl+右键图片在新标签页打开高清图片,如果未指向图片则尝试打开本页的高清封面。
// @author       Mouse0w0
// @license      MIT
// @match        *://*.bilibili.com/*
// @match        *://*.biligame.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @grant        GM_openInTab
// ==/UserScript==

(function() {
    'use strict';

    // 开写代码
    document.addEventListener('mousedown', function(e) {
        // Ctrl+右键在新标签页打开高清图片
        if (!(e.ctrlKey && e.button === 2)) return;

        let target = e.target;

        // 从IMG标签中获取图片
        if (target.tagName === 'IMG') {
            openImage(target.src);
            return;
        }

        // 从背景图片中获取图片
        let bgimg = target.style.backgroundImage;
        if (bgimg) {
            openImage(bgimg.slice(5, -2));
            return;
        }

        // 从消息遮罩中获取图片
        // 1.获取指向的链接
        let a = e.target;
        while (a !== null && a.tagName !== 'A') {
            a = a.parentNode;
        }
        // 2.获取链接的图片
        if (a != null) {
            let img = a.querySelector('img');
            if (img !== null) {
                openImage(img.src);
                return;
            }
        }

        // 如果获取不到指向的图片,尝试获取本页面的封面
        // 从Meta信息中获取封面
        let metaimg;
        metaimg = document.querySelector('meta[itemprop="image"]');
        if (metaimg !== null) {
            openImage(metaimg.content);
            return;
        }
        metaimg = document.querySelector('meta[property="og:image"]');
        if (metaimg !== null) {
            openImage(metaimg.content);
            return;
        }

        // 获取直播间封面
        if (typeof __NEPTUNE_IS_MY_WAIFU__ !== 'undefined') {
            openImage(__NEPTUNE_IS_MY_WAIFU__.roomInfoRes.data.room_info.cover);
            return;
        }
    });

    function openImage(url) {
        url = substringBefore(url, '@');
        GM_openInTab(url, true);
    }

    function substringBefore(str, before) {
        let idx = str.indexOf(before);
        return idx != -1 ? str.slice(0, idx) : str;
    }
})();