- // ==UserScript==
- // @name blogjav.net老司机步兵辅助
- // @namespace http://greasyfork.org/zh-CN/users/25794
- // @version 1.3.1
- // @description blogjav.net网站重新排版,浏览图片下载内容更方便,是时候和封面杀手说88了。
- // @author Hobby
- // @require http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.4.min.js
- // @require http://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js
- // @include http://www.imagebam.com/image/*?url=maddawgjav.net
- // @include http://blogjav.net/*
- // @include http://115.com/*
-
- // @resource icon http://geekdream.com/image/115helper_icon_001.jpg
-
- // @run-at document-idle
- // @grant GM_xmlhttpRequest
- // @grant GM_addStyle
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_notification
- // @grant GM_setClipboard
- // @grant GM_getResourceURL
-
- // @connect *
- // @copyright hobby 2016-04-02
-
- // 交流QQ群:273406036
- // 内地用户推荐Chrome + Tampermonkey(必须扩展) + V2ray(代理) + Proxy SwitchyOmega(扩展)的环境下配合使用。
-
- // v1.3.1 修复了已知问题。
- // v1.3.0 优化了整个脚本,修复了已知问题。
- // v1.2.4 增加了avgle链接跳转,修复了bug
- // v1.2.3 修复原站更新后的已知问题
- // v1.2.2 修复了bug
- // v1.2.1 修复了bug
- // v1.2.0 增加JAV列表无限滚动自动加载,增加导航栏右上角统计已阅JAV数量和只看已阅功能。修改首页及栏目jav列表的预览图默认加载为小图,搜索入口jav列表的预览图默认加载为大图。
- // v1.1.1 代码优化,体验细节优化
- // v1.1.0 重大更新!排版优化改进!
- // v1.0.8 合成“挊”的自动获取JAV磁链接,一键自动115离线下载
- // v1.0.7 代码精简改进,修改部分内容
- // v1.0.6 修复原站更新后的已知问题
- // v1.0.5 改进性能,修复已知问题
- // v1.0.4 修复了站点子目录支持的问题
- // v1.0.3 修复了bug
- // v1.0.2 修复了部分排版问题
- // v1.0.1 增加内容大图加载失败后有缓存,点击能重新加载,以及修复了bug
- // v1.0.0 针对blogjav.net网站的支持,支持方便浏览图片
-
- // ==/UserScript==
-
- (function() {
-
- // 115用户ID
- var jav_userID = GM_getValue('jav_user_id', 0);
- //i con图标
- const icon = GM_getResourceURL('icon');
-
- //过滤文字单词的数组
- const filterWordsArray = new Array(
- 'UNCENSORED','CENSORED','IDOL','Caribbeancompr','Caribbeancom','Gachinco','10musume','天然むすめ','カリビアンコム プレミアム','カリビアンコム','FC2-PPV',
- 'GALAPAGOS','Mesubuta','1000人斬り','Tokyo Hot','AV志向','アジア天国','キャットウォーク ポイズン','G-AREA','','ABBY','エッチな4610','H4610',
- '金8天国','av9898','エッチな4610','エッチな0930','15-daifuku','','ハメる','The 変態','人妻斬り','娘姦白書','','1pondo','Kin8tengoku','Pacopacomama','Lesshin',
- 'Heydouga','Nyoshin','Unkotare','','Muramura','H0930','C0930','1000giri','XXX-AV','Kt-joker','<strong>','FC2','PPV','Leaked','41Ticket','Real Street Angels',
- '\\[FHD\\]','\\[HD\\]','\\[D9ISO\\]','\\[FHD60fps\\]','Leak','1pon','Caribpr','Carib','SM-miracle'
- );
-
- //不过滤用于判断截取字符位置的单词
- const wordsArray = new Array(
- 'S-Cute','Asiatengoku','Real-diva','Jukujo-club','\[julesjordan\]','\[colette\]','Mywife-No','Roselip','Zipang','HEYZO','1919gogo','\[DDF\] ','\[Wow\]',
- 'Blacked','\[21members\]','\[sexart\]','Heyzo', 'X1X','\[babes\]','Mywife-NO','Peepsamurai','Honnamatv','Spermmania'
- );
-
- //多文字过滤的月份字典定义,前为替换前字符,后为替换后字符
- const replaceMonth = {
- "January" : "一月","February" : "二月","March": "三月","April" : "四月","May": "五月","June" : "六月",
- "July": "七月","August" : "八月","September": "九月","October" : "十月","November": "十一月","December": "十二月"
- };
-
- class Common {
- /**
- * 过滤字典方法
- * @param str 输入原字符
- * @param replacements 替换字典
- * @returns {void | string}
- */
- static filterDict(str,replacements){
- //以下同时替换多个字符串使用到的代码,如123-->abc,456-->xyz
- Array.prototype.each = function(trans) {
- for (let i=0; i<this.length; i++)
- this[i] = trans(this[i], i, this);
- return this;
- };// todo 此方法导致115.com有问题.
- Array.prototype.map = function(trans) {
- return [].concat(this).each(trans);
- };
- RegExp.escape = function(str) {
- return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
- };
- function properties(obj) {
- var props = [];
- for (var p in obj) props.push(p);
- return props;
- }
- var regex = new RegExp(properties(replacements).map(RegExp.escape).join("|"), "g");
- str = str.replace(regex, function($0) { return replacements[$0]; });
- return str;
- }// end 替换多个字符串代码结束
- /**
- * 过滤文字单词函数
- * @param srcString 需过滤字符串
- * @returns {*|string} 过滤后的字符串
- */
- static filterWords(srcString){
- for(var i = 0; i < filterWordsArray.length ; i ++){
- if(filterWordsArray[i] !== ""){
- srcString = srcString.replace(new RegExp(filterWordsArray[i],'ig'),"").replace(/(^\s*)/g, "");
- }
- }
- return srcString;
- }
- /**
- * 判断字符串是否包含单词字典的内容
- * @param srcString 需判断字符串
- * @param wordsArr 单词字典
- * @returns {boolean}
- */
- static hasWords(srcString,wordsArr){
- for(let i = 0; i < wordsArr.length ; i ++){
- if(wordsArr[i] !== ""){
- srcString = $.trim(srcString);
- // if(srcString.split(" ")[0] === wordsArr[i]){
- if(srcString.indexOf(wordsArr[i]) > -1){
- return true;
- }
- }
- }
- return false;
- }
- static parsetext(text) {
- let doc = null;
- try {
- doc = document.implementation.createHTMLDocument('');
- doc.documentElement.innerHTML = text;
- return doc;
- }
- catch (e) {
- alert('parse error');
- }
- }
- //方法: 通用chrome通知
- static notifiy (title, body, icon, click_url){
- let notificationDetails = {
- text: body,
- title: title,
- timeout: 10000,
- image: icon,
- onclick: function() {
- window.open(click_url);
- }
- };
- GM_notification(notificationDetails);
- }
- /**
- * 创建查找av的外链html内容元素P
- * @param avCode av番号
- * @returns {*} 外链html内容元素P
- */
- static crtOutLink(avCode){
- var p = $(`
- <p style="text-align: center;color: blue;margin: 0 auto;clear: both;">他站查找 [${avCode}]:
- <a target="_blank" href="https://avgle.com/search/videos?search_query=${avCode}" title="搜 ${avCode}" class="link">avgle</a>
- <a target="_blank" href="http://www.javlibrary.com/cn/vl_searchbyid.php?keyword=${avCode}" title="搜 ${avCode}" class="link">javlibrary</a>
- <a target="_blank" href="https://www.javbus.com/search/${avCode}" title="搜 ${avCode}" class="link">javbus</a>
- <a target="_blank" href="http://maddawgjav.net/?s=${avCode}" title="搜 ${avCode}" class="link">maddawgjav</a>
- <a target="_blank" href="http://javbest.net/?s=${avCode}" title="搜 ${avCode}" class="link">javbest</a>
- <a target="_blank" href="http://javpop.com/index.php?s=${avCode}" title="搜 ${avCode}" class="link">javpop</a> 留种:
- <a target="_blank" href="https://btos.pw/search/${avCode}" title="搜 ${avCode}" class="link">btsow</a>
- <a target="_blank" href="https://btdb.in/q/${avCode}" title="搜 ${avCode}" class="link">btdb</a>
- <a target="_blank" href="http://sukebei.nyaa.si/?f=0&c=0_0&q=${avCode}" title="搜 ${avCode}" class="link">sukebei.nyaa</a>
- <a target="_blank" href="https://www.limetorrents.cc/search/all/${avCode}" title="搜 ${avCode}" class="link">limetorrents</a>
- </p>'
- `)[0];
- return p;
- }
- /**
- * http地址get方式访问
- * @param url 请求地址
- * @returns {Promise<any>} 返回Promise,可以用于同步处理。
- */
- static request (url) {
- return new Promise(resolve => {
- //let time1 = new Date();
- GM_xmlhttpRequest({
- url,
- method: 'GET',
- headers: {
- "Cache-Control": "no-cache"
- },
- timeout: 30000,
- onload: response => { //console.log(url + " reqTime:" + (new Date() - time1));
- resolve(response);
- },
- onabort: (e) =>{
- console.log(url + " abort");
- resolve("wrong");
- },
- onerror: (e) =>{
- console.log(url + " error");
- console.log(e);
- resolve("wrong");
- },
- ontimeout: (e) =>{
- console.log(url + " timeout");
- resolve("wrong");
- },
- });
- });
- }
- static addJavMovieImg(smallImgUrl,imgUrl,insertImgFunc){
- //创建新img元素
- var $img = $('<img name="javRealImg" width="66px" title="点击可放大缩小 (图片正常时)"></img>');
- //$img.attr("id",moreId);//例如:more-265519
- $img.attr("style","border: 1px solid #DDD;min-height: 233px;height:auto;cursor: pointer;float: left;");
-
- // 判断是否搜索地址进入
- let reg = new RegExp(/\?s=/);
- let reg1 = new RegExp(/&no/);
- //console.log(location.href + " 网址 " + reg.test(location.href));
- if(reg.test(location.href) && !reg1.test(location.href)){
- $img.attr("src",imgUrl);
- }
- else{
- $img.attr("src",smallImgUrl);
- }
-
- //插入图片函数,将图片插入到某个位置
- insertImgFunc($img);
-
- if(reg.test(location.href) && !reg1.test(location.href)){
- $($img[0].parentElement).attr('bigImg', '1');
- }
-
- $img.click(function(){
- let bigImgFlag = $(this.parentElement).attr('bigImg');
- //3为超时,2为异常
- if($(this).attr("loadRes") == '2' || ($(this).attr("loadRes") == '3'&& !this.complete)){
- //debugger;
- //$(this).attr("src",":0");
- Common.addJavMovieImg(smallImgUrl,imgUrl+'hobby',insertImgFunc);
- $(this).remove();
- }
-
- //如果存在(不存在)就删除(添加)一个类 'max'。
- $(this).toggleClass('max');
-
- if(!$(this).attr("class")){
- this.parentElement.parentElement.scrollIntoView();
- $(this).after(this.previousElementSibling);
- }
- else{
- $(this).before(this.nextElementSibling);
- }
-
- if(!$(this).parents(".single").attr('isView')){
- // 设置jav为已阅
- $(this).parents(".single").attr('isView','1');
-
- // 已阅JAV数+1
- $("#viewJavNbr").text(parseInt($("#viewJavNbr").text()) + 1);
- }
-
- if(!bigImgFlag){
- let $imgParentEle = $(this.parentElement);
- $imgParentEle.attr('bigImg', '1');
-
- Common.addJavMovieImg(imgUrl,imgUrl+'hobby',insertImgFunc);
- $(this).remove();
- //$imgParentEle.find('img[name="javRealImg"]').click();
- }
- if(!$(this).attr("loadMagnet")){
- $(this).attr('loadMagnet', '1');
- let rd = parseInt(Math.random()*100000000);
- new BlogjavNong($img.attr("vid"),rd,$img);
- }
-
- });
-
- $img.load(function(){
- console.log("加载完成");
- $img.attr('loadRes', '1');
- });
- $img.error(function(){
- console.log("加载异常");
- $img.attr('loadRes', '2');
- });
- setTimeout(function(){
- var res = $img.attr('loadRes');
- if(!res){
- console.log("加载超时");
- $img.attr('loadRes', '3');//加载超时
- }
- }, 30000);
- }
- };
-
- //第三方脚本
- class ThridpartyScript {}
-
- ThridpartyScript.Waterfall = class {
- /**
- * 构造函数
- * @param columnNum 瀑布流列数
- * @param selectorNext 选择下一页元素
- * @param selectorItem 选择加载页面元素
- */
- constructor(columnNum,selectorNext,selectorItem) {
- this.COL_CNT = columnNum ? columnNum : 1;
- this.global = {
- pageCount: 0,
- itemCount: 0,
- parent: $('#waterfall'),
- columnParents: Array(columnNum).fill().map(() => $('<div class="column">')),
- columnHeights: Array(columnNum).fill(0),
- nextURL: location.href,
- locked: false,
- baseURI: location.origin,
- selector: {
- next: selectorNext ? selectorNext : 'a#next',
- item: selectorItem ? selectorItem : '.item',
- },
- };
- this.intersectionObserverOptions = {
- rootMargin: `900px 0px 2000px 0px`,
- threshold: Array(5).fill().map((_, index, arr) => index / arr.length),//[0, 0.2, 0.4, 0.6, 0.8]
- };
- }
-
- // /**
- // * 处理当前页面加载项
- // * @param item 当前页面加载元素
- // */
- // processItem(item){}
-
- getNextURL(href){
- const a = document.createElement('a');
- a.href = href;
- return `${this.global.baseURI}${a.pathname}${a.search}`;
- }
-
- fetchURL(url){
- let todo = async() => {
- console.log(`fetchUrl = ${url}`);
- const resp = await fetch(url, { credentials: 'same-origin' });
- console.log(new Date());
- const html = await resp.text();
- console.log(new Date());
- const doc = new DOMParser().parseFromString(html, 'text/html');
- const href = $(doc).find(this.global.selector.next).attr('href');
- const nextURL = href ? this.getNextURL(href) : null;
- const elems = $(doc).find(this.global.selector.item);
-
- return {
- nextURL,
- elems,
- };
- };
- return todo();
- }
-
- intersectionObserver(){
- let server = new IntersectionObserver(async() => {
- let global = this.global;
- if (global.locked) { return; }
- global.locked = true;
- const { nextURL, elems } = await this.fetchURL(global.nextURL);
-
- if (global.pageCount === 0) {
- global.parent.empty().append(global.columnParents);
- }
-
- const items = elems.toArray();
- if (global.pageCount > 0 && location.pathname.includes('/star/')) {
- items.shift();
- }
-
- for (const item of items) {
- this.processItem(item);
- global.columnParents[global.itemCount % this.COL_CNT].append(item);
- global.itemCount += 1;
- }
-
- // finally
- // 已加载页数+1 页面存在20分钟自动刷新机制
- $("#addPageNbr").text(parseInt($("#addPageNbr").text()) + 1);
- $("#hisUrl").attr("href",GM_getValue("hisNextPageUrl","#"));
- global.pageCount += 1;
- global.nextURL = nextURL;
- // 设置显示当前读取到第几页。
- let currPageNbr = parseInt(nextURL.substring(nextURL.lastIndexOf('page/') + 5,nextURL.lastIndexOf('/'))) - 1;
- $("#currNextPageNbr").text(currPageNbr);
- // 加载页数大于5页,把加载到第几页的url保存到历史缓存中,同时把历史超链接移除
- if(global.pageCount > 5){
- GM_setValue("hisNextPageUrl",nextURL);
- $("#hisli").remove();
- }
- global.locked = false;
-
- if (!global.nextURL) {
- console.info('The End');
- global.parent.after($('<h1 id="end">The End</h1>'));
- server.disconnect();
- return;
- }
- }, this.intersectionObserverOptions);
- return server;
- }
- };
-
- ThridpartyScript.Nong = class {
-
- constructor(keyword,randomNum,$locateObj) {
- this.full_url = '';
- this.keyword = keyword ? keyword : "";
- this.randomNum = randomNum ? randomNum : "0";
- //初始化table
- let temp = this;
- this.cur_tab = this.full();
- this.processMagnetTab($locateObj);
- let t = $(`#jav-nong-head-${this.randomNum}`)[0].firstChild;
- t.firstChild.addEventListener('change', function (e) {
- GM_setValue('search_index', e.target.value);
- let s = $(`#nong-table-new-${temp.randomNum}`)[0];
- s.parentElement.removeChild(s);
- new BlogjavNong(temp.keyword,temp.randomNum,$locateObj);
- });
-
- if (GM_getValue('search_index', null) === null) {
- GM_setValue('search_index', Object.keys(this.resource_sites)[0]);
- }
-
- this.cur_engine(this.keyword, function (src, data) {
- if (data.length === 0) {
- let url = temp.full_url;
- $(`#nong-table-new-${temp.randomNum} #notice`).text('No search result! ');
- $(`#nong-table-new-${temp.randomNum} #notice`)
- .append(`<a href="${url}" target="_blank" style="color: red;"> Go</a>`);
- }
- else {
- temp.updata_table(src, data, 'full');
- /*display search url*/
- let y = $(`#jav-nong-head-${temp.randomNum} th`)[1].firstChild;
- y.href = temp.full_url;
- }
- });
- }
-
- /**
- * 处理加载磁链搜索列表的位置
- */
- processMagnetTab(){}
-
- cur_engine(kw, cb) {
- let ops = Object.keys(ThridpartyScript.Nong.resource_sites);
- //let z = this.resource_sites[GM_getValue('search_index', ops[0])];
- let z = ThridpartyScript.Nong.resource_sites[GM_getValue('search_index', ops[0])];
- if (!z) {
- GM_setValue('search_index', ops[0]);
- z = ThridpartyScript.Nong.resource_sites[GM_getValue('search_index')];
- }
- return z(kw, cb);
- }
-
- create_empty_table() { //有用 hobby
- return ThridpartyScript.Nong.template.creteDomElement(
- `<table class="nong-table-new" id="nong-table-new-${this.randomNum}" rd="${this.randomNum}"></table>`);
- }
-
- updata_table(src, data, type) {
- if (type == 'full') {
- let tab = $('#nong-table-new-'+ this.randomNum)[0];//"<table class="nong-table-new" id="nong-table-new-37331102" rd="37331102"></table>"
- tab.removeChild(tab.querySelector("#notice").parentElement.parentElement);
- for (let i = 0; i < data.length; i++) {
- tab.appendChild(ThridpartyScript.Nong.template.create_row(data[i]));
- }
- }
- this.reg_event();
- }
-
- full() {
- let tab = this.create_empty_table();
- tab.appendChild(ThridpartyScript.Nong.template.create_head(this.randomNum));
- tab.appendChild(ThridpartyScript.Nong.template.create_loading());
- return tab;
- }
-
- handle_event(event) {
- let maglink = event.target.parentElement.parentElement.getAttribute('maglink')
- || event.target.parentElement.parentElement.parentElement.getAttribute('maglink');
- if (event.target.className == 'nong-copy') {
- event.target.innerHTML = '成功';
- maglink = maglink.substr(0,60);
- GM_setClipboard(maglink);
- setTimeout(function () {
- event.target.innerHTML = '复制';
- }, 1000);
- event.preventDefault(); //阻止跳转
- }
- else if (event.target.className == 'nong-offline-download') {
- maglink = maglink.substr(0,60);
- GM_setValue('magnet', maglink);
- //获取115 token接口
- let promise = Common.request('http://115.com/?ct=offline&ac=space&_='+ new Date().getTime());
- promise.then((responseDetails) => {
- if (responseDetails.responseText.indexOf('html') >= 0) {
- //未登录处理
- Common.notifiy("115还没有登录",
- '请先登录115账户后,再离线下载!',
- icon,
- 'http://115.com/?mode=login'
- );
- return false;
- }
- var sign115 = JSON.parse(responseDetails.response).sign;
- var time115 = JSON.parse(responseDetails.response).time;
- console.log("uid=" + jav_userID + " sign:" + sign115 + " time:" + time115);
- console.log("rsp:" + responseDetails.response);
- GM_xmlhttpRequest({
- method: 'POST',
- url: 'http://115.com/web/lixian/?ct=lixian&ac=add_task_url', //添加115离线任务接口
- headers: {
- "Content-Type": "application/x-www-form-urlencoded"
- },
- data: "url=" + encodeURIComponent(maglink) + "&uid=" + jav_userID + "&sign=" + sign115
- + "&time=" + time115,
- onload: function (responseDetails) {
- var lxRs = JSON.parse(responseDetails.responseText); //离线结果
- if (lxRs.state) {
- //离线任务添加成功
- Common.notifiy("115老司机自动开车",
- '离线任务添加成功',
- icon,
- 'http://115.com/?tab=offline&mode=wangpan'
- );
- }
- else {
- //离线任务添加失败
- if (lxRs.errcode == '911') {
- lxRs.error_msg = '你的帐号使用异常,需要在线手工重新验证即可正常使用。';
- }
- Common.notifiy("失败了",
- '请重新打开115,' + lxRs.error_msg,
- icon,
- 'http://115.com/?tab=offline&mode=wangpan'
- );
- }
- console.log("sign:" + sign115 + " time:" + time115);
- console.log("磁链:" + maglink + " 下载结果:" + lxRs.state + " 原因:" + lxRs.error_msg);
- console.log("rsp:" + responseDetails.response);
- }
- });
-
- });
- event.preventDefault(); //阻止跳转
- }
- }
-
- reg_event() { // target 处理 更精准
- let list = [
- '.nong-copy',
- '.nong-offline-download'
- ];
- for (let i = 0; i < list.length; i++) {
- let a = document.querySelectorAll(list[i]);
- for (let u = 0; u < a.length; u++) {
- a[u].addEventListener('click', this.handle_event, false);
- }
- }
- }
-
- parse_error(a) {
- alert("调用搜索引擎错误,可能需要更新,请向作者反馈。i=" + a);
- }
- };
- ThridpartyScript.Nong.resource_sites = { // 数组函数
- "btos.pw": function (keyword, cb) { //btsow
- let promise = Common.request("https://" + GM_getValue('search_index') + "/search/" + keyword);
- promise.then((result) => {
- this.full_url = result.finalUrl;
- var doc = Common.parsetext(result.responseText);
- if (!doc) {
- this.parse_error(GM_getValue('search_index'));
- }
- var data = [];
- var t = doc.getElementsByClassName('data-list')[0];
- if (t) {
- var a = t.getElementsByTagName('a');
- for (var i = 0; i < a.length; i++) {
- if (!a[i].className.match('btn')) {
- data.push({
- 'title': a[i].title,
- 'maglink': 'magnet:?xt=urn:btih:' + a[i].outerHTML.replace(/.*hash\//, '').replace(/" .*\n.*\n.*\n.*/, ''),
- 'size': a[i].nextElementSibling.textContent,
- 'src': a[i].href,
- });
- }
- }
- }
- cb(result.finalUrl, data);
- });
- },
- "www.btdig.com": function (keyword, cb) {
- let promise = Common.request("https://" + GM_getValue('search_index') + "/search?q=" + keyword);
- promise.then((result) => {
- this.full_url = result.finalUrl;
- let doc = Common.parsetext(result.responseText);
- let data = [];
- let t = doc.querySelectorAll("div.one_result");
- if (t) {
- for (let elem of t) {
- data.push({
- "title": elem.querySelector(".torrent_name a").textContent,
- "maglink": elem.querySelector(".fa.fa-magnet a").href,
- "size": elem.querySelector(".torrent_size").textContent,
- "src": elem.querySelector(".torrent_name a").href,
- });
- }
- }
- else {
- data.push({
- "title": "没有找到磁链接",
- "maglink": "",
- "size": "0",
- "src": result.finalUrl,
- });
- }
- cb(result.finalUrl, data);
- });
- },
- "sukebei.nyaa.si": function (keyword, cb) {
- let promise = Common.request("https://" + GM_getValue('search_index') + "/?f=0&c=0_0&q=" + keyword);
- promise.then((result) => {
- this.full_url = result.finalUrl;
- let doc = Common.parsetext(result.responseText);
- if (!doc) {
- thirdparty.nong.search_engines.parse_error(GM_getValue('search_index'));
- }
- let data = [];
- let t = doc.querySelectorAll("tr.default,tr.success");
- if (t.length !== 0) {
- for (let elem of t) {
- //debugger;
- data.push({
- "title": elem.querySelector("td:nth-child(2)>a:nth-child(1)").title,
- "maglink": elem.querySelector("td:nth-child(3)>a:nth-last-child(1)").href,
- //"torrent_url": "https://nyaa.si" + elem.querySelector("td:nth-child(3)>a:nth-child(1)").href,
- "size": elem.querySelector("td:nth-child(4)").textContent,
- "src": "https://sukebei.nyaa.si"
- + elem.querySelector("td:nth-child(2)>a:nth-child(1)").getAttribute('href'),
- });
- }
- }
- cb(result.finalUrl, data);
- });
- },
- "www.torrentkitty.tv": function (keyword, cb) {
- let promise = Common.request("https://" + GM_getValue('search_index') + "/search/" + keyword);
- promise.then((result) => {
- this.full_url = result.finalUrl;
- let doc = Common.parsetext(result.responseText);
- let data = [];
- let t = doc.querySelectorAll("#archiveResult tr");
- if (t) {
- t = Array.slice(t, 1, t.length);
- for (let elem of t) {
- if((/(No result)/g).test(elem.querySelector(".name").textContent))
- break;
- data.push({
- "title": elem.querySelector(".name").textContent,
- "maglink": elem.querySelector(".action>a:nth-child(2)").href,
- "size": elem.querySelector(".size").textContent,
- "src": "https://www.torrentkitty.tv" + elem.querySelector(".action>a:nth-child(1)").getAttribute('href'),
- });
- }
- }
- else {
- data.push({
- "title": "没有找到磁链接",
- "maglink": "",
- "size": "0",
- "src": result.finalUrl,
- });
- }
- cb(result.finalUrl, data);
- });
- },
-
- };
- ThridpartyScript.Nong.offline_sites = {
- 115: {
- name: '115离线',
- url: 'http://115.com/?tab=offline&mode=wangpan',
- enable: true,
- },
- };
-
- ThridpartyScript.Nong.template = class {
- static create_head(randomNum) {
- var tr = document.createElement('tr');
- tr.className = 'jav-nong-row';
- tr.id = 'jav-nong-head-'+randomNum;
- let list = ['标题','大小','操作','离线下载'];
- for (let i = 0; i < list.length; i++) {
- let b = ThridpartyScript.Nong.template.head.cloneNode(true);
- if (i === 0) {
- let select = document.createElement("select");
- select.id = randomNum;
- let ops = Object.keys(ThridpartyScript.Nong.resource_sites);
- let cur_index = GM_getValue("search_index", ops[0]);
- for (let j = 0; j < ops.length; j++) {
- let op = document.createElement("option");
- op.value = ops[j];
- op.textContent = ops[j];
- if (cur_index == ops[j]) {
- op.setAttribute("selected", "selected");
- }
- select.appendChild(op);
- }
- b.removeChild(b.firstChild);
- b.appendChild(select);
- tr.appendChild(b);
- continue;
- }
- b.firstChild.textContent = list[i];
- tr.appendChild(b);
- }
-
- return tr;
- }
-
- static create_row(data) {
- var a = document.createElement('tr');
- a.className = 'jav-nong-row';
- a.setAttribute('maglink', data.maglink);
-
- // 暂时针对cnbtkitty.pw站点生效。
- if(data.maglink.indexOf("#magnetlink")>-1){
- a.setAttribute('id', data.id);
- let promise1 = Common.request(data.maglink + "?hobbyId=" + data.id);// 传递修改hobbyId,用于修改时定位。
- promise1.then((result) => {
- //定位磁链编码开始下标位置
- let indexNum = result.responseText.indexOf('#website#infohash#');
- if (indexNum >= 0) {
- let magnetlink = result.responseText.substring(indexNum + 18, indexNum + 58);
- let hobbyId = result.finalUrl.substring(result.finalUrl.indexOf('?hobbyId=') + 9, result.finalUrl.length);
- $("#" + hobbyId).attr("maglink", "magnet:?xt=urn:btih:" + magnetlink);
- }
- });
- }
-
- var b = document.createElement('td');
- var list = [
- this.create_info(data.title, data.maglink),
- this.create_size(data.size, data.src),
- this.create_operation(data.maglink),
- this.create_offline()
- ];
- for (var i = 0; i < list.length; i++) {
- var c = b.cloneNode(true);
- c.appendChild(list[i]);
- a.appendChild(c);
- }
- return a;
- }
-
- static create_loading() {
- return this.creteDomElement('<tr class="jav-nong-row"><td><p id="notice">Loading</p></td></tr>');
- }
-
- static create_info(title, maglink) {
- let a = this.info.cloneNode(true);
- a.firstChild.textContent = title.length < 20 ? title : title.substr(0, 20) + '...';
- a.firstChild.href = maglink;
- a.title = title;
- return a;
- }
-
- static create_size(size, src) {
- let a = this.size.cloneNode(true);
- a.textContent = size;
- a.href = src;
- return a;
- }
-
- static create_operation(maglink) {
- let a = this.operation.cloneNode(true);
- a.firstChild.href = maglink;
- return a;
- }
-
- static create_offline() { //有用 hobby
- let a = this.offline();
- a.className = 'nong-offline';
- return a;
- }
-
- static offline() {
- let a = document.createElement('div');
- let b = document.createElement('a');
- b.className = 'nong-offline-download';
- b.target = '_blank';
- let offline_sites = ThridpartyScript.Nong.offline_sites
- for (let k in offline_sites) {
- if (offline_sites[k].enable) {
- let c = b.cloneNode(true);
- c.href = offline_sites[k].url;
- c.textContent = offline_sites[k].name;
- a.appendChild(c);
- }
- }
- return a;
- }
-
- static creteDomElement(htmlStr){
- //return document.createRange().createContextualFragment(htmlString); // dom树结构出错
- //let parser = new DOMParser();
- //return (parser.parseFromString(htmlString,"text/xml")); //出错
- //return $(htmlString).get(0); // create_loading结果出错
- let div = document.createElement("div");
- $(div).append(htmlStr);
- return div.childNodes[0];
- }
- };
- ThridpartyScript.Nong.template.head = ThridpartyScript.Nong.template.creteDomElement('<th><a></a></th>');
- ThridpartyScript.Nong.template.info = ThridpartyScript.Nong.template.creteDomElement('<div><a href="src">name</a></div>');
- ThridpartyScript.Nong.template.size = ThridpartyScript.Nong.template.creteDomElement('<a>size</a>');
- ThridpartyScript.Nong.template.operation = ThridpartyScript.Nong.template.creteDomElement('<div><a class="nong-copy">复制</a></div>');
-
- // 登录115执行脚本,自动离线下载准备步骤
- ThridpartyScript.login115Run = () =>{
- if (location.host.indexOf('115.com') >= 0) {
- jav_userID = GM_getValue('jav_user_id', 0); //115用户ID缓存
- //获取115ID
- if (jav_userID === 0) {
- if (location.host.indexOf('115.com') >= 0) {
- if (typeof (window.wrappedJSObject.user_id) != 'undefined') {
- jav_userID = window.wrappedJSObject.user_id;
- GM_setValue('jav_user_id', jav_userID);
- alert('115登陆成功!');
- return;
- }
- } else {
- //alert('请先登录115账户!');
- Common.notifiy("115还没有登录",
- '请先登录115账户后,再离线下载!',
- icon,
- 'http://115.com/?mode=login'
- );
- GM_setValue('jav_user_id', 0);
- }
- }
-
- if (location.host.indexOf('115.com') >= 0) {
- console.log('jav老司机:115.com,尝试获取userid.');
- jav_userID = GM_getValue('jav_user_id', 0);
- //debugger;
- if (jav_userID !== 0) {
- console.log("jav老司机: 115账号:" + jav_userID + ",无需初始化.");
- return false;
- }
- jav_userID = $.cookie("OOFL");
- console.log("jav老司机: 115账号:" + jav_userID);
- if (!jav_userID) {
- console.log("jav老司机: 尚未登录115账号");
- return false;
- } else {
- console.log("jav老司机: 初始化成功");
- Common.notifiy('老司机自动开车', '登陆初始化成功,赶紧上车把!', icon, "");
- GM_setValue('jav_user_id', jav_userID);
- }
- return false;
- }
- }
- }
-
- class BlogjavWaterfall extends ThridpartyScript.Waterfall {
- constructor(columnNum,selectorNext,selectorItem){
- super(columnNum,selectorNext,selectorItem);
- }
-
- /**
- * 处理当前页面加载项
- * @param item 当前页面加载元素
- */
- processItem(item){
- let id = $(item).attr('id');
- if($(`#${id}`).length > 0) {
- $(item).attr('id','delete');
- $(item).empty();
- return;
- }
- // 获取文章的标题文字
- let titleStr = $(item).find("h1[itemprop='name'] a,h2[itemprop='name'] a")[0].innerHTML;
- if(location.href.indexOf("deleteOccident") > 0 ){//&& Common.hasWords(titleStr,occidentSeriesArray)
- let reg = /[\w\s&’.,:;!+-=?]/g;
- let str = titleStr.replace(reg,'');
- console.log('66665:'+str);
- str = str.replace('–','');
- console.log('66666:'+str);
- if(str.length <= 0){
- console.log('delete: '+titleStr);
- $(item).attr('id','delete');
- $(item).empty();
- return;
- }
- }
-
- let aEle = $(item).find("a.more-link")[0];
- let handleFlag = $(aEle).attr('handle');
- if(!handleFlag){
- $(aEle).attr('handle', '1');
- $(aEle).html("点击进内页");
-
- //查找title2的div元素
- let divEle = $(item).children("div.title2")[0];
- $(item).html($(item).html().replace(/Tags:/ig,'')
- .replace('View More Info & Screenshot :',''));
-
- $(item).find('.date').append(" Tags: ").append($(item).find('.tags'));
- $(item).find('.date').append(" View More Info & Screenshot: ");
- $(item).find('.date').append(aEle);
-
- let requstUrl = aEle.href;
-
- //封面图
- //let imgEle = $(item).find("img.alignnone")[0];
-
- // 过滤文字
- titleStr = titleStr.replace(/【/g, " ");
- titleStr = Common.filterWords(titleStr);
- let code = "";
-
- //如果包含指定单词字符
- if(Common.hasWords(titleStr,wordsArray)){
- // 获取av番号
- code = titleStr.split(" ")[0] + " " + titleStr.split(" ")[1];
- }
- else{
- // 获取av番号
- code = titleStr.split(" ")[0];
- }
-
-
- // 将外链元素P插入帖子div元素内最后面
- if(code !== ""){
- $(item).append(Common.crtOutLink(code));
- }
- else{
- $(item).append(Common.crtOutLink(titleStr.split(" ")[1]));
- }
- requstUrl = requstUrl.replace('#', "?");//console.log("requstUrl:"+requstUrl);
-
- //异步请求调用内页详情的访问地址
- GM_xmlhttpRequest({
- method: "GET",
- //大图地址
- url: requstUrl + "?" + code,
- headers:{
- referrer: "http://pixhost.org/"
- },
- onload: function(XMLHttpRequest) {
- let bodyStr = XMLHttpRequest.responseText;
- let yixieBody = bodyStr.substring(bodyStr.search(/<span id="more-(\S*)"><\/span>/),bodyStr.search(/<div class="category/));
-
- let dateBody = bodyStr.substring(bodyStr.search(/<span class="comm"/),bodyStr.search(/<div class="cover"/));//<span class="comm">Date: August 6th, 2015</span>
-
- let dateStr = dateBody.substring(dateBody.indexOf('<span'),dateBody.indexOf('<\/span') + 7);
- dateStr = Common.filterDict(dateStr,replaceMonth);
- //console.log("dateStr:"+dateStr);
- //console.log("finalUrl:"+XMLHttpRequest.finalUrl);
- let moreId = XMLHttpRequest.finalUrl.split("?")[1];//例如:more-265519 more-265541
- let postId = "post" + moreId.substring(4,moreId.length);//例如:post-265519 more-265541
- //console.log("post:"+postId);
-
- $(`#${postId} div[class="date"] span[itemprop="datePublished"]`).remove();
- //添加日期
- $(`#${postId} div[class="date"]`).prepend(dateStr);
-
- let img_start_idx = yixieBody.search(/"><img .*src="https*:\/\/(\S*)pixhost.*\/thumbs\//);
- //如果找到内容大图
- if( img_start_idx > 0)
- {
- // 预览JAV缩略图
- let new_img_src = yixieBody.substring(yixieBody.indexOf('src',img_start_idx) + 5,yixieBody.indexOf('alt') - 2).replace('"','');
- // 预览JAV大图
- let targetImgUrl = new_img_src.replace('thumbs','images').replace('//t','//img').replace('"','') + '?';
-
- let $imgCover = $('#'+postId+' p img');
-
- $('#'+postId+' p img.emoji').remove();
- $imgCover.attr("class","alignnone");
- $(item).find('.alignnone').nextAll().remove();
-
- // 获取av番号
- var vid = XMLHttpRequest.finalUrl.split("?")[2];
- console.log(`vid:${vid} imgUrl:${targetImgUrl} url:${XMLHttpRequest.finalUrl}`);
- Common.addJavMovieImg(new_img_src,targetImgUrl,function ($img) {
- $img.attr("vid",vid);
- $imgCover.after($img);
- });
- }
- }
- });//end GM_xmlhttpRequest
- }
- }
- }
-
- class BlogjavNong extends ThridpartyScript.Nong {
- constructor(keyword,randomNum,$locateObj){
- super(keyword,randomNum,$locateObj);
- }
-
- /**
- * 处理加载磁链搜索列表的位置
- */
- processMagnetTab($locateObj){
- //let $img = $(this).parents(".nong-table-new").siblings("img[name='javRealImg']");
- if(!$locateObj.attr("class")){
- $locateObj.after(this.cur_tab);
- }else{
- $locateObj.before(this.cur_tab);
- }
- }
- }
-
- function onlyViewsAndSeeAll(){
- //获取所有jav的div元素
- let jav_div_arr = $("div[class='single']");
- let seeAllFlag = $('#onlyViews').attr("seeall");
- for (let index = 0; index < jav_div_arr.length; index++) {
- let javDivEle = jav_div_arr[index];
- let isViewFlag = $(javDivEle).attr("isView");
-
- if(!isViewFlag || isViewFlag == '0'){
- if(seeAllFlag == '1'){
- $(javDivEle).css("display","none");//todo display: none;
- }
- else{
- $(javDivEle).css("display","");
- }
- }
- else{
- if(seeAllFlag == '1'){
- $(javDivEle).find('img[name="javRealImg"]').click();
- }
- }
- }
-
- if(seeAllFlag == '1'){
- $('#navigation')[0].scrollIntoView();
- $('#onlyViews').attr("seeall","0");
- $("#onlyViews").text("查看全部");
- }
- else{
- $('#onlyViews').attr("seeall","1");
- $("#onlyViews").text("只看已阅");
- }
- }
-
- document.addEventListener('DOMContentLoaded', function () {
- // 115脚本运行
- ThridpartyScript.login115Run();
- $("#top").remove();
- $("div.rate").remove();
-
- //覆盖原有css样式
- //GM_addStyle('body {background: white;}');
- GM_addStyle(`
- #catmenu {width: 100%;} .link {text-align: center;color: red;text-decoration: underline;}
- #top {width: 100%;} .breadcrumbs {display: -webkit-box;}
- #wrapper {width: 100%;margin: 0 auto;} .tags {width:0 !important}
- #waterfall {float: none; width: auto;height: 100%;padding:10px 0 0 10px;overflow: hidden;display: block;}
- #casing {background: #fff;width: initial;padding: 0 0 10px;}
- .right {float: left;width: 185px;padding: 0px 0 0;margin-right: 0;}
- img.alignnone {width: initial;max-width: 1000px;float: left;padding: 0px;}
- .single {width: initial;display: grid;margin: 0 0 0 10px;}/**display: table-row;*/
- #navigation {width: inherit;margin-left: 10px;}
- .max{width:auto;height:auto;max-width: none;}
- .min{width:66px;height:auto;}
- .tags{width: 200px;display: inline-table;}
- #s{width: 155px;}#search{width: 155px;}.sidebox {width: 200px;}.video {width: 175px;}.sidebox ul li {width: 195px;}.subscription_email {width: 75%;}
- `);
-
- // 挊
- GM_addStyle(`
- .nong-table-new {margin:0 0 0 5px;color:#666 !important;font-size:13px;text-align:center;background-color: #c9c7c7;float: left;border-spacing: 1px;}
- .nong-table-new th,.nong-table-new td {text-align: center;height:30px;background-color: #FFF;padding:0 1em 0;}
- .jav-nong-row{text-align: center;height:30px;background-color: #FFF;padding:0 1em 0;border: 1px solid #EFEFEF;}
- .nong-copy{color:#08c !important;}
- .nong-offline{text-align: center;}
- #jav-nong-head a {margin-right: 5px;}
- .nong-offline-download{color: rgb(0, 180, 30) !important; margin-right: 4px !important;}
- .nong-offline-download:hover{color:red !important;}
- `);
-
- //<meta http-equiv="refresh" content="1200"> 每20分钟刷新一次 目前无法处理
- $(".right").insertBefore("#content");
- $('.breadcrumbs').append($("#navigation").clone());
-
- $("#top").remove();
-
- //删除所有a元素的href为www.histats.com网址的数据
- $("a[href='http://www.histats.com']").remove();
-
- //获取分页链接的所有a元素
- var page_a_arr = $("div[class='wp-pagenavi'] a");
- for (var index = 0; index < page_a_arr.length; index++) {
- var pageAEle = page_a_arr[index];
- $(pageAEle).attr("target","_blank");
- }
-
- //导航栏上增加内容显示
- $("#catmenu").append(`<ul style="float: right;font-size: 125%;">
- <li id="hisli"><a style="color: white;" id="hisUrl">上次加载到的那一页 </a></li>
- <li><a style="color: white;">已加载页数: <span id="addPageNbr">0</span> </a></li>
- <li><a style="color: white;">已加载到第 <span id="currNextPageNbr">1</span> 页 </a></li>
- <li><a style="color: white;">已阅JAV数: <span id="viewJavNbr">0</span> </a></li>
- <li><a id="onlyViews" seeall="1" href="javascript:void(0);" style="color: red;">只看已阅</a></li>
- <li><a href="${location.pathname}?deleteOccident" style="color: yellow;">不看欧美</a></li>
- </ul>`);
- $("#onlyViews").click(function(){
- onlyViewsAndSeeAll();
- });
-
- //区分列表和详细内页
- if($('#content div[itemscope]').length > 0){
- $('#content').attr("id","waterfall");
- let blogJavWaterfall = new BlogjavWaterfall(1,'a.nextpostslink','div#content div.single');
- blogJavWaterfall.intersectionObserver().observe($('.footer').get(0));
- }
- }, false);
- })();