「利用者:芯/サンドボックス/6」の版間の差分

提供:WikiWiki
ナビゲーションに移動 検索に移動
(ページの作成:「'''利用者:芯/サンドボックス/6'''は、ソースコードを公開するページです。 ==API リクエスト== ===利用者別バイト数データ=== 麻薬:データの第1節に、利用者別に集計された執筆バイト数のデータを表で出力するリクエストです。Python ファイルとして保存し、実行することができます。ただし、153行目と154行目を指示に従って修正する必要があります…」)
(相違点なし)

3年2月20日 (I) 20:04時点における版

利用者:芯/サンドボックス/6は、ソースコードを公開するページです。

API リクエスト

利用者別バイト数データ

麻薬:データの第1節に、利用者別に集計された執筆バイト数のデータを表で出力するリクエストです。Python ファイルとして保存し、実行することができます。ただし、153行目と154行目を指示に従って修正する必要があります。

ソースコード
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本節では、各々の利用者が作成してきた標準記事(リダイレクトを除く)のバイト数について、その代表値を表示する。ソース: [[利用者:芯/サンドボックス/6#利用者別バイト数データ]]\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())