如有需要支持的站點可反饋,有空的話會嘗試幫寫規則加進腳本內置的規則庫裡,能力有限不保証一定寫的出來。
寫這個腳本的緣由是,想讓下載、複製鏈接不用做展開圖庫挑選圖片的動作,能自己決定要儲存的壓縮檔和資料夾名稱,網站沒有限制連接數的話能做到高速聚集所有圖片,還能添加一些我想要的輔助功能。
簡介:
聚圖!反對將一話一集一章一篇一部拆成好幾頁,一頁一張圖真XXX的有病,整頁用Lazy loading的話還能接受,透過選擇器圈選圖片或者自己寫函式,能聚集分頁的所有圖片到當前頁面裡,也能進行下載壓縮打包,如有NEXT能做到自動化下載,支援自定義規則方便重複使用,後續擴充規則更容易。
用戶寫的規則請自行另外備份,規則只會寫死在腳本裡不會線上規則化,腳本更新就會覆蓋規則。
關於自動下載:
當修改了腳本選項或站點規則啟用了自動下載時,站點規則insertImg的自動插入圖片將無效,瀏覽器的下載設定需關閉下載前詢問儲存位置和設定好預設的下載路徑,全自動需要有NEXT做搭配,每個站點第一次啟用時需等待連續下載2~3次後,觸發瀏覽器詢問是否同意允許下載多個檔案,需同意後後續才能成功下載,並且讓分頁保持在前景運行不然壓縮進度會停住,可以開一個獨立視窗一個分頁用作下載用,最好的方式是拉兩個視窗一個佔1/3畫面掛下載一個佔3/2畫面瀏覽。
2023/05/13
腳本增加了全局開關選項,可以不用搜索規則對各別站點進行修改,不需要時記得關閉。
可用規則示例:
「 點擊展開查看 」
[{
name: "規則名稱",
enable: 0, //填0禁用此規則
icon: 0, //填0不顯示左下圖示
key: 0, //填0不綁定快捷鍵
reg: /www\.xxxxx\.com/, //正則表達式匹配網址
delay: 300, //延遲載入規則
include: "元素", //網頁必須包含的元素
exclude: "元素", //網頁要排除的元素
init: "code", //載入頁面後要執行的代碼
init: () => {
code
},
imgs: "#TheImg", //CSS選擇器
imgs: "//img[@id='TheImg']", //XPath選擇器
//IMG、DIV、A,3種元素會先判斷有沒有圖片網址放在dataset屬性,如果沒有IMG取src屬性,A取href屬性。
imgs: "js;code", //也可透過JS代碼自己創建Array,有時大圖是在A元素上需要透過xhr獲取或放在script或變量或透過api取得的json。
imgs: () => {
let arr = [];
…code;
return arr;
},
insertImg: ["元素", 1, time], //[清空此元素內容插入圖片, 0(手動)1(自動)2(自動Lazy loading模式)3(手動Lazy loading模式), 自動延遲時間(預設0)]。
insertImg: [
["元素", (插入在此元素) 0(裡面)1(之前) 2(之後), "要移除的元素"], 0(手動) 1(自動) 2(自動Lazy loading模式) 3(手動Lazy loading模式), 自動延遲時間(預設0)
],
go: 1, //insertImg配套選項,圖片插入在頁面偏下位置時,捲動至第一張大圖的位置。
customTitle: "return code", //自定義JS代碼生成壓縮檔和資料夾名稱,預設是使用當前網頁標題。
customTitle: () => {
return code
},
autoDownload: [1, time], //1載入頁面後立即開始下載,與next搭配可以實現全自動下載,time延遲幾秒後點擊下一頁(預設5)。
next: "//a[text()='下一章']", //設定下一頁元素綁定右方向鍵點擊下一頁。
next: () => {
…code;
return link
},
prev: "//a[text()='上一章']", //設定上一頁元素綁定左方向鍵點擊上一頁,填1則使用history.back();。
css: "css", //插入自訂樣式,基本上就是用來隱藏廣告用的。
autoClick: "元素", //載入頁面後點擊一次此元素,能簡單做到自動簽到、展開目錄、Show All
autoClick: ["元素", 1000], //元素,延遲毫秒時間(預設1000)
observerClick: "元素", //使用Intersection Observer API,元素進入可視範圍內才點擊
loadMore: "元素", //監聽scroll事件,滾至頁面底部時點擊元素,能簡單做到自動載入更多
openInNewTab: ".manga-cover>a:not([target=_blank])", //指定的A元素在新分頁開啟
topButton: true, //添加返回頂部按鈕
one: 1, //0多線程,1使用單線程下載,有些網站限制連接數,併發請求容易出錯。
fetch: 1, //使用Fetch API下載圖片,需要網站有支援CORS,如小黃書,4KHD
referer: "src", //下載圖片時傳遞的參照頁,預設是使用當前網址,"src"參照頁為圖片網址,也能自訂如"https://www.4khd.com/"或空""
category: "comic" //類別(非必須)
}, {
name: "規則2",
enable: 0,
icon: 0,
key: 0,
reg: /www\.xxxxx\.com/,
delay: 300,
include: "",
exclude: "",
init: "code",
init: () => {
code
},
imgs: "",
imgs: () => {
code
},
insertImg: ["", 0, time],
insertImg: [
["", 1, ""], 2, time
],
go: 1,
customTitle: "code",
customTitle: () => {
code
},
autoDownload: [1, time],
next: "",
next: () => {
code
},
prev: "",
css: "",
autoClick: "",
autoClick: ["", time],
observerClick: "",
loadMore: "",
openInNewTab: "",
topButton: true,
one: 1,
fetch: 1,
referer: "src",
category: ""
}, {
name: "規則3",
…
}]
內置函式:
「 點擊展開查看 」
//可使用在規則init、imgs、customTitle
//返回一個指定元素,支持CSS/Xpath選擇器
fun.ge('元素選擇器', 搭配fun.doc()(可省略)))
//返回所有指定元素,支持CSS/Xpath選擇器
fun.gae('元素選擇器', 搭配fun.doc()(可省略)))
//取得元素的字串
fun.geT('元素選擇器',mode)
mode
1返回指定元素的字串(預設)
2返回指定元素的上一個元素的字串
3返回指定元素的上上一個元素的字串
//取得元素屬性的值
fun.attr('元素','屬性')
//對document.title的字串修改
fun.title('字串',mode)
mode
0返回【刪除指定字串的標題(預設)】
1返回【字串切割取[0]去前後空白】
2返回【字串切割[0] + '字串' + 字串切割[1]】
3返回【字串切割[1] + '字串' + 字串切割[0]】
//將字串解析成document物件
fun.doc('字串')
搭配fetch(url).then(res => res.text())返回的原始碼使用
或串接
fetch(url).then(res => res.text()).then(res => {
let doc = fun.doc(res);
let ele = fun.ge(ele, doc);
return ele
})
//將字串解析成xml物件
fun.xml('字串')
//使用Promise包裝GM_xmlhttpRequest
fun.xhr(url, type = 'text', referer = location.href)
用fetch(url)遇到需要CORS時改用這個
fun.xhr(url)
fun.xhr(url, "document").then(doc => {
console.log("測試doc", doc);
})
fun.xhr(url, "json").then(json => {
console.log("測試json", json);
})
//顯示簡短訊息
fun.show('字串',1000(顯示的時間,0持續顯示));
//延遲運行async/await
await fun.delay(time);
//等待元素async/await
await fun.waitEle(ele, max = 200, doc = document)
間隔100毫秒判斷一次,有元素返回true超過循環次數返回false。
所以可以這樣用
if (await fun.waitEle(ele)) {
code
} else {
code
}
//函式搭配,多元素點擊,如簽到任務
init: async () => {
if (fun.ge(ele)) {
let eleArr = ["ele1","ele2","ele3"];
for (let i in eleArr) {
await fun.waitEle(eleArr[i]);
fun.ge(eleArr[i]).click();
await fun.delay(200);
}
}
}
//等同eval()
fun.run('代碼')
//移除元素
fun.remove('ele', time = 0)
//插入樣式
fun.css('css')
需要先用JS判斷的情況用這個
//xhr抓取元素,不局限於圖片(靜態,可跨域)
fun.getEle(links, eles, targetEle, removeEle = null)
links網址陣列
eles要抓的元素
"targetEle"清空此元素放入allEle
["targetEle", pos] 此元素位置pos,0裡面1之前2之後
//xhr抓取圖片元素,返回圖片網址 (只支持靜態網頁,無法跨域請求)
fun.getImg('圖片元素選擇器',max ,mode ,['圖片網址用來替換的字串','圖片網址要被替換的字串'](可省略) )
max填入用fun.geT()取得最大頁數的數字,或想辦法算出最大頁數的數字。
fun.getImg(ele, max, mode = 1, rText = [null, null])
網址頁碼數字遞增模式
第一頁 ==> 第二頁
mode1(預設)
.html ==> .html?page=2
==> ?page=2
mode2
.html ==> /2.html
mode3
.html ==> _1.html
mode4
/ ==> /2/
mode'4'
==> /2
mode5
.html ==> -2.html
mode'5'
-1.html ==> -2.html
mode6
?p=1 ==> ?p=2
mode7
/1 ==> /2
.html ==> .html/2
mode8
==> &page=1
mode9
.html ==> _2.html
mode10
.html ==> .html/2
mode11
/ ==> /2.html
/1.html ==> /2.html
mode12
/ ==> /2.htm
/1.htm ==> /2.htm
mode13
-1-* ==> -2-*
mode14
/1/ ==> /2/
mode15
/ ==> /index_2.html
/index.html ==> /index_2.html
mode16
==> /2#list
mode17
.htm ==> _2.htm
mode18
/ ==> /page/2/
mode19
-1 ==> -2
mode20
==> -p-2
fun.getImgO('圖片元素選擇器', max, mode, ['圖片網址用來替換的字串', '圖片網址要被替換的字串'], time(延遲請求下一頁的時間預設200毫秒), '替換頁碼條元素', 0(不顯示獲取訊息))
fun.getImgO(img, maxPage = 1, mode = 1, rText = [null, null], time = 200, paginationEle = null, msg = 1)
基本同fun.getImg,但使用單線程獲取網頁,能設置獲取網頁的間隔時間。
fun.getImgIframe('圖片元素選擇器', max, mode, ['圖片網址用來替換的字串', '圖片網址要被替換的字串'], '替換頁碼條元素', time(給予框架讀取的時間), 0 不顯示獲取訊息)
fun.getImgIframe(img, max, mode, [null, null], paginationEle, time, showMsg)
基本同fun.getImg,使用iframe框架單線程獲取網頁,能讓網頁運行必要的javaacript。
fun.getImgA('圖片元素選擇器', 'A元素選擇器', mode, ['圖片網址要替換的字串', '圖片網址要被替換的字串'](可省略), 0 不顯示獲取訊息)
mode
0多線程(預設)
1單線程
3單線程不將A元素替換成圖片元素
A元素選擇器的href屬性不能是#和javascript或onclick監聽點擊事件,必須是一般的http鏈接。
fun.getImgA(img, A, one = 0, rText = [null, null], showMsg = 1)
A元素參數可以傳入自己創建的網址陣列
fun.getNP('元素選擇器', '下一頁元素', '判斷為最後一頁的元素', '頁碼條元素', time(延遲請求下一頁的時間預設0毫秒), dataset = null, msg = 1)
翻頁模式聚集圖片或是含A元素的預覽縮圖然後fun.getImgA()
用在規則init
fun.getNP(ele, nextLinkEle, lastEle, paginationEle, time);
fun.getNP(ele, nextLinkEle);
用在規則imgs,需要用async/await
//應用在包子漫畫的用法
imgs: async () => {
await fun.getNP(".comic-contain>div:not(.mobadsq)", "//a[contains(text(),'下一頁') or contains(text(),'下一页')]", null, ".comic-chapter>.next_chapter");
let arr = [...fun.gae(".comic-contain amp-img")].map(e => e.getAttribute("src"));
return [...new Set(arr)]
}
應用在小黃書的用法
imgs: async () => {
await fun.getNP(".photos>a", ".pager a[current=true]+a:not(.next)", null, ".pager");
return [...fun.gae(".cr_only")].map(e => e.src.replace("_600x0", ""));
}
腳本的操作步驟方式
點擊圖示、確定、確定,3步開始下載
右鍵點擊圖示、確定,2步驟複製圖片網址,如果設置了insertImg,按右鍵是插入圖片,第二次按是複製圖片網址。
中鍵點擊圖示捲動至第一張大圖
腳本有綁定按鍵
數字鍵0下載壓縮、數字鍵1複製圖片網址、數字鍵2捲動至第一張大圖
按0、Enter、Enter,3步驟開始下載。
按1、Enter,2步驟複製圖片網址。
如果設置了insertImg為手動,按1、Enter是插入圖片,第二次按是複製圖片網址。
按2前往插入的第一張大圖
2023/05/13
修改中鍵功能為捲動至第一張大圖,綁定快捷鍵數字鍵2
2023/05/15
如果規則imgs是函式省略輸入選擇器這一步。
圖介
在頁面左下添加了一個圖片下載按鈕

點擊後會彈出確認窗輸入CSS和Xpath選擇圖片元素。

確認後需要再輸入資料夾名稱

確認後就會開始下載壓縮打包圖片

為了與東方永頁機共存不會造成衝突,也不需要兩邊開開關關的,整理了東方永頁機黑名單。
2023/05/23 21:15
https://github.com/skofkyo/AutoPager/blob/main/Blacklist.txt
老司機類內置規則支持列表
「 點擊展開查看 」
H漫類內置規則支持列表
「 點擊展開查看 」
漫畫類內置規則支持列表
漫畫類為了兼容我提交給東方永頁機的翻頁規則和自己寫的專用腳本,規則幾乎都是預設為關閉狀態。
2023/05/07
Mangabz/Xmanhua/DM5/極速/PC版,改成併發請求圖片鏈接,大幅度減少了獲取資料的時間。
2023/05/17
增加了腳本選項,可以直接開啟所有的漫畫類規則,方便自己重新測試規則,和有需要的用戶不用一個一個開那麼麻煩。
「 點擊展開查看 」
輔助類內置規則支持列表
「 點擊展開查看 」
網站 | 備註 |
---|
ouo.io | 自動跳轉 |
www.mediafire.com | 自動下載 |
supjav.com | 立即顯示影片縮圖 |