您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
enter something useful
// ==UserScript== // @name hacg script // @namespace http://your.homepage/ // @version 0.2.1 // @description enter something useful // @author You // @require https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.8/clipboard.min.js // @include *://*.hacg.*/* // @include *://hacg.*/* // ==/UserScript== /* jshint esnext: true */ // Your code here... (function () { // body... var $ = jQuery; var tool = $('<div class="cbj-hacg-tool"></div>'); $('body').append(tool); tool.css({ backgroundImage: "url('/favicon.ico')", backgroundSize: '100% 100%', cursor: 'pointer', position: 'fixed', right: '20px', bottom: '20px', width: '20px', height: '20px', backgroundColor: 'white' }); var content = $('article').html() + $('#comments .commentList').html(); content = content.replace('本站不提供下载', ''); var clipboard; tool.click(function () { var links = match(content, /[A-Za-z0-9]{40}/g).map(m => `magnet:?xt=urn:btih:${m}`); var specialLinks = match(content, /[A-Z2-9]{32}/g).map(m => `magnet:?xt=urn:btih:${decodeBase32(m)}`); var baiduReg = /(\/s\/\w+) (\w+)/g; var result, baiduLinks = []; while ((result = baiduReg.exec(content)) !== null) { result = baiduReg.exec(content); baiduLinks.push(`<a href="http://pan.baidu.com${result[1]}">${result[1]}</a> ${result[2]}`); } if ($('.cbj-abstract').length === 0) { buildAbstract(links.concat(baiduLinks), specialLinks); } else { clipboard.destroy(); $('.cbj-abstract').remove(); } }); function match(content, reg) { var result = content.match(reg); return result || []; } function buildAbstract(links, specialLinks) { links = [...new Set(links)]; var icon = 'https://cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/svgs/fi-page-copy.svg'; var list = links.map((m, i) => `<li><span>${m}</span><button class="copy"><img src="${icon}" alt="Copy to clipboard"></button></li>`).join(''); var specialList = specialLinks.map((m, i) => `<li><span style='color: red'>${m}</span><button class="copy"><img src="${icon}" alt="Copy to clipboard"></button></li>`).join(''); var div = $(`<div class="cbj-abstract"><ul>${list}${specialList}</ul></div>`); $('.entry-content').prepend(div); var buttonStyle = { position: 'relative', display: 'inline-block', margin: '4px 8px', height: '22px', padding: '0', fontSize: '13px', fontWeight: 'bold', lineHeight: '20px', color: '#333', whiteSpace: 'nowrap', verticalAlign: 'middle', cursor: 'pointer', backgroundColor: '#eee', backgroundImage: 'linear-gradient(#fcfcfc, #eee)', border: '1px solid #d5d5d5', borderRadius: '3px' }; $('button.copy').css(buttonStyle); $('button.copy img').css({ width: '20px', height: '20px' }); div.find('li').css('background-color', 'rgb(50,50,50)'); clipboard = new Clipboard('button.copy', { target: button => button.previousSibling }); } function decodeBase32(text) { var base32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".split(""); var result = ""; for (var i = 0; i < text.length; i++) { var t = base32.indexOf(text[i]); var e1, e2, e3, e4, e5; var temp; switch (i % 4) { case 0: e1 = t >> 1; temp = (t & 0b1) << 3; break; case 1: e2 = temp | t >> 2; temp = (t & 0b11) << 2; break; case 2: e3 = temp | t >> 3; temp = (t & 0b111) << 1; break; case 3: e4 = temp | t >> 4; e5 = t & 0b1111; result = result + [e1, e2, e3, e4, e5].map(x => x.toString(16)).join(""); break; } } return result; } })();