微博原图展开和下载 - weibo.com

2/21/2020, 5:24:50 PM

目前為 2020-02-23 提交的版本,檢視 最新版本

// ==UserScript==
// @name        微博原图展开和下载 - weibo.com
// @namespace   Violentmonkey Scripts
// @match       https://www.weibo.com/*
// @grant       none
// @version     1.0
// @author      -
// @description 2/21/2020, 5:24:50 PM
// ==/UserScript==

; (function () { // eslint-disable-line
	var butfly = function () {
		var backward = function (e, cn) {
			while (e.previousSibling) {
				e = e.previousSibling;
				if (e.classList && e.classList.contains(cn)) return e;
			}
			if (e.parentElement) return backward(e.parentElement, cn);
		}
		var panels = document.getElementsByClassName("WB_media_a_mn");
		for (var i = 0; i < panels.length; i++) {
			var info = backward(panels[i], "WB_info");
			var btn = document.createElement('a');
			btn.text = "载入所有原图";
			btn.style.cursor = 'pointer';
			btn.onclick = expand;
			btn.style["margin-left"] = "3em";
			info.append(btn);
		}
	}

	var expand = function (event) {
		var backward = function (e, cn) {
			while (e.previousSibling) {
				e = e.previousSibling;
				if (e.classList && e.classList.contains(cn)) return e;
			}
			if (e.parentElement) return backward(e.parentElement, cn);
		}
		var panel = event.target.parentElement.parentElement.getElementsByClassName("WB_media_a_mn")[0];
		var text = backward(panel, "WB_text");
		// var more = panel.getElementsByClassName("W_icon_tag_9p");
		// if (more.length > 0) {
		// 	console.debug("Media with more than 9 expanding:\n" + text.innerText);
		// 	// more[0].click();
		// }
		event.target.parentElement.append(document.createElement('hr'));
		var masonry = document.createElement('div');
		masonry.classList.add('masonry');
		var imgtitle = function (e) {
			e.target.title = '原图' + (e.target['image-seq'] + 1) + e.target.naturalWidth + "x" + e.target.naturalHeight;
		}
		for (var i = 0; i < panel.children.length; i++) {
			var li = panel.children[i];
			var img = li.children[0];
			if (img.tagName !== "IMG") continue;
			var dst = img.src.replace(/sinaimg.cn\/[^/]+\//, 'sinaimg.cn/large/');

			var atag = document.createElement('a');
			// atag
			atag.href = dst;
			atag.target = '_blank';
			atag.classList.add("masonry-item")
			// atag.style.padding = "0.5em";

			var img = document.createElement('img');
			img["image-seq"] = i;
			img.onload = imgtitle;
			img.src = dst;
			// img.style["max-height"] = "630px";
			// img.style["max-width"] = "45%";
			// img.classList.add("item_content");
			// img.classList.add("content-lar");
			atag.append(img)

			event.target.parentElement.append(atag);
		}
		event.target.parentElement.append(document.createElement('hr'));
	}

	var topbtn = function () {
		var ele = document.getElementsByClassName('W_swficon');
		if (ele.length == 0) {
			console.info("等待网页载入……");
			setTimeout(topbtn, 5);
		} else {
			ele = ele[0];
			ele.style.cursor = "pointer";
			ele.style.border = "solid 1px";
			ele.style["padding-top"] = "2px";
			ele.title = "点击启用加载原图按钮";
			ele.style.filter = "invert(100%)"
			ele.onclick = butfly;

			ele = document.getElementsByClassName('box')[0];
			ele.href = "javascript:void(0)";
			ele.title = "点击启用加载原图按钮";
			ele.onclick = butfly;
			ele.style.filter = "invert(100%)"
			console.info("点击发文输入框上方\"有什么新鲜事\"显示加载按钮(在微博作者行)。");

			var style = document.createElement("style");
			style.id = 'masonry-style';
			style.type = 'text/css';
			var css = ".masonry {-moz-column-count:3; /* Firefox */ -webkit-column-count:3; /* Safari 和 Chrome */ column-count:3; -moz-column-gap: 2em; -webkit-column-gap: 2em; column-gap: 2em; width: 80%; margin:2em auto;}";
			css += "\n.masonry-item {padding: 0.3em; margin-bottom: 0.3em; -moz-page-break-inside: avoid; -webkit-column-break-inside: avoid; break-inside: avoid; background: #f60;}";
			css += "\n.masonry-item img {max-width: 30%}";
			style.textContent = css;
			document.head.appendChild(style);
		}
	}

	document.onreadystatechange = function () {
		if (document.readyState === "complete") topbtn();
		else console.debug("document change: " + document.readyState);
	}

	document.addEventListener('DOMContentLoaded', (event) => {
		// var ele = document.getElementsByClassName('W_swficon')[0];
		// ele.style.cursor = "pointer";
		// ele.onclick = butfly;
		console.log('DOM fully loaded and parsed');
	});
}());
//#endregion