您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Creates QuickStatements for Wikidata items from Wikipedia episode lists
当前为
// ==UserScript== // @name enwiki Episode Generator // @namespace https://gf.qytechs.cn/users/21515 // @version 0.2.0 // @description Creates QuickStatements for Wikidata items from Wikipedia episode lists // @author CennoxX // @contact [email protected] // @homepage https://twitter.com/CennoxX // @match https://en.wikipedia.org/wiki/List_of_* // @match https://en.wikipedia.org/wiki/*(season* // @icon https://www.google.com/s2/favicons?sz=64&domain=wikipedia.org // @grant GM.xmlHttpRequest // @grant GM.setClipboard // @grant GM.registerMenuCommand // @license MIT // ==/UserScript== /* jshint esversion: 8 */ /* eslint quotes: ["warn", "double", "avoid-escape"]*/ (function() { "use strict"; function getDate(episodeDate){ return episodeDate.replace(/{{Start date\|(\d+)\|(\d+)\|(\d+)}}.*/,"$1-$2-$3").replace(/-(\d)\b/g,"-0$1"); } GM.registerMenuCommand("convert episode lists for Wikidata", (async()=>{ console.clear(); var article = document.title.split(" – Wikipedia")[0]; var response = await fetch(`/w/api.php?action=query&prop=revisions&titles=${encodeURIComponent(article)}&rvslots=*&rvprop=content&formatversion=2&format=json`); var data = await response.json(); var articletext = Object.values(data.query.pages)[0].revisions[0].slots.main.content; var seriesTitle = ""; if (article.split("List of ").length==2){ seriesTitle = article.split("List of ")[1].split(" episodes")[0]; }else{ seriesTitle = article.split(" (season")[0]; } response = await fetch(`/w/api.php?action=query&prop=pageprops&ppprop=wikibase_item&redirects=1&titles=${encodeURIComponent(seriesTitle)}&format=json`); data = await response.json(); var seriesId = Object.values(data.query.pages)[0].pageprops.wikibase_item; response = await GM.xmlHttpRequest({ method: "GET", url: `https://www.wikidata.org/w/api.php?action=wbgetentities&props=sitelinks|claims|labels&sitefilter=dewiki&ids=${seriesId}&format=json`, onload: function(response) { return response; } }); var jsonObj = JSON.parse(response.responseText); var series = Object.values(jsonObj.entities)[0].labels.de.value; var seriesEn = Object.values(jsonObj.entities)[0].labels.en.value; var networkId = Object.values(jsonObj.entities)[0].claims.P449[0].mainsnak.datavalue.value.id; var originalLanguageId = Object.values(jsonObj.entities)[0].claims.P364[0].mainsnak.datavalue.value.id; var originalCountryId = Object.values(jsonObj.entities)[0].claims.P495[0].mainsnak.datavalue.value.id; var seasons = Object.values(jsonObj.entities)[0].claims.P527.sort(i => i.qualifiers.P1545[0].datavalue.value).map(i => i.mainsnak.datavalue.value.id); if (location.href.includes("season")){ seasons = Object.values(jsonObj.entities)[0].claims.P527.filter(i => i.qualifiers.P1545[0].datavalue.value==Number(document.title.match(/\(season (\d+)\)/)[1])).map(i => i.mainsnak.datavalue.value.id); } var wikilinks = []; var episodes = articletext.split(/== *Specials *==/)[0].split(/{{Episode list.*\n/).map(i => i.split(/\n}}\n/)[0]).slice(1).map(i => { wikilinks=wikilinks.concat([...i.matchAll(/\[\[(.*?)\]\]/g)].map(i => i[1].split("|")[0])); if (i.match("OriginalAirDate *= *(\.+) *\n")==null){console.log("ERROR: OriginalAirDate\n",i);} if (i.match("DirectedBy *= *(\.+) *\n")==null){console.log("ERROR: DirectedBy\n",i);} if (i.match("WrittenBy *= *(\.+) *\n")==null){console.log("ERROR: WrittenBy\n",i);} return { "NR_GES": (i.match("EpisodeNumber *= *(\\d+) *\n")??["",(console.log("ERROR: EpisodeNumber\n",i),prompt("EpisodeNumber\n"+i.match("EpisodeNumber.*\n")))])[1], "NR_ST": (i.match("EpisodeNumber2 *= *(\\d+) *\n")??["",(console.log("ERROR: EpisodeNumber\n",i),prompt("EpisodeNumber2\n"+i.match("EpisodeNumber2.*\n")))])[1], "OT": (i.match("Title *= *(\.+) *\n")??["",(console.log("ERROR: EpisodeNumber\n",i),prompt("OT\n"+i.match("OT.*\n")))])[1].replace(/<!--.*?-->/i,""), "EA": getDate(i.match("OriginalAirDate *= *(\.+) *\n")[1]), "REG": [...i.match("DirectedBy *= *(\.+) *\n")[1].matchAll(new RegExp(wikilinks.join("|"),"g"))].map(i => i[0]).filter(i => i != ""), "DRB": [...i.match("WrittenBy_?1?2? *= *(\.+) *\n")[1].matchAll(new RegExp(wikilinks.join("|"),"g"))].map(i => i[0]).filter(i => i != "") }; }); var seasonId = 0; var episodeId = 0; var wikipediaLink = location.href.split("#")[0]; var output = ""; episodes.forEach(i => { if (Number(i.NR_ST)<episodeId){ seasonId++; } i.season=seasonId; episodeId=i.NR_ST; }); episodes.forEach(ep=>{ ep.DRBid = []; ep.REGid = []; ep.OTid = ""; ep.DRB.forEach(async(drb)=>{ response = await fetch(`/w/api.php?action=query&prop=pageprops&ppprop=wikibase_item&redirects=1&titles=${encodeURIComponent(drb)}&format=json`); data = await response.json(); if (Object.values(data.query.pages)[0].pageprops != null){ ep.DRBid.push(Object.values(data.query.pages)[0].pageprops.wikibase_item); } }); ep.REG.forEach(async(reg)=>{ response = await fetch(`/w/api.php?action=query&prop=pageprops&ppprop=wikibase_item&redirects=1&titles=${encodeURIComponent(reg)}&format=json`); data = await response.json(); if (Object.values(data.query.pages)[0].pageprops != null){ ep.REGid.push(Object.values(data.query.pages)[0].pageprops.wikibase_item); } }); if (ep.OT.match(/\[\[.*\]\]/)!=null){ var ot = ep.OT; ot = ot.match(/\[\[(.*)\]\]/)[1]; ot = ot.replace(/\|.*/,""); (async()=>{ response = await fetch(`/w/api.php?action=query&prop=pageprops&ppprop=wikibase_item&redirects=1&titles=${encodeURIComponent(ot)}&format=json`); data = await response.json(); if (Object.values(data.query.pages)[0].pageprops != null){ ep.OTid=Object.values(data.query.pages)[0].pageprops.wikibase_item; console.log("item",ep.OTid); } })(); }; }); var stopInterval = setInterval(()=>{ var results = 0; var drbnr = 0; var regnr = 0; var otnr = 0; episodes.forEach(i=> { results+=i.DRBid.length+i.REGid.length+(i.OTid!="")?1:0; }); var requests = 0; episodes.forEach(i=>{ requests+=i.DRB.length+i.REG.length+(i.OT.match(/\[\[.*\]\]/)!=null)?1:0; }); if (requests == 0 || results==requests){ clearInterval(stopInterval); //write CREATE-Statements, get DRB and REG episodes.forEach(ep => { ep.OT=ep.OT.replace(/\[\[/,"").replace(/\]\]/,"").trim(); if (ep.OT.includes("|")){ ep.OT = ep.OT.split(/\|/)[1]; } var epText = `CREATE LAST Len "${ep.OT}" LAST P1476 en:"${ep.OT}" LAST Den "episode of ${seriesEn}" LAST Dde "Folge von ${series}" LAST P31 Q21191270 S143 Q328 S4656 "${wikipediaLink}" LAST P179 ${seriesId} P1545 "${ep.NR_GES}" S143 Q328 S4656 "${wikipediaLink}" LAST P4908 ${seasons[ep.season]} P1545 "${ep.NR_ST}" S143 Q328 S4656 "${wikipediaLink}" LAST P449 ${networkId} S143 Q328 S4656 "${wikipediaLink}" LAST P364 ${originalLanguageId} S143 Q328 S4656 "${wikipediaLink}" LAST P495 ${originalCountryId} S143 Q328 S4656 "${wikipediaLink}" LAST P577 +${ep.EA}T00:00:00Z/11 P291 Q30 S143 Q328 S4656 "${wikipediaLink}" `; ep.REGid.forEach(reg=> { epText += `LAST P57 ${reg} S143 Q328 S4656 "${wikipediaLink}" `;}); ep.DRBid.forEach(drb=> { epText += `LAST P58 ${drb} S143 Q328 S4656 "${wikipediaLink}" `;}); if (ep.OTid!=""){ epText = epText.replace(/(CREATE\n)?LAST/g,ep.OTid); } output += epText; }); console.log(output); GM.setClipboard(output); } },1000); }),"w"); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址