Last active
May 30, 2020 11:03
-
-
Save 2niuhe/e7370e27e304e9a3afaaad0c013e5713 to your computer and use it in GitHub Desktop.
油猴脚本合集
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name CL社区收藏夹 | |
// @namespace http://tampermonkey.net/ | |
// @version 1.42 | |
// @description 为社区帖子添加一个本地收藏夹,支持导入导出功能。支持图片批量下载。该插件在手机端几乎可以用网页替代社区客户端。支持手机和电脑浏览器Tampermonkey、暴力猴。 | |
// @author niuhe | |
// @include http://*/htm_data/* | |
// @match https://*/htm_data/* | |
// @match http://*/htm_mob/* | |
// @match https://*/htm_mob/* | |
// @match http://*/profile.php?action=favor | |
// @match https://*/profile.php?action=favor | |
// @grant GM_getValue | |
// @grant GM_setValue | |
// @grant GM_listValues | |
// @grant GM_setClipboard | |
// @grant GM_download | |
// @grant GM_deleteValue | |
// @grant GM_info | |
// @license MIT | |
// ==/UserScript== | |
//为了和手机格式统一,url一律以http://**/htm_mob/格式保存 | |
const DAT_EVENT_IMPORT = "dat_import"; | |
const DAT_EVENT_RECORD = "dat_record"; | |
const DAT_EVENT_STATUS = "dat_status"; | |
const SEP_TAG = "<:separator;>" | |
var url_base = "http://**/htm_mob/" | |
var url = document.URL | |
var url_array = document.URL.split("/") | |
//CSS选择器 | |
var biaoti_selector = "" | |
var bankuai_selector = "" | |
var image_selector = "" | |
var tag_loc = "" | |
//UA是否是手机端 | |
var mobile = IsMob() | |
//用几个标识符来判断页面是收藏页/主题帖(手机)/主题帖(PC) | |
var is_collection_page = (document.URL.split("/").pop() == "profile.php?action=favor") | |
var is_htm_mob = (url_array[3] == "htm_mob") | |
var is_htm_data = (url_array[3] == "htm_data") | |
url_array[2] = "**" | |
url_array[3] = "htm_mob" | |
url = url_array.join("/") | |
var time1 = TimeFormat(); | |
var biaoti = "" | |
var bankuai = "" | |
//获取主题帖标题和板块信息 | |
if (is_collection_page == false) | |
{ | |
console.log("I am getting bankuai info") | |
if (is_htm_mob) | |
{ | |
biaoti_selector = "#main > div.f18" | |
bankuai_selector = "#header > table > tbody > tr > td > h3" | |
tag_loc = "h guide" | |
} | |
if (is_htm_data) | |
{ | |
biaoti_selector = "#main > div:nth-child(4) > table > tbody > tr.tr1.do_not_catch > th:nth-child(2) > table > tbody > tr > td > h4" | |
bankuai_selector = "#main > div:nth-child(1) > table > tbody > tr:nth-child(1) > td > b > a:nth-child(2)" | |
tag_loc = 'tiptop' | |
} | |
biaoti = document.querySelector(biaoti_selector).textContent | |
bankuai = document.querySelector(bankuai_selector).textContent | |
console.log("biaoti" + biaoti) | |
} | |
var key = url_array.slice(4,7).join("/") | |
var content = biaoti + " " + bankuai + SEP_TAG + url + SEP_TAG + time1 | |
//console.log(content) | |
document.addEventListener(DAT_EVENT_IMPORT, function (e) { | |
//Custom event after CSV import | |
alert("导入成功,刷新页面查看") | |
}); | |
document.addEventListener(DAT_EVENT_STATUS, function (e) { | |
// Custom event on set status | |
alert("导入成功,已和本地收藏合并"); | |
}); | |
//默认设置cookie的path是根目录 | |
function setCookie ( name, value, expdays, path="/" ) | |
{ | |
var expdate = new Date(); | |
//设置Cookie过期日期 | |
expdate.setDate(expdate.getDate() + expdays) ; | |
//添加Cookie | |
document.cookie = name + "=" + escape(value) + ";expires=" + expdate.toUTCString() + ";path=" + path; | |
console.log("set cookie success") | |
} | |
function getCookieValue(name) { | |
let result = document.cookie.match("(^|[^;]+)\\s*" + name + "\\s*=\\s*([^;]+)") | |
return result ? result.pop() : "" | |
} | |
//清除所有cookie函数 | |
function clearAllCookie() { | |
var keys = document.cookie.match(/[^ =;]+(?=\=)/g); | |
if (keys) { | |
for (var i = keys.length; i--;) | |
document.cookie = keys[i] + '=0;expires=' + new Date(0).toUTCString() | |
} | |
} | |
function IsMob() { | |
var userAgentInfo = navigator.userAgent; | |
var Agents = ["Android", "iPhone", | |
"SymbianOS", "Windows Phone", | |
"iPad", "iPod"]; | |
var flag = false; | |
for (var v = 0; v < Agents.length; v++) { | |
if (userAgentInfo.indexOf(Agents[v]) > 0) { | |
flag = true; | |
break; | |
} | |
} | |
return flag; | |
} | |
//手机和PC自适应,并重定向页面 | |
function Set_Cookie() | |
{ | |
if (mobile) | |
{ | |
let is_mob= getCookieValue("ismob") | |
if (is_mob != "1") | |
{ | |
setCookie("ismob","1",360) | |
console.log(" Mob cookie changed") | |
} | |
else | |
{ | |
console.log(" Mob cookie not changed") | |
} | |
} | |
else | |
{ | |
let is_mob= getCookieValue("ismob") | |
if (is_mob == "1") | |
{ | |
setCookie("ismob","0",360) | |
console.log(" PC cookie changed,Redirect Page") | |
} | |
else | |
{ | |
console.log(" PC cookie not changed") | |
} | |
} | |
} | |
function sleep(ms) { | |
return new Promise(resolve => setTimeout(resolve, ms)); | |
} | |
function TimeFormat() { | |
var fmt = "yyyy-MM-dd hh:mm:ss" | |
var myDate = new Date(); | |
var o = { | |
"M+": myDate.getMonth() + 1, //月份 | |
"d+": myDate.getDate(), //日 | |
"h+": myDate.getHours(), //小时 | |
"m+": myDate.getMinutes(), //分 | |
"s+": myDate.getSeconds(), //秒 | |
"q+": Math.floor((myDate.getMonth() + 3) / 3), //季度 | |
"S": myDate.getMilliseconds() //毫秒 | |
}; | |
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (myDate.getFullYear() + "").substr(4 - RegExp.$1.length)); | |
for (var k in o) | |
{ | |
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); | |
} | |
return fmt; | |
} | |
function Collecte(){ | |
if (mobile == true) | |
{ | |
var tmp = document.createElement("text") | |
tmp.textContent = "|" | |
document.getElementsByClassName(tag_loc)[0].appendChild(tmp) | |
} | |
var a = document.createElement('a'); | |
//a.href = 'data:application/dat;charset=utf-8,' + encodeURIComponent(data); | |
//supported by chrome 14+ and firefox 20+ | |
//a.download = 'favorite.dat'; | |
if ("none" == GM_getValue(key,"none")) | |
{ | |
a.text = " 收藏 " | |
a.style = "color:#2F5FA1;" | |
} | |
else | |
{ | |
a.text = " 已收藏 " | |
a.style = "color:#FF0000;" | |
} | |
document.getElementsByClassName(tag_loc)[0].appendChild(a); | |
a.addEventListener("click", function (value) { | |
if (a.text == " 收藏 ") | |
{ | |
GM_setValue(key,content); | |
a.text = " 已收藏 " | |
a.style = "color:#FF0000;" | |
} | |
else | |
{ | |
GM_deleteValue(key); | |
a.text = " 收藏 " | |
a.style = "color:#2F5FA1;" | |
} | |
//alert("添加收藏成功\n\n" + content) | |
}); | |
} | |
function Export_Collection(data){ | |
if (mobile == true) | |
{ | |
var tmp = document.createElement("text") | |
tmp.textContent = "|" | |
document.getElementsByClassName(tag_loc)[0].appendChild(tmp) | |
} | |
var keys = GM_listValues() | |
var a = document.createElement('a'); | |
//supported by chrome 14+ and firefox 20+ | |
a.download = 'favorite.dat'; | |
a.text = " 導出 " | |
//needed for firefox | |
document.getElementsByClassName(tag_loc)[0].appendChild(a); | |
a.addEventListener("click", function (value) { | |
var keys = GM_listValues() | |
var data = [] | |
for(var i = 0, len = keys.length; i < len; i++){ | |
data.push(GM_getValue(keys[i])) | |
} | |
data = data.join("\n") | |
a.href = 'data:application/dat;charset=utf-8,' + encodeURIComponent(data); | |
alert("导出成功") | |
}); | |
} | |
function Gen_Input() | |
{ | |
let input = document.createElement("input"); | |
input.type = "file"; | |
input.accept=".dat" | |
Object.assign(input.style, { | |
position: "relative" | |
}); | |
input.addEventListener("input", function (value) { | |
let reader = new FileReader(); | |
reader.readAsText(value.target.files[0]); | |
reader.onload = function () { | |
var dat_array = reader.result.split("\n") | |
for (var k = 0 ,len2 = dat_array.length; k < len2;k++) | |
{ | |
GM_setValue(Gen_Key(dat_array[k]),dat_array[k]) | |
} | |
document.dispatchEvent(new Event(DAT_EVENT_IMPORT)) | |
}; | |
}); | |
return input | |
} | |
function Import_Collection(){ | |
if (mobile == true) | |
{ | |
var tmp = document.createElement("text") | |
tmp.textContent = "|" | |
document.getElementsByClassName(tag_loc)[0].appendChild(tmp) | |
} | |
var a = document.createElement('a'); | |
//supported by chrome 14+ and firefox 20+ | |
a.download = 'favorite.dat'; | |
a.text = " 導入 " | |
//needed for firefox | |
document.getElementsByClassName(tag_loc)[0].appendChild(a); | |
var input = Gen_Input() | |
document.getElementsByClassName(tag_loc)[0].appendChild(input); | |
} | |
async function downloader(image_urls) { | |
console.log('start downloading'); | |
// Sleep in loop | |
for(var img = 1, length1 = image_urls.length; img <= length1; img++){ | |
var extension = image_urls[img-1].split(".").pop() | |
GM_download(image_urls[img-1], biaoti + "[" + img + "]." + extension) | |
console.log("Download Image" + img) | |
await sleep(2000) | |
} | |
await sleep(2000); | |
} | |
function Download_Pics() | |
{ | |
if (mobile == true) | |
{ | |
var tmp = document.createElement("text") | |
tmp.textContent = "|" | |
document.getElementsByClassName(tag_loc)[0].appendChild(tmp) | |
} | |
var a = document.createElement('a'); | |
//supported by chrome 14+ and firefox 20+ | |
a.text = " 下載 " | |
//needed for firefox | |
document.getElementsByClassName(tag_loc)[0].appendChild(a); | |
a.addEventListener("click", async function (value) { | |
var images = null | |
var image_urls = [] | |
if (mobile == true) | |
{ | |
images = document.querySelector(".tpc_cont").getElementsByTagName("img") | |
} | |
else | |
{ | |
images = document.querySelector(".tpc_content").getElementsByTagName("img") | |
} | |
for(var i = 0, len = images.length; i < len; i++){ | |
image_urls.push(images[i].src) | |
} | |
var result = image_urls.join("\n") | |
GM_setClipboard(result) | |
var info = confirm("已复制" + image_urls.length + "张图片链接到粘贴板,现在下载吗?") | |
if (info == true) | |
{ | |
await downloader(image_urls) | |
} | |
}); | |
} | |
function Gen_Key(value) | |
{ | |
var url = value.split("<:separator;>")[1] | |
var url_array = url.split("/") | |
var key = url_array.slice(4,7).join("/") | |
return key | |
} | |
function Gen_Node(index,key,row_base,value) // | |
{ | |
var tmp = value.split("<:separator;>") | |
var time = tmp[2] | |
var tmp_url = tmp[1] | |
tmp_url = tmp_url.replace(/\*\*/, document.URL.split("/")[2]) | |
tmp_url = tmp_url.replace(/htm_mob/, "htm_data") | |
var tmp_str = tmp[0].split(" ") | |
var tmp_bankuai = tmp_str.pop() | |
var tmp_biaoti = tmp_str.join(" ") | |
var tmp_node = row_base.cloneNode(true) | |
tmp_node.className = "tr3" | |
tmp_node.children[0].innerText = index | |
tmp_node.children[1].innerText = tmp_biaoti | |
tmp_node.children[1].setAttribute("onclick","window.open('" + tmp_url + "');") | |
tmp_node.children[2].innerText = tmp_bankuai | |
tmp_node.children[3].innerText = time | |
tmp_node.children[4].innerText = "删除" | |
tmp_node.children[4].setAttribute("index",index) | |
tmp_node.children[4].setAttribute("align","center") | |
tmp_node.children[4].onclick = function() | |
{ | |
if (true == confirm("确认删除?")) | |
{ | |
tmp_node.remove() | |
GM_deleteValue(key); | |
} | |
}; | |
return tmp_node | |
} | |
//Gen node for mobile | |
function Gen_Mob_Node(index,key,row_base,value) // | |
{ | |
var tmp = value.split("<:separator;>") | |
var time = tmp[2] | |
var tmp_url = tmp[1] | |
tmp_url = tmp_url.replace(/\*\*/, document.URL.split("/")[2]) | |
tmp_url = tmp_url.replace(/htm_data/, "htm_mob") | |
var tmp_str = tmp[0].split(" ") | |
var tmp_bankuai = tmp_str.pop() | |
var tmp_biaoti = tmp_str.join(" ") | |
var tmp_node = row_base.cloneNode(true) | |
tmp_node.className = "tr3 tac" | |
tmp_node.children[0].innerText = tmp_biaoti | |
tmp_node.children[0].setAttribute("onclick","window.open('" + tmp_url + "');") | |
tmp_node.children[1].innerText = "删除" | |
tmp_node.children[1].setAttribute("index",index) | |
tmp_node.children[1].setAttribute("align","center") | |
tmp_node.children[1].onclick = function() | |
{ | |
if (true == confirm("确认删除?")) | |
{ | |
tmp_node.remove() | |
GM_deleteValue(key); | |
} | |
}; | |
return tmp_node | |
} | |
//time key | |
function extract_key_list() | |
{ | |
var keys = GM_listValues() | |
var result = [] | |
var tmps = [] | |
for (var i=0 ,len1 = keys.length; i < len1; i++) | |
{ | |
var tmp = [] | |
var bar = GM_getValue(keys[i]) | |
if (bar) | |
{ | |
//time | |
tmp.push(bar.split("<:separator;>").pop()) | |
} | |
tmp.push(keys[i]) | |
tmps.push(tmp) | |
} | |
tmps.sort(function (a,b){return Date.parse(a[0]) < Date.parse(b[0]) ? 1 : -1;}) | |
console.log(tmps) | |
for (var j=0 ,len2 = tmps.length; j < len2; j++) | |
{ | |
result.push(tmps[j][1]) | |
} | |
return result | |
} | |
function PC_Check_Collection() | |
{ | |
console.log("打开收藏夹") | |
try | |
{ | |
var father = document.getElementsByClassName("t")[2].getElementsByTagName("tr") | |
} | |
catch (err) | |
{ | |
alert("需要登录才能查看/编辑收藏夹\n\n未登录状态只能进行添加/导入/导出操作\n\n收藏内容保存在本地,卸载脚本会丢失收藏夹,请及时导出备份!") | |
} | |
if (father.length > 2 ) | |
{ | |
for (var i= 2 ,len = father.length; i < len;i++) | |
{ | |
father[i].remove() | |
} | |
} | |
father[1].getElementsByTagName("td")[3].innerText = "時間" | |
father[1].getElementsByTagName("td")[4].innerText = "操作" | |
document.querySelector("#main > div:nth-child(3) > table > tbody > tr > td:nth-child(2) > form > center").remove() | |
var row_base = father[1] | |
var keys = extract_key_list() | |
for(var j = 0, len1 = keys.length; j < len1; j++){ | |
var tmp_node = Gen_Node(j+1,keys[j] ,row_base, GM_getValue(keys[j])) | |
father[1].parentElement.append(tmp_node) | |
} | |
var upload_entry = document.querySelector("#main > div:nth-child(3) > table > tbody > tr > td:nth-child(1) > form > div > table > tbody > tr:nth-child(4) > th") | |
upload_entry.innerText = " 導入 " | |
var input = Gen_Input() | |
upload_entry.appendChild(input) | |
} | |
function Mob_Check_Collection() | |
{ | |
console.log("打开收藏夹") | |
try | |
{ | |
document.querySelector("#main > div:nth-child(3) > table > tbody > tr:nth-child(2) > td > form > center").remove() | |
var father = document.getElementsByClassName("t")[2].getElementsByTagName("tr") | |
} | |
catch (err) | |
{ | |
alert("需要登录才能查看/编辑收藏夹\n\n未登录状态只能进行添加/导入/导出操作\n\n收藏内容保存在本地,卸载脚本会丢失收藏夹,请及时导出备份!") | |
} | |
if (father.length > 1 ) | |
{ | |
for (var i= 1 ,len = father.length; i < len;i++) | |
{ | |
father[i].remove() | |
} | |
} | |
father[0].children[1].width = "15%" | |
father[0].children[1].innerText = "操作" | |
father[0].children[1].innerText.align="right" | |
var row_base = father[0] | |
var keys = extract_key_list() | |
for(var j = 0, len1 = keys.length; j < len1; j++){ | |
var tmp_node = Gen_Mob_Node(j+1,keys[j] ,row_base, GM_getValue(keys[j])) | |
father[0].parentElement.append(tmp_node) | |
} | |
document.getElementsByClassName("tr1")[0].parentNode.remove() | |
var upload_entry = document.getElementsByClassName("tr1")[0].children[0] | |
upload_entry.innerText = "導入 " | |
var input = Gen_Input() | |
upload_entry.appendChild(input) | |
} | |
(function() { | |
'use strict'; | |
Set_Cookie() | |
if (is_collection_page == false) | |
{ | |
Collecte() | |
if (bankuai == "新時代的我們" || bankuai == "達蓋爾的旗幟") | |
{ | |
Download_Pics() | |
} | |
Export_Collection() | |
Import_Collection() | |
//Import_Collection() | |
} | |
else | |
{ | |
if (mobile ) | |
{ | |
Mob_Check_Collection() | |
} | |
else | |
{ | |
PC_Check_Collection() | |
} | |
} | |
})(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name 天眼看小说下载按钮 | |
// @namespace http://tampermonkey.net/ | |
// @version 1.0 | |
// @description add download link to a novel website | |
// @author niuhe | |
// @match https://novel.zhwenpg.com/b.php?id* | |
// @grant none | |
// ==/UserScript== | |
(function() { | |
var book_name = document.querySelector("#idmaintablist > table:nth-child(3) > tbody > tr:nth-child(1) > td > h2").textContent | |
var author = document.querySelector("#idmaintablist > table:nth-child(3) > tbody > tr:nth-child(1) > td > a > font").textContent | |
var url_base = "javascript:window.location.href='https://github.com/2niuhe/tianyan_novel/raw/master/novel/" | |
'use strict'; | |
var download_loc = url_base + book_name + "%2B" + author + ".txt'" | |
var button = document.createElement("a"); //创建一个input对象(提示框按钮) | |
button.setAttribute("href", download_loc); | |
button.text ="TXT下载(单击预览后,右键另存为)" | |
button.setAttribute("target","view_window") | |
var x = document.getElementsByClassName("cbooksingle")[2]; | |
x.appendChild(button); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment