您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Show statistics about 8chan post IDs
// ==UserScript== // @name 8chan IDs // @version 1 // @grant none // @include https://8chan.moe/*/res/* // @include https://8chan.se/*/res/* // @run-at document-idle // @license AGPL // @description Show statistics about 8chan post IDs // @namespace https://gf.qytechs.cn/users/1461466 // ==/UserScript== // use https://webutility.io/csv-to-chart-online to create bar graphs with csv // remove the bottom rows with (1) posters to get a better graph let lastresult = ''; let trash = document.createElement('div'); let button = document.createElement('button'); button.setAttribute('type', 'button'); button.innerHTML = 'Find schizos (click to update)'; trash.append(button); let button2 = document.createElement('button'); button2.setAttribute('type', 'button'); button2.innerHTML = 'Copy CSV'; trash.append(button2); button2.addEventListener('click', () => navigator.clipboard.writeText(lastresult)); let button3 = document.createElement('button'); button3.setAttribute('type', 'button'); button3.innerHTML = 'Hide'; trash.append(button3); let moretrash = document.createElement('div'); trash.append(moretrash); button3.addEventListener('click', () => moretrash.innerHTML = ''); document.getElementById('threadList').append(trash); async function stalk(id) { console.log('stalking', id); let dates = {}; for (let hour = 0; hour < 24; hour++) { dates[hour] = 0; } for (let post of document.getElementsByClassName('postCell')) { let labelids = post.getElementsByClassName('labelId'); if (labelids.length == 1 && labelids[0].innerText == id) { let date = post.getElementsByClassName('labelCreated')[0].innerText; let hour = parseInt(/ (\d{2}):\d{2}:\d{2}/.exec(date)[1]); dates[hour] = dates[hour] + 1; } } console.log(dates); let csv = `#hour,posts by ${id}\n`; for (let hour = 0; hour < 24; hour++) { csv += `${hour},${dates[hour]}\n`; } await navigator.clipboard.writeText(csv); alert('copied to clipboard'); } function shit() { moretrash.innerHTML = ''; let pairs = Array.from(document.getElementsByClassName('labelId')) // get ID .map(x => x.innerText) // drop empty ID (post template?) .filter(x => x.length > 0) // count IDs .reduce((dict, x) => {dict[x] = dict[x] === undefined ? 1 : dict[x] + 1; return dict;}, {}); let list = Object.entries(pairs); // sort by ID list.sort((a, b) => {return a[0].localeCompare(b[0]);}); // sort by most schizo list.sort((a, b) => {return b[1] - a[1];}); // number of posts with IDs let allcount = list.reduce((count, x) => count + x[1], 0); // f*ck it I love strings let html = '<table>'; let csv = '#ID,posts\n'; for (const [id, count] of list) { let style = 'border: 1px solid'; html += `<tr><td style="${style}">${count} (${(count / allcount * 100).toFixed(1)}%)</td><td style="${style}"><span class="labelId">${id}</span></td><td><button type="button" class="stalkbtn" data-id="${id}">stalk</button></tr>`; csv += `${id},${count}\n`; } html += '</table>'; html += `All: ${list.length} / ${allcount}` moretrash.innerHTML = html; lastresult = csv; // oh no I'm a retard for (let btn of document.getElementsByClassName('stalkbtn')) { btn.addEventListener('click', (ev) => stalk(ev.currentTarget.dataset.id)); } } button.addEventListener('click', shit);
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址