您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
將文章的集中串收集整理
// ==UserScript== // @name 巴哈 Vtuber 八卦串 - 集中串整理 // @namespace https://home.gamer.com.tw/homeindex.php?owner=qwert535286 // @version 0.0.11 // @description 將文章的集中串收集整理 // @author 笑翠鳥 // @icon https://www.google.com/s2/favicons?domain=gamer.com.tw // @match https://forum.gamer.com.tw/C.php?*bsn=60076*snA=6367604* // @exclude https://forum.gamer.com.tw/C.php?*bsn=60076*snA=6367604*s_author=** // @license MIT // ==/UserScript== (async (...mainTags) => { const subTagsRegex = /(#[^\d\s-#]{1,15})/gi const process = { getFloor($floor) { return { floor: `#${$floor.dataset.floor}`, link: $floor.href } }, getTags(ctx) { const main = mainTags.filter(tag => ctx.includes(tag))[0] || '' return { main, sub_tags: ctx.match(subTagsRegex).filter($tag => ![main, '#集中串'].includes($tag)).join(' ') } }, getTwitchId($iframe) { return !$iframe ? '' : $iframe.dataset.src.match(/channel=([^&]+)/)[1].toLowerCase() }, getYoutubeId($iframe) { return !$iframe ? '' : $iframe.dataset.src.match(/embed\/([^?]+)/)[1] }, getImage(twitch, youtube, $ctx) { switch(true) { case !!twitch: return 'https://images.fastcompany.net/image/upload/w_596,c_limit,q_auto:best,f_auto/wp-cms/uploads/2019/09/3-twitch-is-rebranding-for-the-first-time.jpg' case !!youtube: return `https://img.youtube.com/vi/${youtube}/mqdefault.jpg` case !!$ctx.querySelector('img'): return $ctx.querySelector('img').dataset.src // lazyload case !!$ctx.querySelector('.photoswipe-image'): return $ctx.querySelector('.photoswipe-image').href default: return 'https://cdn.discordapp.com/attachments/962944764888637511/1064038516318818364/9721bc5b01f0bb8c.png' } }, getLive($ctx) { const twitch = this.getTwitchId($ctx.querySelector('.video-twitchvod iframe')) const youtube = this.getYoutubeId($ctx.querySelector('.video-youtube iframe')) const image = this.getImage(twitch, youtube, $ctx) return { twitch, youtube, image } }, } const result = [...document.querySelectorAll('.c-post')] .filter($post => $post.innerText.includes('#集中串')) .map($post => ({ ...process.getFloor($post.querySelector('.c-post__header__author .floor')), ...process.getTags($post.querySelector('.c-article__content').innerText), ...process.getLive($post.querySelector('.c-article__content')), timestamp: new Date($post.querySelector('.c-post__header__info .edittime').dataset.mtime), })) result.length && await fetch('https://charming-pasca-93b760.netlify.app/.netlify/functions/write', { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(result) }) const list = await fetch('https://charming-pasca-93b760.netlify.app/.netlify/functions/read', { method: 'GET', headers: { Accept: 'application/json' } }).then(res => res.json()) if (!list || !list.length) return const focusList = list.map(({ floor, link, main, sub_tags, image }) => ` <div class="popular__item"> <a href="${link}"> <div class="img"> <div class="tag">${main}</div> <img src="${image}"> </div> <p class="name">${[floor, sub_tags].join(' | ')}</p> </a> </div> `).join('\n') document.querySelector('.c-section:has(.popular)').insertAdjacentHTML('beforebegin', ` <section class="c-section"> <div class="c-section__main popular"> <h3 class="popular__title">集中串</h3> <div class="row">${focusList}</div> </div> </section> `) })('#Holo', '#彩虹', '#VSPO', '#VShojo', '#VT箱', '#個人勢', '#歌勢', '#中之人', '#炎上')