获取哔哩哔哩视频的封面图片 get bilibili cover image

在视频列表上以及视频播放页面,按 ctrl+鼠标右键 ,就会在新窗口打开这个视频的封面图

目前為 2017-06-18 提交的版本,檢視 最新版本

// ==UserScript==
// @name		获取哔哩哔哩视频的封面图片 get bilibili cover image
// @namespace	http://saber.love/?p=3259
// @version		1.2.0
// @description	在视频列表上以及视频播放页面,按 ctrl+鼠标右键 ,就会在新窗口打开这个视频的封面图
// @author		雪见仙尊 xuejianxianzun
// @include		*://*bilibili.com/*
// @icon        http://saber.love/favicon.ico
// @license 	GNU General Public License version 3 https://www.gnu.org/licenses/gpl-3.0.en.html
// @run-at		document-end
// ==/UserScript==

// 获取触发右键菜单的元素
document.body.addEventListener("contextmenu", function(e) {
	var e = e || window.event;
	if (e.ctrlKey) {
		getCoverImage(e.target);
	}
});

// 判断是否含有当前class
var hasClass = (function() {
	var div = document.createElement("div");
	if ("classList" in div && typeof div.classList.contains === "function") {
		return function(elem, className) {
			return elem.classList.contains(className);
		};
	} else {
		return function(elem, className) {
			var classes = elem.className.split(/\s+/);
			for (var i = 0; i < classes.length; i++) {
				if (classes[i] === className) {
					return true;
				}
			}
			return false;
		};
	}
})();

var ownsName = ["scrollx", "groom-module", "card-live-module", "rank-item", "spread-module", "card-timing-module", "l-item", "v", "v-item", "anchor-card", "small-item"]; // 这里的class都是列表项本身
var parentsName = ["bm-v-list", "rlist"]; // 这里的class是列表项的父元素

function getCoverImage(element) {
	if (/av\d{2,10}/.exec(window.location.href) !== null) { // 如果当前是视频播放页面,试图打开封面图
		var cover_image = document.body.querySelector("img.cover_image");
		if (!!cover_image) {
			openCoverImage(cover_image.src);
		}
	} else {
		if (element.nodeName === "IMG") { // 当前元素是img的情况
			openCoverImage(element.src);
		} else if (element.nodeName === "BODY") { // 当前元素是body的情况
			console.log("body,none");
			return false;
		} else {
			var finded = false;
			// 测试当前元素是否符合要求
			for (var i = 0; i < ownsName.length; i++) {
				if (hasClass(element, ownsName[i])) {
					console.log(ownsName[i]);
					if (ownsName[i] === "anchor-card") { //anchor-card这个class是直播页面的
						if (!!element.style.backgroundImage) {
							openCoverImage(/\/\/.*(?=")/.exec(element.style.backgroundImage)[0]);
						} else {
							openCoverImage(/\/\/.*(?=")/.exec(element.querySelector(".room-cover").style.backgroundImage)[0]);
						}
					} else {
						openCoverImage(element.querySelector("img").src);
					}
					finded = true;
					break;
				}
			}
			// 测试父元素是否符合要求
			var parentNode = element.parentNode;
			for (var i = 0; i < parentsName.length; i++) {
				if (hasClass(parentNode, parentsName[i])) {
					// 获取父元素的子节点
					var childrens = parentNode.childNodes;
					for (var j = 0; j < childrens.length; j++) {
						if (childrens[j] === element) {
							openCoverImage(element.querySelector("img").src);
							finded = true;
							break;
						}
					}
				}
			}
			// 如果都没有找到,则返回父元素
			if (finded === false) {
				return getCoverImage(parentNode);
			}
		}
	}
}

function openCoverImage(url) {
	var coverImageBigUrl = url;
	// 去除url中的裁剪标识
	if (url.indexOf("@") > -1) { //处理以@做裁剪标识的url
		coverImageBigUrl = url.split("@")[0];
	}
	if (url.indexOf("jpg_") > -1) { //处理以_做裁剪标识的url
		coverImageBigUrl = url.split("jpg_")[0] + "jpg"; //默认所有图片都是jpg格式的。如果不是jpg,则可能会出错
	}
	if (url.indexOf("/320_200/") > -1) { //有时裁剪标识是在后缀名之前的 目前主要发现的是“番剧”板块的列表里有,但尚不清楚其他地方的情况
		coverImageBigUrl = url.replace("/320_200", "");
	}
	window.open(coverImageBigUrl);
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址