「利用者:芯」の版間の差分
細 (→すべての自作記事) |
編集の要約なし |
||
1行目: | 1行目: | ||
{{#ifeq:{{REVISIONUSER}}|芯||<span style="font-size:7.5vw; font-weight:bold;">私の利用者ページに何をしたのですか、<span style="color:#ff0000">{{REVISIONUSER}}</span>さん?</span>}} | {{#ifeq:{{REVISIONUSER}}|芯||<span style="font-size:7.5vw; font-weight:bold;">私の利用者ページに何をしたのですか、<span style="color:#ff0000">{{REVISIONUSER}}</span>さん?</span>}} | ||
__FORCETOC__ | __FORCETOC__ | ||
==自己紹介== | ==自己紹介== | ||
===平凡=== | ===平凡=== | ||
174行目: | 166行目: | ||
※リダイレクトは除く | ※リダイレクトは除く | ||
== | ==API リクエスト== | ||
=== | [[麻薬:データ]]のために書いた、Python による API リクエストのソース。誰かが実行しない限りデータが更新されることはないので、最新のデータを享受したいときは勝手に保存して実行してほしい。 | ||
{{格納|名前=<span style="font-size: 1.2em; font-weight: bold;">「利用者別バイト数データ」</span>|中身= | |||
<pre> | |||
import requests | |||
import time | |||
import datetime | |||
S = requests.Session() | |||
URL = "https://ja.wikiwiki.li/api.php" | |||
def getLogs(usr=False, action=False, ns=None): | |||
PARAMS = [{ | |||
"action": "query", | |||
"list": "logevents", | |||
"leprop": "title|type|user", | |||
"lelimit": 500, | |||
"format": "json" | |||
}] | |||
if usr: | |||
PARAMS[0]["leuser"] = usr | |||
if action: | |||
PARAMS[0]["leaction"] = action | |||
if ns != None: | |||
PARAMS[0]["lenamespace"] = ns | |||
R = [S.get(url=URL, params=PARAMS[0])] | |||
DATA = [R[0].json()] | |||
output = DATA[0]["query"]["logevents"] | |||
flg = False | |||
if "continue" in DATA[0]: | |||
flg = True | |||
while flg: | |||
PARAMS.append({ | |||
"action": "query", | |||
"list": "logevents", | |||
"lecontinue": DATA[-1]["continue"]["lecontinue"], | |||
"leprop": "title|type|user", | |||
"lelimit": 500, | |||
"format": "json" | |||
}) | |||
if usr: | |||
PARAMS[-1]["leuser"] = usr | |||
if action: | |||
PARAMS[-1]["leaction"] = action | |||
R.append(S.get(url=URL, params=PARAMS[-1])) | |||
DATA.append(R[-1].json()) | |||
output += DATA[-1]["query"]["logevents"] | |||
if "continue" not in DATA[-1]: | |||
flg = False | |||
return output | |||
def isRedir(page): | |||
PARAMS = { | |||
"action": "parse", | |||
"page": page, | |||
"prop": "wikitext", | |||
"format": "json" | |||
} | |||
R = S.get(url=URL, params=PARAMS) | |||
DATA = R.json() | |||
cont = DATA["parse"]["wikitext"]["*"].lower() | |||
if "#転送" in cont or "#redirect" in cont: | |||
return True | |||
else: | |||
return False | |||
def getSize(page): | |||
PARAMS = { | |||
"action": "query", | |||
"prop": "revisions", | |||
"titles": page, | |||
"rvprop": "size", | |||
"format": "json" | |||
} | |||
R = S.get(url=URL, params=PARAMS) | |||
DATA = R.json() | |||
pageid = list(DATA["query"]["pages"])[0] | |||
return DATA["query"]["pages"][pageid]["revisions"][0]["size"] | |||
IPUsers = { | |||
"172.70.223.86": "ひしょう", "60.145.16.169": "芯" | |||
} | |||
=== | createLogs = getLogs(action="create/create",ns=0) | ||
createLogsLen = len(createLogs) | |||
pageDataByUser = {"Yuito": [], "MediaWiki default": [], "キュアラプラプ": [], "せうゆ": [], | |||
"Mapilaplap": [], "芯": [], "Popbob": [], "Notorious": [], "しんたろう": [], "Long谷": [], | |||
"神座麟": [], "ケツアゴコロロ": [], "ひしょう": [], "いせ": [], "デデ二オン": [], | |||
"MagnoliaWoolery": [], "210.151.113.170": [] | |||
} | |||
processed = 0 | |||
for lg in createLogs: | |||
creator = lg["user"] | |||
if creator not in pageDataByUser: | |||
if creator in IPUsers: | |||
creator = IPUsers[creator] | |||
else: | |||
raise Exception("An unknown IP user.") | |||
if not isRedir(lg["title"]): | |||
pageDataByUser[creator].append({"title": lg["title"], "size": getSize(lg["title"])}) | |||
time.sleep(0.5) | |||
processed += 1 | |||
print("\rpageDataByUser: {:.2f}%".format(processed/createLogsLen*100), end="") | |||
byteCnt = {} | |||
for usr, data in pageDataByUser.items(): | |||
byteCnt[usr] = [] | |||
for page in data: | |||
byteCnt[usr].append(page["size"]) | |||
minMaxTtlAvg = {} | |||
for usr, data in byteCnt.items(): | |||
if data: | |||
ttl = sum(data) | |||
avg = round(ttl/len(data),2) | |||
sortedData = sorted(data) | |||
minim, maxim = sortedData[0], sortedData[-1] | |||
minMaxTtlAvg[usr] = [ | |||
"{:,}".format(minim) + "バイト", | |||
"{:,}".format(maxim) + "バイト", | |||
"{:,}".format(ttl) + "バイト", | |||
"{:,}".format(avg) + "バイト" | |||
] | |||
else: | |||
minMaxTtlAvg[usr] = None | |||
wTable = "{| class=\"wikitable sortable\" style=\"text-align: right;" | |||
wTable += "\"\n! 利用者名 !! style=\"width:7em;\" | 最小値 !! style=\"width:7em;\" | 最大値 !! style=\"width:7em;\" | 合計値 !! style=\"width:7em;\" | 平均値" | |||
for usr, data in minMaxTtlAvg.items(): | |||
wTable += "\n|-\n! [[利用者:" + usr + "|" + usr + "]]" | |||
if data: | |||
wTable += "\n| " + data[0] + "\n| " + data[1] + "\n| " + data[2] + "\n| " + data[3] | |||
else: | |||
for i in range(4): | |||
wTable += "\n| style=\"text-align: center;\" | -" | |||
wTable += "\n|}" | |||
now = datetime.datetime.now() | |||
revision = "最終更新日時: " + str(now.year) + "/" + str(now.month) + "/" + str(now.day) + "/" + str(now.hour) + ":" + str(now.minute) + " 頃" | |||
wText = "==利用者別バイト数データ==\n本節では、各々の利用者が作成してきた標準記事(リダイレクトを除く)のバイト数について、その代表値を表示する。\n" | |||
wText += wTable + "\n" + revision | |||
PARAMS_0 = { | |||
"action": "query", | |||
"meta": "tokens", | |||
"type": "login", | |||
"format": "json" | |||
} | |||
R = S.get(url=URL, params=PARAMS_0) | |||
DATA = R.json() | |||
LOGIN_TOKEN = DATA["query"]["tokens"]["logintoken"] | |||
myname = (自分の利用者名を引用符で囲って置換せよ) | |||
mypass = (自分の利用者アカウントのパスワードを引用符で囲って置換せよ) | |||
PARAMS_1 = { | |||
"action": "login", | |||
"lgname": myname, | |||
"lgpassword": mypass, | |||
"lgtoken": LOGIN_TOKEN, | |||
"format": "json" | |||
} | |||
R = S.post(URL, data=PARAMS_1) | |||
PARAMS_2 = { | |||
"action": "query", | |||
"meta": "tokens", | |||
"format": "json" | |||
} | |||
R = S.get(url=URL, params=PARAMS_2) | |||
DATA = R.json() | |||
CSRF_TOKEN = DATA["query"]["tokens"]["csrftoken"] | |||
PARAMS_3 = { | |||
"action": "edit", | |||
"title": "麻薬:データ", | |||
"section": 1, | |||
"text": wText, | |||
"summary": "利用者別バイト数データを更新", | |||
"token": CSRF_TOKEN, | |||
"format": "json" | |||
} | |||
R = S.post(URL, data=PARAMS_3) | |||
print(R.json()) | |||
</pre>}} | |||
==メモ== | ==メモ== |
3年1月27日 (I) 18:23時点における版
自己紹介
平凡
こんにちは、私は芯です。WikiWikiで編集者をやっていますが、月並みな記事ばかり書いていて、最近は「このままでいいのか」なんて思い始めています。最初に作成した記事は「トートロジー」……これ、平凡ですよね(笑)。ですが、これからユーモアに溢れた記事をたくさん作って、皆さんをあっと言わせてやります!
対偶
私が挨拶をしないならばサイコロの表と裏の目の和は11ですし、名前が芯でない方は私ではあり得ません。WikiWikiで編集者をしない人間があったのなら、それは私とは別の人間なのですが、その編集が卓越した何かを持っていて、その行為者たる者はそれに満足しているものと仮定すると、その行為者たる者と私とは一致しないでしょうね。「トートロジー」と異なる記事が私の最初に作成した記事だ、ですって? それが正しいなら、ああ、コラッツ予想はもう証明されたのですね(笑)。とはいえ、皆さんが意表を突かれない限り、私はWikiWiki利用者でない、ということを約束いたしましょう。
本のカバーの「作者紹介」風
芯(しん)
WikiWiki編集者の一人。2020年11月に掌編「トートロジー」でデビュー。特に目立った功績が無いことが悩み。「すごくユーモアのある記事を作ってやる」と意気込み、日夜執筆に励んでいるという。
少女漫画風
あたし、芯! ごく普通のWikiWiki編集者なの。最初につくった記事はトートロジーだよ。 どう、平凡でしょ……? えへへ、でもね、これからユーモアのある記事をたっくさん作っていくのが目標なんだ! 待っててね、読者のみんな!
トキポナ
toki! mi sitelen e lipu pi WikiWiki. mi pilin tan ona. tenpo pini la mi sitelen e lipu ike(ijo sike). mi wile sitelen e lipu pona.
自作の記事
自作のお気に入り記事
※作成順
すべての自作記事
※作成順
※リダイレクトは除く
API リクエスト
麻薬:データのために書いた、Python による API リクエストのソース。誰かが実行しない限りデータが更新されることはないので、最新のデータを享受したいときは勝手に保存して実行してほしい。
「利用者別バイト数データ」 |
import requests import time import datetime S = requests.Session() URL = "https://ja.wikiwiki.li/api.php" def getLogs(usr=False, action=False, ns=None): PARAMS = [{ "action": "query", "list": "logevents", "leprop": "title|type|user", "lelimit": 500, "format": "json" }] if usr: PARAMS[0]["leuser"] = usr if action: PARAMS[0]["leaction"] = action if ns != None: PARAMS[0]["lenamespace"] = ns R = [S.get(url=URL, params=PARAMS[0])] DATA = [R[0].json()] output = DATA[0]["query"]["logevents"] flg = False if "continue" in DATA[0]: flg = True while flg: PARAMS.append({ "action": "query", "list": "logevents", "lecontinue": DATA[-1]["continue"]["lecontinue"], "leprop": "title|type|user", "lelimit": 500, "format": "json" }) if usr: PARAMS[-1]["leuser"] = usr if action: PARAMS[-1]["leaction"] = action R.append(S.get(url=URL, params=PARAMS[-1])) DATA.append(R[-1].json()) output += DATA[-1]["query"]["logevents"] if "continue" not in DATA[-1]: flg = False return output def isRedir(page): PARAMS = { "action": "parse", "page": page, "prop": "wikitext", "format": "json" } R = S.get(url=URL, params=PARAMS) DATA = R.json() cont = DATA["parse"]["wikitext"]["*"].lower() if "#転送" in cont or "#redirect" in cont: return True else: return False def getSize(page): PARAMS = { "action": "query", "prop": "revisions", "titles": page, "rvprop": "size", "format": "json" } R = S.get(url=URL, params=PARAMS) DATA = R.json() pageid = list(DATA["query"]["pages"])[0] return DATA["query"]["pages"][pageid]["revisions"][0]["size"] IPUsers = { "172.70.223.86": "ひしょう", "60.145.16.169": "芯" } createLogs = getLogs(action="create/create",ns=0) createLogsLen = len(createLogs) pageDataByUser = {"Yuito": [], "MediaWiki default": [], "キュアラプラプ": [], "せうゆ": [], "Mapilaplap": [], "芯": [], "Popbob": [], "Notorious": [], "しんたろう": [], "Long谷": [], "神座麟": [], "ケツアゴコロロ": [], "ひしょう": [], "いせ": [], "デデ二オン": [], "MagnoliaWoolery": [], "210.151.113.170": [] } processed = 0 for lg in createLogs: creator = lg["user"] if creator not in pageDataByUser: if creator in IPUsers: creator = IPUsers[creator] else: raise Exception("An unknown IP user.") if not isRedir(lg["title"]): pageDataByUser[creator].append({"title": lg["title"], "size": getSize(lg["title"])}) time.sleep(0.5) processed += 1 print("\rpageDataByUser: {:.2f}%".format(processed/createLogsLen*100), end="") byteCnt = {} for usr, data in pageDataByUser.items(): byteCnt[usr] = [] for page in data: byteCnt[usr].append(page["size"]) minMaxTtlAvg = {} for usr, data in byteCnt.items(): if data: ttl = sum(data) avg = round(ttl/len(data),2) sortedData = sorted(data) minim, maxim = sortedData[0], sortedData[-1] minMaxTtlAvg[usr] = [ "{:,}".format(minim) + "バイト", "{:,}".format(maxim) + "バイト", "{:,}".format(ttl) + "バイト", "{:,}".format(avg) + "バイト" ] else: minMaxTtlAvg[usr] = None wTable = "{| class=\"wikitable sortable\" style=\"text-align: right;" wTable += "\"\n! 利用者名 !! style=\"width:7em;\" | 最小値 !! style=\"width:7em;\" | 最大値 !! style=\"width:7em;\" | 合計値 !! style=\"width:7em;\" | 平均値" for usr, data in minMaxTtlAvg.items(): wTable += "\n|-\n! [[利用者:" + usr + "|" + usr + "]]" if data: wTable += "\n| " + data[0] + "\n| " + data[1] + "\n| " + data[2] + "\n| " + data[3] else: for i in range(4): wTable += "\n| style=\"text-align: center;\" | -" wTable += "\n|}" now = datetime.datetime.now() revision = "最終更新日時: " + str(now.year) + "/" + str(now.month) + "/" + str(now.day) + "/" + str(now.hour) + ":" + str(now.minute) + " 頃" wText = "==利用者別バイト数データ==\n本節では、各々の利用者が作成してきた標準記事(リダイレクトを除く)のバイト数について、その代表値を表示する。\n" wText += wTable + "\n" + revision PARAMS_0 = { "action": "query", "meta": "tokens", "type": "login", "format": "json" } R = S.get(url=URL, params=PARAMS_0) DATA = R.json() LOGIN_TOKEN = DATA["query"]["tokens"]["logintoken"] myname = (自分の利用者名を引用符で囲って置換せよ) mypass = (自分の利用者アカウントのパスワードを引用符で囲って置換せよ) PARAMS_1 = { "action": "login", "lgname": myname, "lgpassword": mypass, "lgtoken": LOGIN_TOKEN, "format": "json" } R = S.post(URL, data=PARAMS_1) PARAMS_2 = { "action": "query", "meta": "tokens", "format": "json" } R = S.get(url=URL, params=PARAMS_2) DATA = R.json() CSRF_TOKEN = DATA["query"]["tokens"]["csrftoken"] PARAMS_3 = { "action": "edit", "title": "麻薬:データ", "section": 1, "text": wText, "summary": "利用者別バイト数データを更新", "token": CSRF_TOKEN, "format": "json" } R = S.post(URL, data=PARAMS_3) print(R.json()) |
メモ
- サンドボックス - 利用者:芯/サンドボックス