您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Loads all geeklist items into a single view simmilar to Peyo61's external tool.
当前为
// ==UserScript== // @name Board Game Geek - One page auction geeklists // @namespace http://tampermonkey.net/ // @version 0.2 // @description Loads all geeklist items into a single view simmilar to Peyo61's external tool. // @author Kempeth @ boardgamegeek // @match https://boardgamegeek.com/geeklist/* // @icon https://www.google.com/s2/favicons?sz=64&domain=boardgamegeek.com // @grant none // @license MIT // ==/UserScript== var btnConvert; var btnItems; var progressFull; var progressEmpty; var geeklistid; var itemList; var firstItem; (function() { 'use strict'; //console.log('root function'); init(); })(); function retry(f) { window.setTimeout(f, 500); } function init() { //console.log('init function'); var els = document.getElementsByTagName('gg-geeklist-page-ui');//gg-geeklist-items-ui //console.log(els); if (els.length == 0) { retry(init); return; } els = els[0].getElementsByTagName('header'); //console.log(els); if (els.length == 0) { retry(init); return; } els = els[0].getElementsByTagName('nav'); //console.log(els); if (els.length == 0) { retry(init); return; } var el = els[0]; btnConvert = document.createElement('button'); btnConvert.innerHTML = "One Page Auction"; btnConvert.className = "btn btn-warning"; btnConvert.onclick = convert; el.append(btnConvert); } function setProgress(done, total) { var percentage = done * 100.0 / total; progressFull.style.width = percentage + '%'; progressEmpty.style.width = (100 - percentage) + '%'; progressFull.setAttribute('aria-valuemax', total); progressFull.setAttribute('aria-valuenow', done); if (percentage > 50) { progressFull.innerHTML = done + ' / ' + total; progressEmpty.innerHTML = ''; } else { progressEmpty.innerHTML = done + ' / ' + total; progressFull.innerHTML = ''; } } function convert() { var els = document.getElementsByTagName('gg-geeklist-page-ui'); //console.log(els); if (els.length == 0) { retry(convert); return; } els = els[0].getElementsByTagName('div'); //console.log(els); if (els.length == 0) { retry(convert); return; } var footerNav = els[0].getElementsByTagName('nav'); //console.log(footerNav); if (els.length == 0) { retry(convert); return; } footerNav = footerNav[footerNav.length - 1]; els = els[0].getElementsByTagName('header'); //console.log(els); if (els.length == 0) { retry(convert); return; } els = els[0].getElementsByTagName('nav'); //console.log(els); if (els.length == 0) { retry(convert); return; } var headerNav = els[0]; els = document.getElementsByTagName('gg-geeklist-items-ui'); //console.log(els); if (els.length == 0) { retry(convert); return; } els = els[0].getElementsByTagName('div'); //console.log(els); if (els.length == 0) { retry(convert); return; } itemList = els[0]; // remove header items for (var child of headerNav.childNodes) { if (child.tagName != 'GG-THUMBS-GEEKGOLD-GIVEN' && child.tagName != 'GG-SUBSCRIPTION-BUTTON') { headerNav.removeChild(child); } } // add header items var progress = document.createElement('div'); progress.className = "progress"; progress.style.height = "32px"; progress.style.width = "256px"; headerNav.appendChild(progress); progressFull = document.createElement('div'); progressFull.className = "progress-bar"; progressFull.setAttribute('role', 'progressbar'); progressFull.setAttribute('aria-valuemin', 0); progressFull.setAttribute('aria-valuemax', 0); progressFull.setAttribute('aria-valuenow', 0); progressFull.style.width = '0%'; progressFull.innerHTML = ''; progress.appendChild(progressFull); progressEmpty = document.createElement('div'); progressEmpty.className = "progress-bar bg-secondary"; progressEmpty.setAttribute('role', 'progressbar'); progressEmpty.style.width = '100%'; progressEmpty.innerHTML = '0 / ???'; progress.appendChild(progressEmpty); var btn = document.createElement('button'); btn.innerHTML = "Refresh"; btn.className = "btn btn-primary"; headerNav.appendChild(btn); // remove convert button btnConvert.parentNode.removeChild(btnConvert); // remove geeklist items //itemList.innerHTML = ''; firstItem = itemList.childNodes[0]; itemList.className = "tw-grid tw-gap-2"; // remove footer nav //footerNav.parentNode.removeChild(footerNav); footerNav.innerHTML = ''; geeklistid = window.location.pathname.split('/')[2]; fetchPage(1); } function fetchPage(page) { // https://api.geekdo.com/api/listitems?page=1&listid=301669 var url = "https://api.geekdo.com/api/listitems?page=" + page + "&listid=" + geeklistid; fetch(url) .then(response => response.json()) .then( data => { //console.log(data); var nr = (data.pagination.pageid - 1) * data.pagination.perPage; for (var item of data.data) { nr++; makeRow(nr, item); } setProgress(nr, data.pagination.total); if (data.data.length < data.pagination.perPage) { console.log("last page"); } else //if (page < 10) { console.log("more pages"); fetchPage(page + 1); } } ); } function makeRow(nr, item) { var row = document.createElement('span'); row.className = "tw-relative tw-flex tw-flex-wrap tw-items-center tw-gap-x-1.5 tw-gap-y-2 tw-rounded-md tw-border tw-border-gray-400 tw-bg-gray-100 tw-p-2"; const thingtype = item.item.href.split('/')[1]; const bodylower = item.body.toLowerCase(); const notsold = bodylower.includes("not sold"); const soldto = bodylower.includes("sold to"); const sold = bodylower.includes("sold"); const auctionclosed = bodylower.includes("auction closed"); var struckout = 0; var struckoutstart = bodylower.indexOf("[-]"); var struckoutend = bodylower.indexOf("[/-]"); while (struckoutstart >= 0 && struckoutend >= 0) { struckout += struckoutend - struckoutstart; struckoutstart = bodylower.indexOf("[-]", struckoutstart + 1); struckoutend = bodylower.indexOf("[/-]", struckoutend + 1); } var state = "<span class=\"badge bg-success\">open</span>"; if (notsold) state = "<span class=\"badge bg-danger\">not sold</span>"; else if (soldto || sold) state = "<span class=\"badge bg-danger\">sold</span>"; else if (auctionclosed || struckout > 100) state = "<span class=\"badge bg-secondary\">closed</span>"; row.innerHTML = "<a href=\"/geeklist/" + geeklistid + "/test?itemid=" + item.id + "#" + item.id + "\" target=\"_blank\">" + nr + ".</a> " + (thingtype == "boardgame" ? "Boardgame" : thingtype == "boardgameexpansion" ? "Expansion" : "Other") + " <a href=\"" + item.item.href + "\" target=\"_blank\">" + encodeWithTextNode(item.item.name) + "</a>" + " " + state; itemList.insertBefore(row, firstItem); } function encodeWithTextNode(htmlstring) { let textarea = document.createElement('textarea'); let text = document.createTextNode(htmlstring); textarea.appendChild(text); return textarea.innerHTML; }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址