// ==UserScript==
// @name 微博图片全显示
// @namespace hzhbest
// @include http://weibo.com/*
// @include https://weibo.com/*
// @include http://www.weibo.com/*
// @include https://www.weibo.com/*
// @description 同屏显示多图微博的全部大图。
// @version 3.92
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @run-at document-end
// @license GNU GPLv3
// ==/UserScript==
(function() {
// --这里是设置区-- //
var topheight = 60; //微博顶栏高度
var topspare = 100; //滚动预留顶部高度
var autorefresh = true; //是否定时自动检测页面变化
// --以下是代码区,请不要随意改动-- //
// http://weibo.com/2710065263/BmxiVDCgt?from=page_1005052710065263_profile&wvr=6&mod=weibotime&type=comment#_rnd1436436058420
// http://weibo.com/2328516855/CnYCvixUq?type=comment#_rnd1436493435761
var regex = /weibo\.com\/\d{10}\/[a-z0-9A-Z]{9}\??/;
pinit();
function pinit(){
if (regex.test(document.location.href)) {console.log(document.location.href);
var bpimg = document.querySelector('img.big_pic');
if (!bpimg) {init();}
}
if (autorefresh){
setTimeout(pinit, 1000);console.log("wait 1 sec");
}
}
function init(){
var list_ul = document.querySelector('div.vue-recycle-scroller__item-view'); //评论框架
var expbox = document.querySelector('div[class*="content_row_-"'); //附加媒体容器
if (!list_ul && !expbox){ console.log("no1");//未加载评论框架,等候
setTimeout(init, 1000);
return;
} else if (!!list_ul && !expbox) { console.log("no2",expbox);//评论框架已加载却无附加媒体容器,退出
//getlongtext()
return;
} else {console.log("go");
//getlongtext()
go(expbox);
}
}
function go(expbox){
var wrpbox = expbox.firstElementChild;
var feedbox = document.querySelector('.vue-recycle-scroller__item-wrapper'); //评论区容器元素
var appbox = document.querySelector('WB_app_view'); //应用容器??
var videobox = expbox.getElementsByTagName('video')[0]; //视频容器
var maintextimg = getElem('//div[@class="WB_detail"]/div[@class="WB_text W_f14"]/a[@imagecard]'); //正文中的图片??
var dbox = document.body.getElementsByTagName('main')[0].parentNode.parentNode; //主容器
dbox.style.maxWidth = "none";
var imgthumbs = expbox.getElementsByTagName('img'); //提取其中的图片
var imgsrc = [], imgs = [], imgl = imgthumbs.length, mtimg;
var _limited = false;
//console.log(maintextimg.attributes[0]);
// Insert CSS
var headID = document.getElementsByTagName("head")[0];
var cssNode = creaElemIn('style', headID);
cssNode.type = 'text/css';
cssNode.innerHTML = '.big_pic{max-width: 890px;} .big_pic_n{max-width: 500px;} '; //大图样式
cssNode.innerHTML += [
'main>div {width: auto !important;}',
'.WB_frame_c {width: auto !important; max-width: 920px; min-width: 600px;}',
'.WB_text.W_f14, .repeat_list .list_box .WB_text, .WB_expand>.WB_text{width: 490px;}',
'.WB_frame_c .media_box{display: none !important;}',
'div[node-type="comment_list"] .media_box{display: block !important;}',
'div[id^="Pl_Core_RecommendFeed__"]{right: 150px; width: 100px !important; max-height: 35px; overflow: hidden; transition: all ease 0.2s 0.5s;}',
'div[id^="Pl_Core_RecommendFeed__"]:hover{width: 300px !important; max-height: 1000px;}',
'div[id^="Pl_Core_RecommendFeed__"] .opt_box{display:none;}',
'div[id^="Pl_Core_RecommendFeed__"]:hover .opt_box{display: inline-block;}'].join(); //微博自身框架样式
cssNode.innerHTML += [
'.big_pic_sc,.big_pic_nc,.big_pic_1c,.big_pic_2c,.big_pic_3c{position: fixed; left:10px; height: 20px; padding: 3px; border: 1px solid white; color: white; background: rgba(133,133,133,0.6); cursor: pointer;}',
'.big_pic_sc{top: 430px} ',
'.big_pic_nc{top: 500px;} ',
'.big_pic_1c{top: 300px;} ',
'.big_pic_2c{top: 340px;} ',
'.big_pic_3c{top: 380px;}'].join(""); //按钮样式
var sclink = creaElemIn('div', document.body); //直达评论链接
sclink.className = "big_pic_sc";
sclink.innerHTML = "直达评论";
sclink.addEventListener("click", function(){
var commentbox = document.querySelector('div.wbpro-tab3');
scrollto(getTop(commentbox) - topheight * 2);
}, false);
if (!!videobox) {
cssNode.innerHTML = [
'.big_pic_sc{position: fixed; left:10px; padding: 3px; border: 1px solid white; color: white; background: rgba(133,133,133,0.6); cursor: pointer;} ',
'.big_pic_sc{top: 430px}'].join("");
return;
}
if (!!appbox) { //检测到应用容器(微博文章或视频)时退出
box.appendChild(appbox);
if (!!wrpbox) expbox.removeChild(wrpbox);
cssNode.innerHTML = [
'.media_box{display: none !important;}',
'.big_pic_sc{position: fixed; left:10px; padding: 3px; border: 1px solid white; color: white; background: rgba(133,133,133,0.6); cursor: pointer;} ',
'.big_pic_sc{top: 430px}'].join("");
return;
}
if (!!maintextimg) { //检测到有正文转发含有图片,自动展开
maintextimg.innerHTML = "";
maintextimg.parentNode.insertBefore(document.createElement("br"), maintextimg);
mtimg = creaElemIn("img", maintextimg);
mtimg.src = maintextimg.getAttribute("imagecard").replace("pid=", "http://ww1.sinaimg.cn/bmiddle/") + ".jpg";
mtimg.className = "big_pic";
}
var j = 0;
for (var i = 0; i < imgl; i++) { console.log(j,imgthumbs[i].src); //提取大图
// https://wx2.sinaimg.cn/orj360/006QkcF9ly1gz75df9qmuj30nn061dj1.jpg
// https://wx2.sinaimg.cn/large/006QkcF9ly1gz75df9qmuj30nn061dj1.jpg
// https://wx4.sinaimg.cn/large/002MwiQagy1gz7le15xtyj60k06851kx02.jpg
if (/sinaimg.c(om|n)\/(orj|thumb)\d{3}/.test(imgthumbs[i].src)) {
imgsrc[i] = imgthumbs[i].src.replace(/(sinaimg\.c(om|n)\/)(orj|thumb)\d{3}/, "$1large");
} else if (/sinaimg.c(om|n)\/large/.test(imgthumbs[i].src)) {
imgsrc[i] = imgthumbs[i].src
} else {
j += 1; console.log(j,imgl,j == imgl);
continue;
}console.log(j,imgl);
if (j == imgl) return;
imgs[i] = creaElemIn('img', expbox);
creaElemIn('br', expbox);
imgs[i].src = imgsrc[i];
imgs[i].className = "big_pic";
}
if (j == imgl) { //没找到符合条件的大图,退出
cssNode.innerHTML = '.big_pic_sc{position: fixed; left:10px; padding: 3px; border: 1px solid white; color: white; background: rgba(133,133,133,0.6); cursor: pointer;} .big_pic_sc{top: 430px}';
return;
}
imgl = imgs.length;
if (!!mtimg) imgl = imgs.unshift(mtimg); //console.log(imgs.length);
// console.log(!!wrpbox + "1 " + !!expbox + "2");
if (!!wrpbox) expbox.removeChild(wrpbox);
var nclink = creaElemIn('div', document.body); //图片限宽链接
nclink.className = "big_pic_nc";
nclink.innerHTML = "图片限宽";
nclink.addEventListener("click", function(){
if (_limited) {
for (var i = 0; i < imgl; i++) {imgs[i].className = "big_pic";}
_limited = false;
} else {
for (var i = 0; i < imgl; i++) {imgs[i].className = "big_pic_n";}
_limited = true;
}
}, false);
var n1link = creaElemIn('div', document.body); //首个图片链接
n1link.className = "big_pic_1c";
n1link.innerHTML = "△首个图片";
n1link.addEventListener("click", function(){
scrollto(getTop(imgs[0])-topspare);
}, false);
var n2link = creaElemIn('div', document.body); //上个图片链接
n2link.className = "big_pic_2c";
n2link.innerHTML = "▲上个图片";
n2link.addEventListener("click", function(){
var t = document.documentElement.scrollTop; console.log("t:"+t);
for (var j=imgl-1; j>=0; j--) { console.log(j,getTop(imgs[j]),getTop(imgs[j]) + imgs[j].height - topspare);
if (t > getTop(imgs[j]) + imgs[j].height - topspare) {
scrollto(getTop(imgs[j]) - topspare);
n2link.innerHTML = "▲上个图片[" + (j+1) + " / " + imgl + "]";
return;
}
}
}, false);
var n3link = creaElemIn('div', document.body); //下个图片链接
n3link.className = "big_pic_3c";
n3link.innerHTML = "▼下个图片";
n3link.addEventListener("click", function(){
var t = document.documentElement.scrollTop; console.log("t:"+t);
for (var j=0; j<imgl; j++) { console.log(j,getTop(imgs[j]));
if (t < getTop(imgs[j]) - topspare) {
scrollto(getTop(imgs[j]) - topspare);
n2link.innerHTML = "▲上个图片[" + (j+1) + " / " + imgl + "]";
return;
}
}
}, false);
waitscroll();
}
function waitscroll(){ //等待页面完全载入再滚动
var list_ul = document.querySelector('div.list_ul'); //↓等待评论框架载入,如果评论框架就位就等待评论区或无评论提示载入,再视滚动位置判断
if (!list_ul || (!list_ul.getElementsByTagName('div')[0] || !document.querySelector('div.tips_rederror')) || document.documentElement.scrollTop < (topheight+70)) {
setTimeout(waitscroll, 300); //console.log("wait");
return;
} else {
scrollto(topheight); //console.log("scroll");
}
}
function scrollto(pos){ //滚动
document.documentElement.scrollTop = pos;
}
// Create an element
function creaElemIn(tagname, destin) {
var theElem = destin.appendChild(document.createElement(tagname));
return theElem;
}
// Get the first element by xpath
function getElem(xpath) {
return document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
}
// Get the absolute top of an element
function getTop(e){
var offset=e.offsetTop;
if(e.offsetParent!=null) offset+=getTop(e.offsetParent);
return offset;
}
// 通过模拟请求展开超长微博
function getlongtext() {
var longtext = document.getElementById('plc_main').querySelectorAll('[action-type="fl_unfold"]')[0]; //可展开的按钮
if (!longtext) return;
var mid = longtext.getAttribute('action-data').slice(4);
GM_xmlhttpRequest({
'method': 'GET',
'url': 'http://' + document.domain + '/p/aj/mblog/getlongtext?ajwvr=6&mid=' + mid,
'onload': function (_h) {
var html = JSON.parse(_h.responseText).data.html;
longtext.parentNode.innerHTML = html;
}
});
}
})();