您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Grabs every single char tag used by fics that you page through!
// ==UserScript== // @name AO3: Sample character tag scraper! // @description Grabs every single char tag used by fics that you page through! // @version 1.0.0 // @author owlwinter // @namespace N/A // @license MIT license // @match *://*.archiveofourown.org/*TwoSet* // @grant GM_setValue // @grant GM_getValue // ==/UserScript== (function() { 'use strict'; //I needed to grab a list of every single character tag used by works in the twoset violin //fandom, which had just recently been split off as its own fandom from Vlogging. //So I wrote this! //Everytime I page through a page of twoset fics (see the @match in the URL), this will //grab all the char tags on that page of results and save the unique ones //Then, on the last page of twoset fics, it pops up the resulting tag list! //So all I had to do was click through the 100ish pages of TwoSet works and then this script //did all the rest! //A couple of notes: //1) This is not a script I'd want always-on, after scraping the data be sure to disable the script again! //2) The data saved across page to page is not "reset" after it's displayed on the last page - // In order to reset that, click the "Storage" tab on the top of this script in tapermonkey // (next to the Editor and Settings tab), and manually change it to be {} //3) If you are wanting to make your own version of this script from scratch, be sure // to include the @grant lines (lines 9-10), it's easy to overlook but this script // won't work without those! //4) Also don't forget to change the @match statement to your needs!! //5) Feel free to ping me if you have questions, @owlwinter8 :) //Converts the document.querySelectorAll() results into an array const array = f => Array.prototype.slice.call(f, 0) var key = "twoset_chardict"; let chartags; if (GM_getValue(key) == null) { //If there isn't any old data saved, we start fresh! chartags = new Set(); } else { //If there is old data saved, we fetch it var raw = GM_getValue (key, null) var lessraw = JSON.parse(raw) || {}; chartags = new Set(lessraw); } const worksOnPage = array(document.querySelectorAll("li.work")) //For each work on the page for (let a of worksOnPage) { //Grabs the character tags //If you want to, you could collect multiple tag types into multiple lists! let chars = array(a.querySelectorAll(".characters")) for (let b of chars) { let chartag = b.innerText; //Saves the ones we haven't seen before if (!chartags.has(chartag)) { chartags.add(chartag) } } } //Saves the dictionary data across pages //https://wiki.greasespot.net/GM.setValue //On tapermonkey, you can see the info saved by opening the script and clicking storage! var arrayeddata = Array.from(chartags) var formatteddata = JSON.stringify(arrayeddata) GM_setValue(key, formatteddata); //If on the last page of results, show them off~!! if (document.querySelector(".next .disabled") != null) { // for some reason this seems to always be present on the page, even if there is no content in it var flash = document.getElementsByClassName("flash")[0] flash.innerHTML = ""; flash.classList.add("notice") flash.appendChild(document.createTextNode("The following tags were collected: ")); var spacer = "" for (var tag of arrayeddata) { flash.appendChild(document.createTextNode(spacer + "\u000a")) const url_safe_tag = tag.replace("/", "*s*").replace(".", "*d*").replace("#", "*h*").replace("?", "*q*"); const taga = document.createElement("a") taga.href = "/tags/" + url_safe_tag; // fingers crossed taga.target = "_blank" taga.innerText = tag; flash.appendChild(taga); spacer = ", " } } })();