a test

自己紹介

平凡

こんにちは、私は芯です。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.

自作の記事

自作のお気に入り記事

※作成順

すべての自作記事

すべての自作記事
記事名 評価 多言語版記事名 短いリンク
トートロジー 2すこぶる気に入っている https://wkwk.ml/ttly
スマート本 5ひどい https://wkwk.ml/smbk
分かんな~い 6かなりひどい https://wkwk.ml/wkn
ロシア的倒置法 7極悪非道
LINEのユーザー名変更 6かなりひどい https://wkwk.ml/clun
ソーイエバ (宗教) 6かなりひどい https://wkwk.ml/sois
ソーイエバ (感動詞) 5ひどい https://wkwk.ml/soik
非自己叙述的 2すこぶる気に入っている https://wkwk.ml/hijiko
主語がデカい 4よい https://wkwk.ml/sgdk
誤字 4よい https://wkwk.ml/goji
あぶり出し 5ひどい https://wkwk.ml/aburi
レモン汁 4よい https://wkwk.ml/rmjr
暗黙の了解 5ひどい https://wkwk.ml/ryokai
五分前行動 4よい https://wkwk.ml/5mkd
忘却 4よい https://wkwk.ml/f11s
対偶 2すこぶる気に入っている https://wkwk.ml/taigu
一本調子 (文章) 3とてもよい https://wkwk.ml/ipts
現実トロフィー 5ひどい https://wkwk.ml/getr
豚が飛ぶ 3とてもよい https://wkwk.ml/bttb
チェーンソー和歌 2すこぶる気に入っている https://wkwk.ml/waka
連用中止法 2すこぶる気に入っている https://wkwk.ml/ryts
関節疑問文 4よい https://wkwk.ml/gimo
忍者ライター 3とてもよい https://wkwk.ml/ninja
四重長音体語彙 4よい https://wkwk.ml/4tyo
イチモウダ人 4よい https://wkwk.ml/dajin
直訳調 8誓いのスタブであるため評価を定めない
包含ノート 8誓いのスタブであるため評価を定めない
シフォンの犬 8誓いのスタブであるため評価を定めない
法廷 8誓いのスタブであるため評価を定めない
トマト文 4よい https://wkwk.ml/tmtb
関節欺瞞文 4よい https://wkwk.ml/gima
関係の公理 5ひどい https://wkwk.ml/kkk
二零零事件 5ひどい https://wkwk.ml/erling
アンモク共和国 3とてもよい https://wkwk.ml/ah
今、死ぬ? 4よい https://wkwk.ml/imsn
逆読み十行文 4よい

※作成順

※リダイレクトは除く

API リクエスト

麻薬:データのために書いた、Python による API リクエストのソース。誰かが実行しない限りデータが更新されることはないので、最新のデータを享受したいときは勝手に保存して実行してほしい。

「利用者別バイト数データ」
import requests
import time
import datetime
import sys

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)
DATA = R.json()
if DATA["login"]["result"] == "Failed":
    choice = input("\rLogin faild. Still continue with your IP? [y/N]: ").lower()
    if choice in ["yes", "ye", "y"]:
        pass
    elif choice in ["no", "n"]:
        print("Processing has been aborted.")
        sys.exit()

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())

メモ