您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
修复某些 AutoPagerize 脚本、扩展和附加中出现的第二页或更高版本的延迟加载图像问题。
// ==UserScript== // @name * AutoPagerize LazyLoad Assistant // @name:ja * AutoPagerize LazyLoad Assistant // @name:zh-CN * AutoPagerize LazyLoad Assistant // @namespace knoa.jp // @description It fixes the lazy load image problem of some AutoPagerize scripts, extensions or add-ons, occuring on second or latter pages. // @description:ja 一部の AutoPagerize スクリプト、拡張機能、アドオンで発生する、2ページ目以降の遅延読み込み画像の問題を修正します。 // @description:zh-CN 修复某些 AutoPagerize 脚本、扩展和附加中出现的第二页或更高版本的延迟加载图像问题。 // @include * // @version 2.0.0 // @grant GM.xmlHttpRequest // ==/UserScript== /* [update] 2025-05-18 2.0.0 サイト指定制御対応(togetter/posfie対応) */ (function() { const SCRIPTID = 'AutoPagerizeLazyLoadAssistant'; const FLAGNAME = 'lazyLoadAssistant'; const DATASETS = [ 'src', 'lazySrc', 'original', 'delay', 'img', ]; const CALLBACKS = { id: async () => {}, togetter: async () => { // togetter/posfie は img の data-s 属性の数字が head 内 script 要素の usedImages 配列に対応する。 // 画像ギャラリー表示の際には https://togetter.com/api/getImageList にPOSTを投げて全画像を取得しているようだが活用しづらいしプロフィールアイコンなども含まれない。 // autopazerizeはスクリプトに対して2ページ目以降のdocumentを取得させてくれないので、独自に取得しに行くしかない。 console.log(SCRIPTID, 'callback: togetter'); const as = document.querySelectorAll('a.autopagerize_link[href]'); if(as.length === 0) return console.log(SCRIPTID, 'autopagerize_link not found.'); const a = Array.from(as).at(-1); const r = await GM.xmlHttpRequest({url: a.href}).catch(e => console.error(SCRIPTID, e)); const scripts = r.responseXML.querySelectorAll('head > script[type="text/javascript"]:not([src])'); //usedImages配列見込みを絞っているがセレクタとしては脆い。 if(scripts.length === 0) return console.log(SCRIPTID, 'script not found.'); const script = Array.from(scripts).find(s => s.textContent.includes(' usedImages = ')); //判定としてはやや弱い if(script === undefined) return console.log(SCRIPTID, 'usedImages not found.'); const srcs = script.textContent.match(/"[^"]+?"/g).map(s => s.slice(1, -1).replace(/\\/g, '').replace(/^p/, 'https://pbs.twimg.com/profile_images/')); //profileはサイト解析で確認した処理。 const imgs = document.querySelectorAll('hr.autopagerize_page_separator ~ * img[data-s]'); //対象となる2ページ目以降をシンプルに取得してあとから適用済みを除外する imgs.forEach(img => { if(img.dataset[FLAGNAME]) return; //本スクリプトが適用済 if(img.dataset.s.startsWith('https:')) img.dataset.src = img.dataset.s;//動画サムネの場合はdata.sにURLが直接入っている else img.dataset.src = srcs[parseInt(img.dataset.s)];//通常はdata.sに数字のみが入っている //※実際のimg.srcに入れるのは後の共通処理で }); }, }; const SITES = { 'host': CALLBACKS.id, 'togetter.com': CALLBACKS.togetter, 'posfie.com': CALLBACKS.togetter, }; let dataset = undefined; //サイトで使われている lazyload dataset名。一度確定したら変わらない。 let callback = SITES[location.host]; //サイト指定制御が存在していれば。 document.addEventListener('GM_AutoPagerizeNextPageLoaded', async e => { console.log(SCRIPTID, 'event:', e.type); if(callback) await callback(); const imgs = document.querySelectorAll('img'); //ここで FLAGNAME 付きを除外する処理は重いのでシンプルに全取得する for(let i = 0; imgs[i]; i++){ // 画像srcが入ったdataset名を判定する if(dataset === undefined){ dataset = DATASETS.find(n => imgs[i].dataset[n]); if(dataset) console.log(SCRIPTID, 'dataset:', dataset); else continue; } // 処理済ならスキップ if(imgs[i].dataset[FLAGNAME]) continue; // 画像src処理 if(imgs[i].dataset[dataset]){ imgs[i].src = imgs[i].dataset[dataset]; imgs[i].style.opacity = 1; //一部のサイトに必要 imgs[i].style.visibility = 'visible'; //一部のサイトに必要 imgs[i].dataset[FLAGNAME] = 'true'; } } }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址