pvcep_rules

Rules for /scripts/24204-Picviewer-CE-plus

As of 15/03/2023. See the latest version.

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.sleazyfork.org/scripts/438080/1161725/pvcep_rules.js

  1. /*
  2. PVCEP - Rules for Picviewer CE+
  3. <https://github.com/hoothin/UserScripts/blob/master/Picviewer%20CE%2B/pvcep_rules.js>
  4.  
  5. (c) 2021-2022 Hoothin <rixixi [at] gmail.com>
  6. Licenced under the MIT license.
  7.  
  8. 最少仅需
  9. {
  10. name: 站点名
  11. r: 图片链接正则或者待替换字符串
  12. s: 替换目标字符串
  13. }
  14. 或者
  15. {
  16. name: 站点名
  17. getImage: 图片链接替换函数
  18. }
  19. 其他参数项按需添加即可,需要注意 css/ext/xhr/lazyAttr(懒加载的原图 URL 属性名)/description(收藏图片时的描述,支持选择器或 xpath)/clickToOpen 在指定站点 URL 之后方可使用
  20. xhr 为内页图片获取属性,配合 getImage 使用,首先使用 getImage 筛选并返回父级 a 标签的 url,然后脚本会自动抓取该 url 指向的网页,通过 xhr 获取图片,其中 xhr.q 为图片(可以为多张,多张将添加到图库)的选择器或者函数
  21. */
  22. var siteInfo=[
  23. {
  24. name: "google 图片搜索",
  25. //网址例子 ( 方便测试和查看 )
  26. example:"http://www.google.com.hk/search?q=firefox&tbm=isch",
  27. //是否启用
  28. enabled:true,
  29. //站点正则,匹配站点url该条规则才会生效
  30. url:/https?:\/\/www.google(\.\w{1,3}){1,3}\/search\?.*&tbm=isch/,
  31. //鼠标左键点击直接打开(仅当高级规则的getImage()返回图片的时候生效)
  32. clickToOpen:{
  33. enabled:false,
  34. preventDefault:true,//是否尝试阻止点击的默认行为(比如如果是你点的是一个链接,默认行为是打开这个链接,如果是true,js会尝试阻止链接的打开(如果想临时打开这个链接,请使用右键的打开命令))
  35. type:'actual',//默认的打开方式: 'actual'(弹出,原始图片) 'magnifier'(放大镜) 'current'(弹出,当前图片)
  36. },
  37. //获取图片实际地址的处理函数,
  38. //this 为当前鼠标悬浮图片的引用,
  39. //第一个参数为当前图片的父元素中第一个a元素(可能不存在)
  40. //第二个参数为保存当前图片所有父元素的数组
  41. getImage:function(a){
  42. if(!a)return;
  43. let jsaction = a.getAttribute("jsaction");
  44. if(!jsaction || jsaction.indexOf('mousedown')==-1)return;
  45. var fakeEvent = new MouseEvent('mousedown', {bubbles: true});
  46. a.dispatchEvent(fakeEvent);
  47. if (a.href.match(/imgurl=(.*?\.\w{1,5})&/i)) {
  48. return decodeURIComponent(RegExp.$1);
  49. }
  50. },
  51. // 自定义样式
  52. // css: '',
  53. // 如果图片藏在非img标签后面,使用此项获取被遮挡的img元素。
  54. // 其中previous代表前面一个元素,previous-2代表前面第二个元素,next代表后面一个元素。
  55. // 或者直接用函数获取,传入当前元素,返回查找到的元素或是null。
  56. // ext: 'previous-2',
  57. // 排除的图片正则
  58. // exclude: /weixin_code\.png$/i,
  59. // 需要替换的图片正则,匹配上图片url该条规则才生效
  60. // src: /avatar/i,
  61. // 正则或字符串检测内容,可以为含有多组规则的数组,若为字符串则只进行字符串替换
  62. // r: /\?.*$/i,
  63. // 正则或字符串替换内容,可以与上一条一一对应,也可以以数组对应检测正则的其中一条,比如希望有多个结果尝试显示原图
  64. // s: ''
  65. },
  66. {
  67. name: "123rf",
  68. url: /123rf\.com/,
  69. r: /us\.123rf\.com\/\d+wm\//i,
  70. s: "previews.123rf.com/images/"
  71. },
  72. {
  73. name: "126",
  74. src: /\.126\.net/i,
  75. r: /\/\d+\.\d+x\d+\.\d+\.([^\.]+)$/i,
  76. s: '/5.5000x5000.100.$1'
  77. },
  78. {
  79. name:"178.com",
  80. enabled:true,
  81. url:/^https?:\/\/(?:\w+\.)+178\.com\//i,
  82. clickToOpen:{
  83. enabled:true,
  84. preventDefault:true,
  85. type:'actual',
  86. },
  87. getImage:function(a){
  88. if(!a)return;
  89. var reg=/^https?:\/\/(?:\w+\.)+178\.com\/.+?(https?:\/\/img\d*.178.com\/[^.]+\.(?:jpg|jpeg|png|gif|bmp))/i;
  90. return (a.href.match(reg) || [])[1];
  91. }
  92. },
  93. {
  94. name: "24meitu",
  95. url: /24meitu\.com|25meinv\.com|aisimeinv\.com|24tupian\.com|24meinv\.|24mntp\.|24cos\.|24fh\.|24shipin\.|24mn\./,
  96. r: [/\/m([^\/]+)$/i,
  97. /imgs\./i],
  98. s: ["/$1","bimg."]
  99. },
  100. {
  101. name: "bing 图片搜索",
  102. example:"http://cn.bing.com/images/search?q=%E7%BE%8E%E5%A5%B3",
  103. enabled:true,
  104. url: /^https?:\/\/[^.]*\.bing\.com\/images\//i,
  105. getImage:function(a){
  106. if (!a) return;
  107. var oldsrc=this.src;
  108. var $ = /,imgurl:"([^"]+)/.exec(a.getAttribute('m'));
  109. var newsrc= $ ? $[1] : '';
  110. if(newsrc!=oldsrc)return newsrc;
  111. }
  112. },
  113. {
  114. name:"百度贴吧",
  115. enabled:true,
  116. url:/^https?:\/\/tieba\.baidu\.[^\/]+\//i,
  117. r: [/\/sys\/portrait/i,
  118. /^(http:\/\/tiebapic\.baidu\.com\/forum\/)ab(pic\/item\/[\w.]+)/i],
  119. s: ["/sys/portraitl", "$1$2"],
  120. getImage: function(a, p, rule) {
  121. rule.stopXhr = true;
  122. let pid = this.src.match(/\.baidu\.com\/forum\/w.*\/(\w+)\./);
  123. if (!pid) return null;
  124. pid = pid[1];
  125. let tid = 0;
  126. let tidm = location.href.match(/\/p\/(\d+)/);
  127. if (tidm) tid = tidm[1];
  128. if (tid) {
  129. let kw = document.querySelector(`#wd2`);
  130. if (kw && kw.value) {
  131. rule.stopXhr = false;
  132. return `https://tieba.baidu.com/photo/bw/picture/guide?kw=${kw.value}&tid=${tid}&pic_id=${pid}&see_lz=0&from_page=0&alt=jview`;
  133. }
  134. }
  135. let bsrc = this.getAttribute('bpic');
  136. return bsrc || null;
  137. },
  138. xhr: {
  139. q: function(html, doc, url) {
  140. let data = JSON.parse(html);
  141. if (!data) return null;
  142. let pid = url.match(/&pic_id=(\w+)/)[1];
  143. for (let key in data.data.pic_list) {
  144. let pic = data.data.pic_list[key];
  145. if (pic.img.screen.id == pid) return pic.img.screen.waterurl;
  146. }
  147. return null;
  148. }
  149. }
  150. },
  151. {
  152. name: "百度图片搜索",
  153. example: "http://image.baidu.com/i?ie=utf-8&word=%E9%A3%8E%E6%99%AF&oq=%E9%A3%8E%E6%99",
  154. enabled: true,
  155. url: /^https?:\/\/image\.baidu\.com\/.*&word=/i,
  156. getImage: function(a) {
  157. if (!a) return;
  158. var reg = /&objurl=(http.*?\.(?:jpg|jpeg|png|gif|bmp))/i;
  159. if (a.href.match(reg)) {
  160. return decodeURIComponent(RegExp.$1);
  161. }
  162. }
  163. },
  164. {
  165. name:"豆瓣",
  166. example:"http://movie.douban.com/photos/photo/1000656155/",
  167. enabled: true,
  168. url:/^https?:\/\/[^.]*\.douban\.com/i,
  169. getImage:function(){
  170. var oldsrc = this.src,
  171. newsrc = oldsrc;
  172. var pic = /\/view\/photo\/(?:photo|albumcover|albumicon|thumb|sqxs)\/public\//i;
  173. var movieCover = /\/view\/movie_poster_cover\/[si]pst\/public\//i;
  174. var bookCover = /\/view\/ark_article_cover\/cut\/public\//i;
  175. var spic = /(img\d+.douban.com)\/[sm]pic\//i;
  176. var ratio = /s_ratio_poster/i;
  177. if(/\/subject\/\d+\/discussion/.test(location.href)){
  178. } else if (pic.test(oldsrc)) {
  179. newsrc = oldsrc.replace(pic, '/view/photo/raw/public/');
  180. } else if (movieCover.test(oldsrc)) {
  181. newsrc = oldsrc.replace(movieCover, '/view/photo/raw/public/');
  182. } else if (bookCover.test(oldsrc)) {
  183. newsrc = oldsrc.replace(bookCover, '/view/ark_article_cover/retina/public/');
  184. } else if (spic.test(oldsrc)) {
  185. newsrc = oldsrc.replace(spic, '$1/lpic/');
  186. } else if (ratio.test(oldsrc)) {
  187. newsrc = oldsrc.replace(ratio, 'l');
  188. }
  189. return newsrc == oldsrc ? null : [newsrc,newsrc.replace(/photo\/raw/,"photo/photo")];
  190. }
  191. },
  192. {
  193. name:"bilibili",
  194. enabled:true,
  195. url:/^https?:\/\/[^.]+\.bilibili.com/i,
  196. ext: function(target) {
  197. if(target && target.parentNode){
  198. return target.parentNode.querySelector("img");
  199. }
  200. },
  201. r: /\d+_\d+\/|\d+_x\d+\.jpg$|@\d+w_\d+h.*\.webp$|_\d+x\d+\.jpg$/i,
  202. s: ""
  203. },
  204. {
  205. name: "deviantart",
  206. example: "http://www.deviantart.com",
  207. enabled:true,
  208. url:/^https?:\/\/[^.]*\.deviantart\.com/i,
  209. getImage:function(a, p){
  210. let id,self=this;
  211. if(p[1] && p[1].dataset.hook=="deviation_link"){
  212. id=p[1].href.replace(/.*?(\d+)$/,"$1");
  213. }else if(p[2] && p[2].dataset.hook=="deviation_link"){
  214. id=p[2].href.replace(/.*?(\d+)$/,"$1");
  215. }
  216. if(/\?token/.test(this.src)){
  217. if(!this.dataset.pvsrc && id){
  218. this.dataset.pvsrc="t";
  219. GM_xmlhttpRequest({
  220. method: 'get',
  221. responseType: "json",
  222. url: '/_napi/shared_api/deviation/extended_fetch?deviationid='+id+'&type=art&include_session=false',
  223. onload: function(d) {
  224. var media = (d.response && d.response.deviation)?d.response.deviation.media:null;
  225. var fullview = media && media.types && media.types.find(t=>{return t.t=='fullview'});
  226. if(media && media.baseUri && fullview && media.token){
  227. var resultUrl=media.baseUri+(fullview.c?fullview.c.replace("<prettyName>",media.prettyName).replace(/,q_\d+/,",q_100"):"")+"?token="+media.token[0];
  228. self.dataset.pvsrc=resultUrl;
  229. if(floatBar){
  230. floatBar.update(self, self.dataset.pvsrc);
  231. }
  232. }
  233. }
  234. });
  235. }else if(this.dataset.pvsrc!="t" && id){
  236. return this.dataset.pvsrc;
  237. }
  238. }
  239. return null;
  240. },
  241. },
  242. {
  243. name: '花瓣网',
  244. enabled: true,
  245. url: /^https?:\/\/huaban\.com\//i,
  246. ext: 'previous-2',
  247. r: /(.*img.hb.aicdn.com\/.*)_fw(?:236|320)$/i,
  248. s: '$1_fw658',
  249. description: './../following-sibling::p[@class="description"]',
  250. // css: '.pin a.img .cover { display: none; }',
  251. exclude: /weixin_code\.png$/i,
  252. },
  253. {
  254. name: "wikipedia",
  255. enabled:true,
  256. url:/^https?:\/\/.+\.wikipedia\.org\//i,
  257. r: /(https?:\/\/.*)\/thumb(\/.*)\/\d+px-.*/i,
  258. s: "$1$2"
  259. },
  260. {
  261. name:"沪江碎碎",
  262. enabled:true,
  263. url:/^https?:\/\/([^.]+\.)*(?:yeshj\.com|hjenglish\.com|hujiang\.com)/i,
  264. r: /^(https?:\/\/(?:[^.]+\.)*hjfile.cn\/.+)(_(?:s|m))(\.\w+)$/i,
  265. s: '$1$3'
  266. },
  267. {
  268. name: '大众点评',
  269. example: 'http://www.dianping.com/shop/17873296/photos',
  270. url: /^https?:\/\/www.dianping.com\/shop/i,
  271. r: /(.+?dpfile\.com\/.+)\(240c180\)\/(thumb\..+)/i,
  272. s: '$1(700x700)/$2'
  273. },
  274. {
  275. name: 'trakt.tv',
  276. url: /^http:\/\/trakt\.tv\//i,
  277. example: 'http://trakt.tv/shows',
  278. r: /(.*\/images\/posters\/\d+)-(?:300|138)\.jpg\?(\d+)$/i,
  279. s: "$1.jpg?$2"
  280. },
  281. {
  282. name: '网易云音乐',
  283. url: 'http://music.163.com/*',
  284. ext: 'previous',
  285. getImage: function() {
  286. var oldsrc = this.src;
  287. if(this.data){
  288. var newsrc = this.data('src');
  289. if (oldsrc != newsrc) {
  290. return newsrc;
  291. }
  292. }
  293. if (oldsrc.match(/(.*)\?param=\d+y\d+$/)) {
  294. return RegExp.$1;
  295. }
  296. }
  297. },
  298. {
  299. name: "美女薄情馆",
  300. url: /^http:\/\/boqingguan\.com\//i,
  301. example: 'http://boqingguan.com/Picture/31637',
  302. lazyAttr: 'data-original',
  303. getImage: function(a) {
  304. var oldsrc = this.getAttribute('data-original') || this.src;
  305. if (oldsrc) {
  306. var newsrc = oldsrc.replace(/![a-z\d]+$/, '');
  307. return newsrc == oldsrc ? '' : newsrc;
  308. }
  309. }
  310. },
  311. {
  312. name:"极限主题社区",
  313. enabled:true,
  314. url:/^https?:\/\/bbs\.themex\.net\/.+/i,
  315. clickToOpen:{
  316. enabled:true,
  317. preventDefault:true,
  318. type:'actual',
  319. },
  320. r: /^(https?:\/\/bbs\.themex\.net\/attachment\.php\?.+)&thumb=1(.+)/i,
  321. s: '$1$2'
  322. },
  323. {
  324. name:"opera官方论坛",
  325. example:"http://bbs.operachina.com",
  326. enabled:true,
  327. url:/^http:\/\/bbs\.operachina\.com/i,
  328. src: /file.php\?id=\d+$/i,
  329. r: /.*/,
  330. s: "$1&mode=view"
  331. },
  332. {
  333. name: 'github 修正',
  334. url: /^https?:\/\/github\.com\//i,
  335. clickToOpen: {
  336. enabled: false,
  337. preventDefault: true,
  338. type: 'actual',
  339. },
  340. getImage: function(a) {
  341. if (a && a.href.indexOf('/blob/master/') > 0) {
  342. return this.src;
  343. }
  344. }
  345. },
  346. {
  347. name: '优美图',
  348. url: /http:\/\/(?:www\.)?topit\.me\//,
  349. getImage: function(a) {
  350. if (a && a.href.match(/topit\.me\/item\/\d+/)) {
  351. return a.href;
  352. }
  353. },
  354. lazyAttr: 'data-original',
  355. xhr: {
  356. q: ['a[download]', 'a#item-tip'],
  357. }
  358. },
  359. {
  360. name: '半次元',
  361. url: /^https?:\/\/bcy\.net\//,
  362. r: [/\/\dX\d$|\/w\d+$/i,
  363. "/cover/",
  364. /\/(middle|small)\.jpg/i],
  365. s: ["", "/post/", "/big.jpg"]
  366. },
  367. {
  368. name: 'Steampowered',
  369. url: /\.steampowered\.com/,
  370. r: /\.\d+x\d+\.jpg/i,
  371. s: ".jpg"
  372. },
  373. {
  374. name: 'Steamcommunity',
  375. url: /steamcommunity\.com/,
  376. r: /output\-quality=\d+&fit=inside\|\d+\:\d+/i,
  377. s: "output-quality=100&fit=inside|0:0"
  378. },
  379. {
  380. name: '知乎',
  381. url: /(zhihu|zhimg)\.com/,
  382. r: /_(b|xs|s|l|\d+x\d+)\./i,
  383. s: "."
  384. },
  385. {
  386. name: '500px',
  387. url: /500px\./,
  388. r: [/\/w%3D\d+_h%3D\d+\/v2.*/i,
  389. /^((?:(?:pp?cdn|s\\d\\.amazonaws\\.com\/photos|gp\\d+\\.wac\\.edgecastcdn\\.net\/806614\/photos\/photos)\\.500px|djlhggipcyllo\\.cloudfront)\\.(?:net|org)\/\\d+\/[\\da-f]{40}\/)\\d+\\./],
  390. s: ["/m%3D2048_k%3D1_of%3D1/v2",
  391. "$12048.jpg"]
  392. },
  393. {
  394. name: 'Nyaa',
  395. url: /nyaa\.se/,
  396. r: /upload\/small\//i,
  397. s: "upload/big/"
  398. },
  399. {
  400. name: "itunes",
  401. url: /itunes\.apple\.com/,
  402. r: /\d+x\d+bb\./i,
  403. s: "1400x1400bb."
  404. },
  405. {
  406. name: "汽车之家",
  407. url: /\.autohome\.com\.cn/,
  408. r: /(\?imageView.*|\d+x\d+_\d+_|f_m_|t_|s_)/i,
  409. s: ""
  410. },
  411. {
  412. name: "易车",
  413. url: /\.bitauto\.com/,
  414. r: /_\d+\.jpg$/i,
  415. s: "_12.jpg"
  416. },
  417. {
  418. name: "爱卡",
  419. url: /\.xcar\.com\.cn/,
  420. r: /\-\d+x\d+\.jpg/i,
  421. s: ""
  422. },
  423. {
  424. name: "太平洋汽车",
  425. url: /\.pcauto\.com\.cn/,
  426. r: /_\d+x\d+\.jpg$/i,
  427. s: ".jpg"
  428. },
  429. {
  430. name: "新浪汽车",
  431. url: /\.auto\.sina\.com\.cn/,
  432. r: /_\d+\.jpg$/i,
  433. s: "_src.jpg"
  434. },
  435. {
  436. name: "greasyfork",
  437. url: /(greasyfork|sleazyfork)\.org/,
  438. getImage: function() {
  439. if(this.parentNode.nodeName=="A" && /amazonaws\.com/.test(this.parentNode.href)){
  440. return this.parentNode.href;
  441. }
  442. return this.src.replace(/\/thumb\//i,"/original/").replace(/\/thumbnails\//i,"/").replace(/(\/forum\/uploads\/userpics\/.*\/)n([^\/]+)$/,"$1p$2");
  443. }
  444. },
  445. {
  446. name: "dribbble",
  447. url: /dribbble\.com/,
  448. r: [/_teaser(.[^\.]+)$/i,
  449. /_1x\./i,
  450. /\?compress=.*/],
  451. s: ["$1",".",""]
  452. },
  453. {
  454. name: "百度百科",
  455. url: /baike\.baidu\.com/,
  456. r: [/.*bdstatic\.com.*\/([^\/]+)\.jpg/i,
  457. /(.*bkimg\.cdn\.bcebos\.com.*\?x-bce-process=image).*/i],
  458. s: ["http://imgsrc.baidu.com/baike/pic/item/$1.jpg",
  459. "$1"]
  460. },
  461. {
  462. name: "nvshens",
  463. url: /nvshens\.com|onvshen\.com/,
  464. r: /(\img\.onvshen\.com.*)(?:thumb\/|_s)(.*)/i,
  465. s: "$1$2"
  466. },
  467. {
  468. name: "Tumblr",
  469. url: /tumblr\.com/,
  470. exclude: /\/avatar_/i,
  471. r: /[^\/]*(media\.tumblr\.com.*_)\d+(\.[^\.]+)$/i,
  472. s: "$1raw$2"
  473. },
  474. {
  475. name: "Tumblr",
  476. url: /tumblr\.com/,
  477. src: /\/avatar_/i,
  478. r: /(media\.tumblr\.com.*_)[^_]+(\.[^\.]+)$/i,
  479. s: "$1512$2"
  480. },
  481. {
  482. name: "Acgget",
  483. url: /acg18\.us|acgget\./,
  484. r: /(pic\.acgget\.com\/thumb\/)w\d+_h\d+\//i,
  485. s: "$1w9999_h9999/"
  486. },
  487. {
  488. name: "Pixiv",
  489. url: /pixiv\.net|pximg\.net/,
  490. src: /pximg\.net\/c\/\d+x\d+/i,
  491. r: /pximg\.net\/c\/\d+x\d+.*\/img\/(.*)_.*$/i,
  492. s: ["pximg.net/img-original/img/$1.jpg","pximg.net/img-original/img/$1.png"]
  493. },
  494. {
  495. name: "Wallhaven",
  496. url: /wallhaven\./,
  497. src: /wallpapers\/thumb\/small\/th|th\.wallhaven\.cc\/(small|lg)\//i,
  498. r: [/wallpapers\/thumb\/small\/th(.*)\./i,
  499. /th\.wallhaven\.cc\/(small|lg)\/(.*)?\/(.*)\..*/i],
  500. s: [["wallpapers/full/wallhaven$1.jpg","wallpapers/full/wallhaven$1.png"],
  501. ["w.wallhaven.cc/full/$2/wallhaven-$3.jpg","w.wallhaven.cc/full/$2/wallhaven-$3.png"]]
  502. },
  503. {
  504. name: "lofter",
  505. url: /lofter\./,
  506. getImage: function(a) {
  507. if(a && a.href && a.hasAttribute("bigimgsrc")){
  508. return a.getAttribute("bigimgsrc");
  509. }
  510. return this.src.replace(/\?.*/i,"");
  511. }
  512. },
  513. {
  514. name: "sohu",
  515. url: /(sohu|sohucs)\.com/,
  516. r: /(sohucs\.com\/).*\/(images\/|os\/)/i,
  517. s: "$1$2"
  518. },
  519. {
  520. name: "moegirl",
  521. url: /(moegirl|mengniang)\.org/,
  522. r: /(common)\/thumb(.*)\/[^\/]+/i,
  523. s: "$1$2"
  524. },
  525. {
  526. name: "fanfou",
  527. url: /fanfou\.com/,
  528. r: /@.+/i,
  529. s: ""
  530. },
  531. {
  532. name: "meitudata",
  533. url: /meipai\.com/,
  534. r: /!thumb.+/i,
  535. s: ""
  536. },
  537. {
  538. name: "mafengwo",
  539. url: /mafengwo\.cn/,
  540. r: /\?imageMogr.*/i,
  541. s: ""
  542. },
  543. {
  544. name: "discordapp",
  545. url: /(discordapp\.|discord\.)(com|net)/,
  546. r: /\?width=\d+&height=\d+$/i,
  547. s: ""
  548. },
  549. {
  550. name: "推特",
  551. url: /twitter\.com/,
  552. getImage: function(){
  553. let newsrc=this.src.replace("_normal.",".").replace("_200x200.",".");
  554. if(newsrc!=this.src)return newsrc;
  555. newsrc=newsrc.replace(/\?format=/i, ".").replace(/\&name=/i, ":").replace(/\.(?=[^.]*$)/, "?format=").replace( /(:large|:medium|:small|:orig|:thumb|:[\dx]+)/i, "");
  556. if(newsrc!=this.src)return newsrc+"&name=orig";
  557. },
  558. ext: function(target) {
  559. if(target.parentNode && target.parentNode.previousElementSibling){
  560. let imgs=target.parentNode.previousElementSibling.querySelectorAll("img");
  561. if(imgs.length==1)return imgs[0];
  562. }
  563. return null;
  564. }
  565. },
  566. {
  567. name: "Fandom",
  568. url: /fandom\.com/,
  569. r: [/scale\-to\-width\-down\/\d+/i,
  570. /smart\/width\/\d+\/height\/\d+/i],
  571. s: ["",""]
  572. },
  573. {
  574. name: "yande",
  575. url: /yande\.re|konachan\.(net|com)/,
  576. getImage: function(a, p) {
  577. if(p[1] && p[1].nextSibling && p[1].nextSibling.classList &&
  578. p[1].nextSibling.classList.contains("largeimg")){
  579. return p[1].nextSibling.href.replace(/\/(preview|jpeg|sample)\/(.*\.)jpg$/, "/image/$2png");
  580. }
  581. return this.src.replace(/\/(preview|jpeg|sample)\/(.*\.)jpg$/, "/image/$2png");
  582. }
  583. },
  584. {
  585. name:"绅士漫画",
  586. url:/^https?:\/\/wnacg\./,
  587. src: /\/\/t(\w\.qy.*data\/)t\//,
  588. r: /\/\/t(\w\.qy.*data\/)t\//,
  589. s: "//img$1",
  590. getImage: function(a, p) {
  591. if (p && p[1] && p[1].className === 'pic_box tb' && a && a.href) {
  592. return a.href;
  593. }
  594. },
  595. xhr: {
  596. q: ['#picarea']
  597. }
  598. },
  599. {
  600. name:"xlysauc",
  601. url:/^https?:\/\/xlysauc\.com\//,
  602. r: /\/x\/(\d+\.jpg)/,
  603. s: "/d/$1",
  604. ext: function(target) {
  605. if (target.parentNode.className === 'imgbg' || target.className === 'pp_hoverContainer'){
  606. let img = target.parentNode.querySelector("img");
  607. if (img) return img;
  608. }
  609. return null;
  610. }
  611. },
  612. {
  613. name: "E621",
  614. url: /e621\.net/,
  615. getImage: function(a, p) {
  616. if(p[2] && p[2].dataset.fileUrl){
  617. return p[2].dataset.fileUrl;
  618. }
  619. return this.src;
  620. }
  621. },
  622. {
  623. name: "Pinterest",
  624. url: /pinterest\.com/,
  625. getImage: function(a, p) {
  626. if(this.srcset){
  627. var srcs=this.srcset.split(","),minSize=0,newSrc;
  628. srcs.forEach(srci=>{
  629. let srcInfo=srci.trim().split(" "),curSize=parseInt(srcInfo[1]);
  630. if(srcInfo[1] && (curSize>minSize || minSize==0)){
  631. minSize=curSize;
  632. newSrc=srcInfo[0];
  633. }
  634. });
  635. if(newSrc)return newSrc;
  636. }
  637. return this.src.replace(/\/\d+x\//i, "/736x/");
  638. }
  639. },
  640. {
  641. name: "Zhisheji",
  642. url: /zhisheji\.com/,
  643. r: /thumbnail\/.*/i,
  644. s: ""
  645. },
  646. {
  647. name: "Reddit",
  648. url: /reddit\.com|redd\.it/,
  649. r: /\/\/preview\.redd.it\/([^\?]+)?.*/i,
  650. s: "https://i.redd.it/$1"
  651. },
  652. {
  653. name: "Rule34hentai",
  654. url: /rule34hentai\.net/,
  655. r: "/_thumbs/",
  656. s: "/_images/"
  657. },
  658. {
  659. name: "Rule34",
  660. url: /rule34\.xxx/,
  661. src: /\/(thumbnails|samples)\/(.*)\/(thumbnail|sample)_/i,
  662. r: /\/(thumbnails|samples)\/(.*)\/(thumbnail|sample)_(.*)\..*/i,
  663. s: ["/images/$2/$4.jpeg","/images/$2/$4.png","/images/$2/$4.jpg"]
  664. },
  665. {
  666. name: "Photosight",
  667. url: /photosight\.ru/,
  668. r: /(cdny\.de.*\/)t\//i,
  669. s: "$1x/"
  670. },
  671. {
  672. name: "Xiaohongshu",
  673. url: /xiaohongshu\.com/,
  674. ext: function(target) {
  675. if (target.className == 'change-pic') {
  676. var imgs=target.previousElementSibling.querySelectorAll('li'),i=0;
  677. for(i=0;i<imgs.length;i++){
  678. if(imgs[i].style.display!="none")
  679. return imgs[i].childNodes[0];
  680. }
  681. }
  682. return target;
  683. },
  684. r: /\/w\/\d+\/(h\/\d+\/)?(q\/\d+\/)?/i,
  685. s: "/w/1080/"
  686. },
  687. {
  688. name: "Youtube",
  689. url: /youtube\.com/,
  690. ext: function(target) {
  691. if(target.tagName=="ytd-thumbnail"){
  692. return target.querySelector("img");
  693. }
  694. },
  695. getExtSrc: function() {
  696. let newsrc = "";
  697. if(this.id=="thumbnail-container"){
  698. newsrc=this.querySelector('img').src;
  699. }else if(this.parentNode && this.parentNode.className=="ytp-inline-preview-ui"){
  700. newsrc = this.parentNode.parentNode.querySelector(".ytp-cued-thumbnail-overlay-image").style.backgroundImage.replace(/url\("(.*)"\)/,"$1");
  701. }
  702. return newsrc.replace(/\?.*$/i,"");
  703. },
  704. getImage: function(a, p) {
  705. var newsrc=this.src;
  706. if(p[2] && this.classList.contains('ytd-moving-thumbnail-renderer')){
  707. newsrc = p[2].querySelector("img").src;
  708. }
  709. return newsrc.replace(/\?.*$/i,"");
  710. }
  711. },
  712. {
  713. name: "588ku",
  714. url: /588ku\.com/,
  715. r: /!\/fw.*/,
  716. s: ""
  717. },
  718. {
  719. name: "ibaotu",
  720. url: /ibaotu\.com/,
  721. ext: 'previous',
  722. r: "!fwc238",
  723. s: "!ww7002"
  724. },
  725. {
  726. name: "58pic",
  727. url: /58pic\.com/,
  728. ext: function(target){
  729. if(target.className=="no-login" && target.style.opacity==""){
  730. target.style.opacity=0.99;
  731. setTimeout(()=>{target.style.display="none";},1000);
  732. }
  733. return null;
  734. },
  735. r: /!.*/i,
  736. s: "!w1024"
  737. },
  738. {
  739. name: "gelbooru",
  740. url: /gelbooru\.com/,
  741. src: /(thumbnails|samples)\/(.*)\/(thumbnail|sample)_/i,
  742. r: /.*\/(thumbnails|samples)\/(.*)\/(thumbnail|sample)_(.*)\..*/i,
  743. s: ["https://img3.gelbooru.com/images/$2/$4.png","https://img3.gelbooru.com/images/$2/$4.jpg"]
  744. },
  745. {
  746. name: "donmai",
  747. url: /donmai\.us/,
  748. src: /(thumbnails|sample)\/(.*)\/(thumbnail|sample)_|\/\d+x\d+\//i,
  749. r: [/\/(thumbnails|sample)\/(.*)\/(thumbnail|sample)_(.*)/i,
  750. /\/\d+x\d+\//i
  751. ],
  752. s: ["/original/$2/$4","/original/"]
  753. },
  754. {
  755. name: "erosberry",
  756. url: /erosberry\.com/,
  757. r: /(\/\d+\/)tn_(\d+\.[^\/]+)$/i,
  758. s: "$1$2"
  759. },
  760. {
  761. name: "javdb",
  762. url: /javdb/,
  763. r: "/thumbs/",
  764. s: "/covers/"
  765. },
  766. {
  767. name: "javbus",
  768. url: /javbus\.|busjav\./,
  769. r: /\/thumbs?(\/\w+)\.jpg$/i,
  770. s: "/cover$1_b.jpg"
  771. },
  772. {
  773. name: "avmoo",
  774. url: /avmoo\./,
  775. r: "ps.jpg",
  776. s: "pl.jpg"
  777. },
  778. {
  779. name: "asiansister",
  780. url: /asiansister\.com/,
  781. r: "_t.",
  782. s: "."
  783. },
  784. {
  785. name: "jianshu",
  786. url: /jianshu\.com/,
  787. r: /(upload-images\.jianshu\.io\/.*)\?.*/i,
  788. s: "$1"
  789. },
  790. {
  791. name: "artstation",
  792. ext: 'next',
  793. url: /artstation\.com/,
  794. r: /\/(\d{14}\/)?smaller_square\//i,
  795. s: "/large/",
  796. getImage: function(a, p) {
  797. if (p && p[0] && p[0].className === 'project-image') return a.href.replace('/artwork/', '/projects/') + '.json';
  798. },
  799. xhr: {
  800. q: function(html) {
  801. let datas = JSON.parse(html);
  802. let urls = [];
  803. datas.assets.forEach(d => {
  804. urls.push(d.image_url)
  805. });
  806. return urls;
  807. }
  808. }
  809. },
  810. {
  811. name: "flickr",
  812. url: /flickr\.com/,
  813. ext: function(target){
  814. if(target.nodeName=="A" && target.className=="overlay" && target.parentNode && target.parentNode.parentNode && target.parentNode.parentNode.parentNode){
  815. return target.parentNode.parentNode.parentNode;
  816. }else if(target.nodeName=="DIV" && target.classList.contains("photo-notes-scrappy-view")){
  817. return target.previousElementSibling.querySelector(".main-photo");
  818. }else if(target.classList.contains("context-thumb")){
  819. return target;
  820. }
  821. return null;
  822. },
  823. r: /_\w\./i,
  824. s: "_c."
  825. },
  826. {
  827. name: "wikiart",
  828. url: /wikiart\.org/,
  829. r: /!.*/i,
  830. s: ''
  831. },
  832. {
  833. name: "discuz",
  834. r: [/(.+\/attachments?\/.+)\.thumb\.\w{2,5}$/i,
  835. /((wp-content|moecdn\.org)\/uploads\/.*)\-\d+x\d+(-c)?/i,
  836. /.*(?:url|src)=(https?:\/\/.*\.(?:jpg|jpeg|png|gif|bmp)).*/i,
  837. /.*thumb\.php\?src=([^&]*).*/i],
  838. s: '$1'
  839. },
  840. {
  841. name: "weibo",
  842. r: /(\.sinaimg\.(cn|com)\/)(?:bmiddle|orj360|mw\d+)/i,
  843. s: '$1large'
  844. },
  845. {
  846. name: "weibo2",
  847. r: /(\.sinaimg\.(cn|com)\/)(?:square|thumbnail)/i,
  848. s: '$1mw1024'
  849. },
  850. {
  851. name: "sina head",
  852. r: /(\.sinaimg\.(cn|com)\/\d+)\/50\//i,
  853. s: '$1/180/'
  854. },
  855. {
  856. name: "新浪相册",
  857. src: /\.sinaimg\.(cn|com)\/thumb\d+\/\w+/i,
  858. r: /thumb\d+/,
  859. s: 'mw690'
  860. },
  861. {
  862. name: "sina sports",
  863. src: /k\.sinaimg\.cn\/n\//i,
  864. r: /k\.sinaimg\.cn\/n\/(.*)\/(w\d+)?h\d+[^\/]+$/,
  865. s: 'n.sinaimg.cn/$1'
  866. },
  867. {
  868. name: "gravatar",
  869. src: /gravatar\.com\/avatar\/|\/gravatar\//i,
  870. r: /(avatar\/.*[\?&]s=).*/,
  871. s: '$11920'
  872. },
  873. {
  874. name: "ucServerAvatar",
  875. src: /uc_server\/avatar\.php/i,
  876. r: /(uc_server\/avatar\.php\?uid=\d+&size=).*/,
  877. s: '$1big'
  878. },
  879. {
  880. name: "md",
  881. src: /\.md\./i,
  882. r: /\.md(\.[^\.]+)$/i,
  883. s: '$1'
  884. },
  885. {
  886. name: "ytimg",
  887. src: /\.ytimg\.com/i,
  888. exclude: /mqdefault_6s/i,
  889. r: /\?.*$/i,
  890. s: ''
  891. },
  892. {
  893. name: "meituan",
  894. url: /\.meituan\.net/i,
  895. r: /\/avatar\/\w{2}/i,
  896. s: '/avatar/o0'
  897. },
  898. {
  899. name: "hdslb",
  900. src: /hdslb\.com\//i,
  901. r: /@.*/i,
  902. s: ''
  903. },
  904. {
  905. name: "coolapk",
  906. url: /\.coolapk\.com\//i,
  907. r: /\.s\.\w+$/i,
  908. s: ''
  909. },
  910. {
  911. name: "aicdn",
  912. src: /\.aicdn\.com\//i,
  913. r: /_fw\d+$/i,
  914. s: ''
  915. },
  916. {
  917. name: "duitang",
  918. src: /duitang\.com\//i,
  919. r: /.thumb.(\d+_)?\d*\./i,
  920. s: '.'
  921. },
  922. {
  923. name: "imgur",
  924. src: /imgur\.com\//i,
  925. r: [/h(\.[^\/]+)$/i,/maxwidth=\d+/i],
  926. s: ["$1","maxwidth=99999"]
  927. },
  928. {
  929. name: "dmm",
  930. src: /pics\.dmm\.co\.jp/i,
  931. r: "ps.jpg",
  932. s: "pl.jpg"
  933. },
  934. {
  935. name: "whd",
  936. src: /\/w\/\d+\/h\/\d+($|\/|\?)/i,
  937. r: /\/w\/\d+\/h\/\d+/i,
  938. s: ""
  939. },
  940. {
  941. name: "百度图片、贴吧等",
  942. src: /(hiphotos|imgsrc)\.baidu\.com/i,
  943. r: /(hiphotos|imgsrc)\.baidu\.com\/(.+?)\/.+?([0-9a-f]{40})/i,
  944. s: "$1.baidu.com/$2/pic/item/$3"
  945. },
  946. {
  947. name: "GoogleContent",
  948. src: /\/w\/\d+\/h\/\d+($|\/|\?)/i,
  949. getImage:function(){
  950. var $ = /^((?:(?:lh|gp|yt)\d+\.g(?:oogleuserconten|gph)|\d\.bp\.blogspo)t\.com\/)(?:([_-](?:[\w\-]{11}\/){4})[^\/]+(\/[^?#]+)?|([^=]+)).*/i.exec(this.src);
  951. var newsrc= $ ? ('http://' + $[1] + ($[4] ? $[4] + '=' : $[2]) + 's2634' + ($[3] || '')) : '';
  952. if(newsrc!=this.src)return newsrc;
  953. }
  954. },
  955. {
  956. name: "pixiv",
  957. src: /pixiv\.net/i,
  958. r: /(pixiv.net\/img\d+\/img\/.+\/\d+)_[ms]\.(\w{2,5})$/i,
  959. s: "$1.$2"
  960. },
  961. {
  962. name: "douban",
  963. url: /douban\.com/i,
  964. getImage:function(){
  965. var $ = /(img\d+\.douban\.com\/)(?:(view\/)(?:photo|movie_poster_cover)\/(?!large)[^\/]+|(icon\/u(?=\d))|[sm](?=pic\/))(.*)/i.exec(this.src);
  966. var newsrc= $ ? ('http://' + $[1] + ($[2] ? $[2] + 'photo/photo' : (($[3]||'') + 'l')) + $[4]) : '';
  967. if(newsrc!=this.src)return newsrc;
  968. }
  969. },
  970. {
  971. name: "taobaocdn",
  972. src: /(taobaocdn|alicdn)\.com/i,
  973. r: [/.*((?:img\d\d\.taobaocdn|img(?:[^.]*\.?){1,2}?\.alicdn)\.com\/)(?:img\/|tps\/http:\/\/img\d\d+\.taobaocdn\.com\/)?((?:imgextra|bao\/uploaded)\/.+\.(?:jpe?g|png|gif|bmp))_.+\.jpg$/i,
  974. /(.*\.alicdn\.com\/.*?)((.jpg|.png)(\.|_)\d+x\d+.*)\.jpg(_\.webp)?$/i,
  975. /(.*\.alicdn\.com\/.*?)((\.|_)\d+x\d+.*|\.search|\.summ)\.jpg(_\.webp)?$/i],
  976. s: ["http://$1$2",
  977. "$1$3",
  978. "$1.jpg"]
  979. },
  980. {
  981. name: "yihaodianimg",
  982. url: /yhd\.com/i,
  983. src: /yihaodianimg\.com/i,
  984. r: /(.*\.yihaodianimg\.com\/.*)_\d+x\d+\.jpg$/i,
  985. s: "$1.jpg"
  986. },
  987. {
  988. name: "jd",
  989. url: /jd\.com/i,
  990. src: /360buyimg\.com/i,
  991. r: [/(.*360buyimg\.com\/)n\d\/.+?\_(.*)/i,
  992. /(.*360buyimg\.com\/)n\d\/(.*)/i,
  993. /(.*360buyimg\.com\/.*)s\d+x\d+_(.*)/i],
  994. s: ["$1imgzone/$2","$1n0/$2","$1$2"]
  995. },
  996. {
  997. name: "dangdang",
  998. url: /dangdang\.com/i,
  999. src: /ddimg\.cn/i,
  1000. r: /(.*ddimg.cn\/.*?)_[bw]_(\d+\.jpg$)/i,
  1001. s: "$1_e_$2"
  1002. },
  1003. {
  1004. name: "duokan",
  1005. url: /duokan\.com/i,
  1006. r: /(cover.read.duokan.com.*?\.jpg)!\w+$/i,
  1007. s: "$1"
  1008. },
  1009. {
  1010. name: "yyets",
  1011. url: /yyets\.com/i,
  1012. r: /^(res\.yyets\.com.*?\/ftp\/(?:attachment\/)?\d+\/\d+)\/[ms]_(.*)/i,
  1013. s: "http://$1/$2"
  1014. },
  1015. {
  1016. name: "mozilla",
  1017. url: /addons\.mozilla\.org/i,
  1018. r: "addons.cdn.mozilla.net/user-media/previews/thumbs/",
  1019. s: "/thumbs/full/"
  1020. },
  1021. {
  1022. name: "firefox",
  1023. url: /firefox\.net\.cn/i,
  1024. r: "www.firefox.net.cn/attachment/thumb/",
  1025. s: "www.firefox.net.cn/attachment/"
  1026. },
  1027. {
  1028. name: "crsky",
  1029. url: /\.crsky\.com/i,
  1030. r: /pic\.crsky\.com.*_s\.gif$/i,
  1031. s: "/_s././",
  1032. example: "http://www.crsky.com/soft/5357.html"
  1033. },
  1034. {
  1035. name: "zol",
  1036. url: /\.zol\.com/i,
  1037. r: /(\w+\.zol-img\.com\.cn\/product\/\d+)_\d+x\d+\/(.*\.jpg)/i,
  1038. s: "$1/$2",
  1039. example: "http://detail.zol.com.cn/240/239857/pic.shtml"
  1040. },
  1041. {
  1042. name: "yesky",
  1043. url: /\.yesky\.com/i,
  1044. r: /_\d+x\d+\.([a-z]+)$/i,
  1045. s: ".$1",
  1046. example: "http://game.yesky.com/tupian/165/37968665.shtml"
  1047. },
  1048. {
  1049. name:"巴哈姆特",
  1050. url:/^https:\/\/\w+\.gamer\.com\.tw/,
  1051. src: /bahamut\.com\.tw/,
  1052. r: "/S/",
  1053. s: "/B/"
  1054. },
  1055. {
  1056. name: "sgamer",
  1057. url: /\.sgamer\.com/i,
  1058. r: /\/s([^\.\/]+\.[a-z]+$)/i,
  1059. s: "/$1",
  1060. example: "http://dota2.sgamer.com/albums/201407/8263_330866.html"
  1061. },
  1062. {
  1063. name: "nhentai",
  1064. url: /nhentai\.net/i,
  1065. r: /\/\/\w+(\..*\/)(\d+)t(\.[a-z]+)$/i,
  1066. s: "//i$1$2$3",
  1067. example: "http://nhentai.net/g/113475/"
  1068. },
  1069. {
  1070. name: "GithubAvatars",
  1071. url: /github\.com/i,
  1072. r: /(avatars\d*\.githubusercontent\.com.*)\?.*$/i,
  1073. s: "$1",
  1074. example: "https://avatars2.githubusercontent.com/u/3233275/"
  1075. },
  1076. {
  1077. name: "ggpht",
  1078. src: /ggpht\.com/i,
  1079. r: /=s\d+.*/i,
  1080. s: "=s9999"
  1081. },
  1082. {
  1083. name: "kodansha",
  1084. url: /kodansha\.co\.jp/i,
  1085. src: /kodansha\.co\.jp/i,
  1086. r: 't_og_image_center',
  1087. s: 'c_limit'
  1088. },
  1089. {
  1090. name: "fanseven",
  1091. url: /fanseven\.com/i,
  1092. src: /fanseven\.com/i,
  1093. r: /w=\d+&h=\d+/i,
  1094. s: 'w=9999&h=9999'
  1095. },
  1096. {
  1097. name: "appstore",
  1098. url: /^https:\/\/apps\.apple\.com\//i,
  1099. getImage:function(){
  1100. if(this.parentNode.nodeName=="PICTURE"){
  1101. let source=this.parentNode.querySelector("source:last-of-type");
  1102. let maxSize=0;
  1103. let result="";
  1104. source.srcset.split(", ").forEach(srcset=>{
  1105. let srcArr=srcset.split(" ");
  1106. let curSize=parseInt(srcArr[1]);
  1107. if(curSize>maxSize){
  1108. maxSize=curSize;
  1109. result=srcArr[0];
  1110. }
  1111. });
  1112. return result;
  1113. }
  1114. return null;
  1115. }
  1116. },
  1117. {
  1118. name:"coomer.party & kemono.party",
  1119. url:/^https:\/\/(coomer|kemono)\.party\/.*\/post\//,
  1120. getImage:function(a){
  1121. if(a) return a.href;
  1122. }
  1123. },
  1124. {
  1125. name:"instagram",
  1126. url:/^https?:\/\/[^.]+\.instagram.com/i,
  1127. ext: function(target) {
  1128. if(target && target.previousElementSibling){
  1129. let imgs=target.previousElementSibling.querySelectorAll("img");
  1130. if(imgs && imgs.length==1)return imgs[0];
  1131. }
  1132. }
  1133. },
  1134. {
  1135. name: "hentai-cosplays",
  1136. url: /^https:\/\/(.*\.)?(hentai\-cosplays|porn\-images\-xxx)\.com/,
  1137. r: /\/p=[\dx]+(\/\d+\.\w+)$/i,
  1138. s: '$1'
  1139. },
  1140. {
  1141. name:"beta.kemono.party",
  1142. url:/^https:\/\/(\w+\.)?kemono\.party\/.*\/post\//,
  1143. getImage:function(a){
  1144. if(a) return a.href;
  1145. }
  1146. },
  1147. {
  1148. name:"imdb",
  1149. url:/^https?:\/\/www\.imdb\.com/,
  1150. src: /media\-amazon/,
  1151. r: /@.*(\.\w)/i,
  1152. s: '@$1'
  1153. },
  1154. {
  1155. name:"nsfw.xxx",
  1156. url:/^https?:\/\/nsfw\.xxx/,
  1157. src: /thumbnails/,
  1158. getImage: function(a,p) {
  1159. if (a && a.className==='slider_init_href' && a.href && !this.nextElementSibling) {
  1160. return a.href;
  1161. }
  1162. },
  1163. xhr: {
  1164. q: '.sh-section__image>img',
  1165. }
  1166. },
  1167. {
  1168. name: "雪球",
  1169. url: /^https?:\/\/xueqiu\.com\//,
  1170. src: /^https?:\/\/xqimg\.imedao\.com\//i,
  1171. r: /!\d+(x\d+[a-z]?)?\.\w+$/,
  1172. s: ''
  1173. }
  1174. ];