// ==UserScript== // @name DMZJ漫画转为手机版链接 // @author Crab // @namespace DMZJManga@dmzj.com // @description DMZJ漫画更新页面链接转为手机版 // @include *//i.178.com/~sms.cartoon.cartoonListUid* // @include *//i.178.com/~sms.cartoon.cartoonNewList* // @include *//m.dmzj.com/* // @include *//v2.api.dmzj.com* // @include *//manhua.dmzj.com/* // @include *//user.dmzj.com/my/subscribe/mh/* // @include /^https?:\/\/i\.dmzj\.com\/\/?subscribe.*/ // @compatible firefox 34+ // @version 0.4.2 // @grant none // @downloadURL none // ==/UserScript== (function(){ if(top !== self && ['m.dmzj.com', 'v2.api.dmzj.com', 'manhua.dmzj.com/zt/module/'].some(url => new RegExp('^https?:\\/\\/' + url).test(location.href))){ return (function(){ addEventListener('message', function(event){ if(!event.data.nid.startsWith('dmzj_get_chapters') || !event.data.url || (new URL(event.data.url).host != location.host) ) return; var req = new XMLHttpRequest(); req.open('GET', event.data.url, true); req.onload = function () { event.data.response = this.responseText; top.postMessage(event.data, event.origin); }; req.send(); }); top.postMessage({nid: 'dmzj_get_chapters' + location.host}, '*'); })(); }; var gUrl = (function(){ var url = document.URL; if(/cartoonListUid|cartoonNewList/g.test(url)){ return 'cartoonList'; }else if(/^https?:\/\/manhua\.dmzj\.com\/update\_\d+\.shtml$/.test(url)){ return 'update'; }else if(/^https?:\/\/m\.dmzj\.com\/view\/.+\.html(\?t=\d+#\d+)?$/.test(url)){ return 'mobile'; }else if(/^https?:\/\/m\.dmzj\.com\/([^\/\.]+\.html)?(\?t=\d+#\d+)?$/.test(url)){ return 'mobileHome'; }else if(/^https?:\/\/manhua\.dmzj\.com\/.+$/.test(url)){ return 'desktop'; }else if(/^https?:\/\/user\.dmzj\.com\/.+$/.test(url)){ return 'oldSubscribe'; }else if(/^https?:\/\/i\.dmzj\.com\/\/?subscribe.*$/.test(url)){ return 'subscribe'; } })(); var $$ = function(e){ return Array.from(document.querySelectorAll(e)) }; //console.log(gUrl); var toMobileLink = function(a){ var a1 = a.cloneNode(true); a1.textContent = '(#)'; a1.style.color = 'orange'; a.parentNode.insertBefore(a1, a.nextSibling); a.href = a.href.replace(/\/\/manhua([^\/]+)/,'//m$1/view').replace(/shtml$/, 'html'); }; window._cE = function (name, attr, parent){ var e = document.createElement(name); for (var i in attr || []) i == 'text' ? (e.textContent = attr[i]) : e.setAttribute(i, attr[i]); parent && (Array.isArray(parent) ? parent[0].insertBefore(e, parent.length == 2 ? parent[1] : parent[0].firstChild) : parent.appendChild(e)); return e; }; if(gUrl == 'cartoonList'){ $$('.acg-content-text a[href$=shtml]').forEach(toMobileLink); }if(gUrl == 'update'){ $$('.pictext a[href$=shtml]').forEach(toMobileLink); //漫画更新页面国漫灰色显示 var gm = []; $$('.pictext a[href^="http\:\/\/www\.dmzj\.com\/"]').forEach(function(a){ var boxdiv = a; while(boxdiv){ if(boxdiv.className == 'boxdiv1'){ gm.push(boxdiv); return boxdiv.classList.add('filter'); } boxdiv = boxdiv.parentNode; } }); //将国漫排在最后 var boxs = $$('.newpic_bg, .newpic_bgno'); gm.length && $$('.boxdiv1').filter(function(m){ return gm.indexOf(m) == -1; }).concat(gm).forEach(function(m, i){ i = Math.floor(i / 4); boxs[i].appendChild(m); }); gm = boxs = null; _cE('style', {text: ` .newpic_bg::after, .newpic_bgno::after{ content: ''; display: block; clear: both; } .boxdiv1 .picborder { height:auto; } .boxdiv1.filter:not(:hover) .pictext, .boxdiv1.filter:not(:hover) .picborder { filter: grayscale(100%); } .boxdiv1.filter{ position: relative; overflow: hidden; } .boxdiv1.filter::after{ content:'国漫'; display: block; position: absolute; z-index: 1; color: white; font-size:16px; transform: rotate(-45deg); transform-origin:10px 65px; pointer-events: none; width: 100px; height: 50px; text-align: center; line-height: calc(100px - 1.5em); background: rgba(255, 165, 0, 0.7); } `}, document.head); }else if(gUrl == 'desktop'){ $$('.cartoon_online_border a[title][href$=shtml]').forEach(toMobileLink); //被隐藏的漫画至少显示最新话 var mhContainer = $$('.cartoon_online_border')[0]; if(mhContainer.firstElementChild.localName == 'img'){ mhContainer.innerHTML = ''+ g_last_update +'(#)' +'

正在加载被屏蔽的地址...

'; //var iframe = _cE('iframe', {style: 'display:none', src: 'http://m.dmzj.com/xhr'}, document.body); var iframe = _cE('iframe', {style: 'display:none', src: 'http://v2.api.dmzj.com/'}, document.body); addEventListener('message', function(e){ //if(!e.data.nid == 'dmzj_get_chapters'+'m.dmzj.com') return; if(!e.data.nid == 'dmzj_get_chapters'+'v2.api.dmzj.com') return; if(!e.data.response) //return e.source.postMessage({nid: e.data.nid, url: '/info/'+ g_comic_id + '.html'}, e.origin); return e.source.postMessage({nid: e.data.nid, url: 'http://v2.api.dmzj.com/comic/'+ g_comic_id + '.json'}, e.origin); mhContainer.innerHTML = ''; //JSON.parse(e.data.response.match(/
'; _cE('link', {href:'/css/global.css?2015111317', type: 'text/css', rel: 'stylesheet'}, document.head); _cE('link', {href:'/css/style.css?2015102217', type: 'text/css', rel: 'stylesheet'}, document.head); //shijizhiling 8785 var pathname = location.pathname.split('\/'); var id = pathname.pop().split('.').shift(); var comicName = pathname.pop(); var getChapter = queues([ callback => { if(/^\d+$/.test(comicName)){ return callback(comicName); } //获取 漫画id _cE('iframe', {style: 'display:none', src: 'http://manhua.dmzj.com/zt/module/'}, document.body); xhr('http://manhua.dmzj.com/'+ comicName + '/', callback); }, callback => { //同时加载 api iframe var onMessage = e => { if(e.data.nid == 'dmzj_get_chapters'+'v2.api.dmzj.com' && !e.data.response){ removeEventListener('message', onMessage); callback(e); } }; addEventListener('message', onMessage); _cE('iframe', {style: 'display:none', src: 'http://v2.api.dmzj.com/'}, document.body); }]).then(e => { var match = null; if(e[0].data){ match = e[0].data && e[0].data.response && e[0].data.response.match(/var g_comic_id = "(\d+)";/); match = match[1]; }else{ match = e[0]; } if(!match) return Promise.reject([e, match]); return queues([ 'http://v2.api.dmzj.com/comic/'+ match + '.json', 'http://v2.api.dmzj.com/chapter/'+ match + '/' + id + '.json' ].map(url => { return callback => { //获取漫画章节目录 var nid = 'dmzj_get_chapters' + Math.random(); var onMessage = e => { if(e.data.nid == nid && e.data.response){ removeEventListener('message', onMessage); callback(e); } }; addEventListener('message', onMessage); e[1].source.postMessage({ nid: nid, url: url }, e[1].origin); } })); }, e => console.error(e)); scriptLoader(['/js/jquery-1.9.1.min.js']).then(()=>{ queues([ getChapter,//获取章节 scriptLoader([ '/js/jquery.cookie.js', '/js/common.js', '/js/domain.js', '/js/m_reader.js?2015102416', '/js/TSB.js', '/js/main.js', '/js/jquery.lazyload.min.js', '/js/m_readerBg.js?20160720', ]), ]).then(e => { var json1 = JSON.parse(e[0][0].data.response); var json2 = JSON.parse(e[0][1].data.response); //console.log(json1, json2) var chapters = json1.chapters.map(d => { return d.data.find(cid => cid.chapter_id == id); }); var cindex = chapters.findIndex(c => c); var chapter = chapters[cindex]; var index = json1.chapters[cindex].data.indexOf(chapter); var data = { id: id, comic_id: json1.id, chapter_name: chapter.chapter_title, chapter_order: chapter.chapter_order, createtime: chapter.updatetime, page_url: json2.page_url, chapter_type:0, chapter_num:chapter.chapter_order, sum_pages:json2.picnum, direction:json2.direction, filesize:chapter.filesize, picnum:json2.picnum, hit:json1.hit_num, prev_chap_id: json1.chapters[cindex].data[index + 1].chapter_id, comment_count:json2.comment_count }; document.title = json1.title + ' - ' + chapter.chapter_title; if(index > 0){ data['next_chap_id'] = json1.chapters[cindex].data[index - 1].chapter_id } _cE('script', null, [document.body]).textContent = ` mReader.initData(${JSON.stringify(data)}, "${json1.title}", "${json1.cover}"); `; updateMobilePage(); var div = _cE('div', {id: 'chapters'}); div.innerHTML = json1.chapters.map((d, i) => { return d.data.map((c, j) => { return `
  • ${c.chapter_title}
  • ` }).join(''); }).map((c, i) => { return `
    ${json1.chapters[i].title}
    ` }).join(''); $$('.control_commentIcon')[0].href = `/viewpoint/${data.comic_id}/${data.id}.html`; $$('.BarTit')[0].textContent = chapter.chapter_title; //没有触发resize、scroll事件无法显示第一张图片 window.jQuery(window).trigger('scroll'); var btn = $$('#np_chap>a')[0]; document.body.appendChild(div); document.addEventListener('click', event=>{ if(event.target == btn){ div.classList.toggle('show'); return event.preventDefault(); } if(div.contains(event.target)) return; div.classList.remove('show'); }); }); }); }else{ updateMobilePage() } function updateMobilePage(){ _cE('style', {text: ` body .UnderPage .subHeader {background-color: rgba(255, 255, 255, 0.68);} .UnderPage{background:#222!important} #commicBox{overflow:hidden} #commicBox>div{text-align:center; } #commicBox>div>img{width:80%!important;margin: 0px -3% 0px 3%;} #pageNum { position: fixed; top: 50px; background: rgba(238, 170, 0, 0.5); color: blanchedalmond; height: 1.6em; text-align:center; line-height: 1.6em; font-size: 2.3em; right: 0px; } #np_chap{ position: fixed; bottom:30%; right: 20px; z-index: 11111; } #np_chap >div>div, #np_chap>a{ cursor: pointer; display: block; background: transparent url("/images/page_bg.png") no-repeat scroll center bottom / 100% auto; width: 40px; height:40px; transform: rotate(90deg); margin-top: 5px; box-shadow: 0 0 6px -2px rgba(255, 255, 255, 0.65); border-radius: 8px; } #np_chap>div>div:not(:hover), #np_chap>a:not(:hover){ opacity: .5; } #np_chap>div>div:last-child{ transform: rotate(-90deg); } #np_chap>a{ background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAAhFBMVEUAAABwcHAAAAAPDw8mJibg4OBBQUHv7+/n5+dOTk4vLy8fHx8AAAAAAAAAAAD29vavr6+Tk5N1dXU5OTlsbGxYWFj5+fnOzs7FxcW6urqlpaWLi4uBgYHY2Nh1dXXKysqxsbFlZWUAAAAAAABra2uBgYGDg4N3d3elpaWXl5c0NDT///8HMrCeAAAAK3RSTlOz1AG4v/fE/fvLv7qSjU39+ffUwtHL/vv6+fj39fT07ebPvBPy1u3i4NzPM5mL/wAAAYBJREFUWMPtmceOgzAURQ04mDKE3iGQXu7//984bKYGDFgaaeSzvjp6er7ywia6rm89IgVvy2VEP74RabwduZD7JBp1siUy4TpPqo/rFAqFYgUGpYZU4Ymxk8z5GgawRtqMNGTgsJDK8cUVUERRAVSxDJ8ZAHlKSJoDgbl+fXaOrDAHc5Eht9cK9xYQOGTACQBrv84XbYCQfpwOsFlTH7ex4Df003k3Pqydu9TnPAc6G19WuuMj185CX899CflGwo39ImPccV9KfpByY7egkHaboTN/LWaHrLVn16UF+vjF7D3QzquP8azLzXm53RuwiYwZddllsO7uSODO+yReH7cGrPN45mwBtaCRVgBLplIJAyoq4jNLH3lqTK45beGXIvUpgNIWKlbJk9OxGqhM8Zuyno4Fw+1ymEgNARoGRIzD43IdT1wvD64UJ4E/HvCRkDlowHgA0JRQCZVQCVcLDQ2TaMZfCokdaRNENlEoFIp/hSdZJ/1hXPbTvfzPBenfH+9ViDEgemODEwAAAABJRU5ErkJggg=='); transform:none; } #tucao{ position: fixed; top: 50px; left: 0; color: #fff; z-index: 1111111; height: calc(100% - 115px); } #tucao:not(:hover){ opacity: 0.5 } #tucao ul{ overflow-y:hidden; height: calc(100% - 40px); } #tucao:hover ul{ overflow-y: scroll; } #tucao pre{ font-weight: bold; margin-bottom: 5px; } #tucao li{ margin-bottom: 5px; margin-left: 3px; } #tucao span{ padding: 0px 3px; border-radius: 2px; cursor: pointer; border:transparent 1px solid; } #tucao span:hover{ background-color:#FFF!important; color:#000; border-color:red; } .control_scroll{ margin-top: 0!important; padding-top:0!important; opacity:.5; transition: opacity 0.3s cubic-bezier(.55,.09,.68,.53) 0s; } .control_scroll:hover{ opacity:1; } #m_r_bottom{ display:block!important; height:38px!important } #m_r_bottom>.BtnBox{ display:none; } #m_r_slider{ background-clip: content-box; padding: 14px 0px; top: 3px; } #m_r_slider_ball{ top: 3px; } .control_commentIcon{ margin-top: 9px; } /*#m_r_panelbox{display:none!important} #commicBox>div>img{border-top:2px solid red;margin-top:-2px;}*/ #chapters { display:none; position: fixed; z-index: 100000000000; width: 60%; max-width: 400px; height: 80%; overflow-y: scroll; top:50%; left: 50%; transform: translate(-50%, -50%); background: rgba(255,255,255,.9); border: 5px solid rgba(0,0,0,.5); border-radius: 5px; padding: 10px; } #chapters.show{ display:block; } #chapters ul:after{ display: list-item; clear: both; content: ''; } #chapters dt{ border-bottom: 2px solid #ccc; font-size: 150%; text-indent: .5em; padding: 5px 0; } #chapters dl+dl{ border-top: 2px solid #ccc; } #chapters li{ float: left; width: 33%; padding: 2px 8px; box-sizing: border-box; } #chapters a{ display: inline-block; border: 2px solid transparent; padding:0 5px; color: #000; max-width: 100%; white-space: pre; overflow: hidden; text-overflow: ellipsis; } #chapters a:hover{ color:blue; border-color:blue; } #chapters a.cur{ border-color:orange; } `}, document.head); var data = $$('body script:not([src])')[0].textContent.match(/mReader\.initData\(([^}]+\}),/); try{ data = JSON.parse(data[1]); console.info(data.page_url.join('\n')); }catch(e){ return console.error(e); } var np_chap = _cE('span', {id:'np_chap'}, document.body), np = _cE('div', null, np_chap); _cE('a', {title: '章节目录', href: '../../info/'+data.comic_id+'.html'}, [np_chap]); _cE('div', {title: '上一话', onclick: 'mReader.prevBtnAction()'}, np).style.display = data.prev_chap_id ? '' : 'none'; _cE('div', {title: '下一话', onclick: 'mReader.nextBtnAction()'}, np).style.display = data.next_chap_id ? '' : 'none'; _cE('script', {text: '('+(function(chapter_name){ window.success_jsonpCallback = function(json){ var length = json.data && json.data.list && json.data.list.length || 0; tucao.innerHTML = ''; _cE('pre', {text: chapter_name+'\n'+(json.msg=='提交成功'? '' : ' '+json.msg) + (length ? ' 现有 '+ length+'/'+(json.data && json.data.total || 0)+' 吐槽:' : '')}, tucao); if(!length) return; var ul = _cE('ul', null, tucao), opacity = 1, tc = null; for(var i=0; i")'}, document.head); var tucao = _cE('div', {id:'tucao', text: '评论加载中..'}, document.body); _cE('script', {src: 'http://interface.dmzj.com/api/viewpoint/getViewpoint?callback=success_jsonpCallback&more=1&type='+data.chapter_type+ '&type_id='+data.comic_id+'&chapter_id='+data.id+'&_='+ new Date().getTime()}, document.body); window._pageNum = _cE('div', {id:'pageNum', text: '1/'+data.sum_pages}, document.body); var scrollTimeout; var imgs = null; //改良原来的获取当前页码方法 mReader.getCurrPage = function(){ imgs = imgs || document.querySelector('#commicBox>div[id]').children; var ch = document.documentElement.clientHeight; for(var i=0;i 95) return i + 1; } }; addEventListener('scroll', function(){ clearTimeout(scrollTimeout); scrollTimeout = setTimeout(function(){ // 页码 !window._dragToScroll && mReader.updatePageDisplay(); window._dragToScroll = false; var i = mReader.getCurrPage(); if(i) return (_pageNum._page != i) && (_pageNum.textContent = (_pageNum._page = i)+'/'+data.sum_pages); }, 100); }); //修复拖拽进度条 var slider = $$('#m_r_slider_ball')[0], sliderBar = $$('#m_r_slider')[0]; if(slider && sliderBar){ window._isSlider = false; window._sliderOffset = 0; mReader.clickAction = eval('('+ mReader.clickAction.toString() .replace(/#m_r_bottom/g, '#mark') +').bind(mReader)'); //拖拽滑块跳转 addEventListener('mousemove', eval('('+ mReader.touchMoveAction.toString() .replace(/^.*\{/, '$&\nif(!window._isSlider) return;\n') .replace('touches[0]', 'event') .replace('32 -', 'window._sliderOffset - 2*') .replace(/.*\}$/,'window._pageNum.textContent = this.curr_page + "/"+ this.page_num;$&') +').bind(mReader)')); slider.onmousedown = function(e){ if(event.button !== 0 || e.target !== this) return; window._isSlider = true; window._sliderOffset = e.clientX - this.offsetLeft - this.parentNode.offsetLeft; }; addEventListener('mouseup', function(event){ if(!window._isSlider) return; window._isSlider = false; window._dragToScroll = true; mReader.touchEndAction(); }); //点击进度条位置跳转 sliderBar.addEventListener('mousedown', eval('('+ mReader.touchMoveAction.toString() .replace(/^.*\{/, '$&\nif(event.button !== 0)return;\nwindow._isSlider = true; window._dragToScroll = true;\n') .replace('touches[0]', 'event') .replace('32 -', '2*') .replace('currX < max', 'currX <= max') .replace(/.*\}$/,'window._pageNum.textContent = this.curr_page + "/"+ this.page_num;$&') +').bind(mReader)')); } }//updateMobilePage end }else if('mobileHome'== gUrl){ _cE('style', {text: ` .imgBox [class^='col_3_'] li{ width: 10%!important; min-width: 120px; margin: 0px 0% 0% 3%!important; } .imgBox [class^='col_2'] li{ width: 18%!important; min-width: 200px; } .imgBox [class^='col_3_'] li img{ height: auto!important; } .imgBox [class^='col_3_'] li:nth-child(7n+1){ clear:left; } `}, document.head); } })();