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

提供:WikiWiki
ナビゲーションに移動 検索に移動
編集の要約なし
 
(同じ利用者による、間の7版が非表示)
1行目: 1行目:
'''利用者:芯/サンドボックス/6'''は、ソースコードを公開するページです。
'''利用者:芯/サンドボックス/6'''は、ソースコードを公開するページです。


==API リクエスト==
== 利用者別バイト数データ更新リクエスト ==
===利用者別バイト数データ===
[[麻薬:データ#利用者別バイト数データ]]の内容を更新する API リクエストです。全ページのバイト数を利用者別に集計し、代表値を求めてウィキテーブルを作成します。
[[麻薬:データ]]の第1節に、利用者別に集計された執筆バイト数のデータを表で出力するリクエストです。最新のデータを確認したいときは、153 行めと 154 行めを修正し、これを Python ファイルとして実行してください。
{| class="wikitable"
! 形式
| Python ファイル (.py)
|-
! 要件
| [[#Python|Python]] および [[#Requests|Requests]] ライブラリのインストール
|-
! 備考
| 122 行めと 123 行めを適切に修正してください。
|}
{{格納|名前='''ソースコード'''|中身=
{{格納|名前='''ソースコード'''|中身=
<pre>
<pre>
9行目: 18行目:
import time
import time
import datetime
import datetime
import os
import sys
import sys


S = requests.Session()
S = requests.Session()
URL = "https://ja.wikiwiki.li/api.php"
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):
def getSize(page):
     PARAMS = {
     params = {
         "action": "query",
         "action": "query",
         "prop": "revisions",
         "prop": "revisions",
78行目: 33行目:
         "format": "json"
         "format": "json"
     }
     }
     R = S.get(url=URL, params=PARAMS)
     data = S.get(url=URL, params=params).json()
    DATA = R.json()
     return list(data["query"]["pages"].items())[0][1]["revisions"][0]["size"]
     pageid = list(DATA["query"]["pages"])[0]
 
     return DATA["query"]["pages"][pageid]["revisions"][0]["size"]
 
params = {
    "action": "query",
    "list": "logevents",
    "leprop": "title|user|timestamp",
    "leaction": "create/create",
    "lenamespace": 0,
     "lelimit": 500,
    "format": "json"
}
data = S.get(url=URL, params=params).json()
logEvents = data["query"]["logevents"]
while "continue" in data:
    time.sleep(0.5)
    params["lecontinue"] = data["continue"]["lecontinue"]
    data = S.get(url=URL, params=params).json()
    logEvents.append(data["query"]["logevents"])
logEventsLen = len(logEvents)


IPUsers = {
IPUsers = {
     "172.70.223.86": "ひしょう", "60.145.16.169": "芯"
     "172.70.223.86": "ひしょう", "60.145.16.169": "芯"
}
}
 
byteCntArrsByUser = {
createLogs = getLogs(action="create/create", ns=0)
     "Yuito": [],
createLogsLen = len(createLogs)
    "MediaWiki default": [],
pageDataByUser = {
    "キュアラプラプ": [],
     "Yuito": [], "MediaWiki default": [], "キュアラプラプ": [], "せうゆ": [],
    "せうゆ": [],
     "Mapilaplap": [], "芯": [], "Popbob": [], "Notorious": [], "しんたろう": [], "Long谷": [],
     "Mapilaplap": [],
     "神座麟": [], "ケツアゴコロロ": [], "ひしょう": [], "いせ": [], "デデ二オン": [],
    "芯": [],
     "MagnoliaWoolery": [], "210.151.113.170": []
    "Popbob": [],
    "Notorious": [],
    "しんたろう": [],
    "Long谷": [],
     "神座麟": [],
    "ケツアゴコロロ": [],
    "ひしょう": [],
    "いせ": [],
    "デデ二オン": [],
     "MagnoliaWoolery": [],
    "210.151.113.170": []
}
}
processed = 0
processed = 0
for lg in createLogs:
for le in logEvents:
     creator = lg["user"]
     creator = le["user"]
     if creator not in pageDataByUser:
     if creator not in byteCntArrsByUser:
         if creator in IPUsers:
         if creator in IPUsers:
             creator = IPUsers[creator]
             creator = IPUsers[creator]
         else:
         else:
             raise Exception("An unknown IP user.")
             raise Exception("An unknown IP user.")
     if not isRedir(lg["title"]):
     byteCntArrsByUser[creator].append(getSize(le["title"]))
        pageDataByUser[creator].append({"title": lg["title"], "size": getSize(lg["title"])})
    time.sleep(0.5)
        time.sleep(0.5)
     processed += 1
     processed += 1
     print("\rpageDataByUser: {:.2f}%".format(processed/createLogsLen*100), end="")
     print("\rlogEvents to byteCntArrsByUser: {:.2f}%".format(
 
        processed / logEventsLen * 100), end="")
byteCnt = {}
for usr, data in pageDataByUser.items():
    byteCnt[usr] = []
    for page in data:
        byteCnt[usr].append(page["size"])


minMaxTtlAvg = {}
minMaxTtlAvg = {}
for usr, data in byteCnt.items():
for user, data in byteCntArrsByUser.items():
     if data:
     if data:
         ttl = sum(data)
         ttl = sum(data)
         avg = round(ttl/len(data),2)
         avg = round(ttl/len(data), 2)
         sortedData = sorted(data)
         sortedData = sorted(data)
         minim, maxim = sortedData[0], sortedData[-1]
         min, max = sortedData[0], sortedData[-1]
         minMaxTtlAvg[usr] = [
         minMaxTtlAvg[user] = [
             "{:,}".format(minim) + "バイト",
             str(min) + " バイト",
             "{:,}".format(maxim) + "バイト",
             str(max) + " バイト",
             "{:,}".format(ttl) + "バイト",
             str(ttl) + " バイト",
             "{:,}".format(avg) + "バイト"
             str(avg) + " バイト"
         ]
         ]
     else:
     else:
         minMaxTtlAvg[usr] = None
         minMaxTtlAvg[user] = None


wTable = "{| class=\"wikitable sortable\" style=\"text-align: right;"
wTable = "{| class=\"wikitable sortable\" style=\"text-align: right;\"\n! 利用者名 !! style=\"width:7em;\" | 最小値 !! style=\"width:7em;\" | 最大値 !! style=\"width:7em;\" | 合計値 !! style=\"width:7em;\" | 平均値"
wTable += "\"\n! 利用者名 !! style=\"width:7em;\" | 最小値 !! style=\"width:7em;\" | 最大値 !! style=\"width:7em;\" | 合計値 !! style=\"width:7em;\" | 平均値"
for user, data in minMaxTtlAvg.items():
for usr, data in minMaxTtlAvg.items():
     wTable += "\n|-\n! [[利用者:" + user + "|" + user + "]]"
     wTable += "\n|-\n! [[利用者:" + usr + "|" + usr + "]]"
     if data:
     if data:
         wTable += "\n| " + data[0] + "\n| " + data[1] + "\n| " + data[2] + "\n| " + data[3]
         wTable += "\n| " + data[0] + "\n| " + \
            data[1] + "\n| " + data[2] + "\n| " + data[3]
     else:
     else:
         for i in range(4):
         for i in range(4):
143行目: 119行目:


now = datetime.datetime.now()
now = datetime.datetime.now()
revision = "最終更新日時: " + str(now.year) + "/" + str(now.month) + "/" + str(now.day) + "/" + str(now.hour) + ":" + str(now.minute) + " 頃"
revisionNote = "最終更新日時: " + str(now.year) + "/" + str(now.month) + "/" + str(
    now.day) + "/" + str(now.hour) + ":" + str(now.minute) + ":" + str(now.second) + " 頃"


wText = "==利用者別バイト数データ==\n本節では、各々の利用者が作成してきた標準記事(リダイレクトを除く)のバイト数について、その代表値を表示する。ソース: [[利用者:芯/サンドボックス/6#利用者別バイト数データ]]\n"
wText = "==利用者別バイト数データ==\n本節では、各々の利用者が作成してきた標準記事(リダイレクトを除く)のバイト数について、その代表値を表示する。ソース: [[利用者:芯/サンドボックス/6#利用者別バイト数データ]]\n" + \
wText += wTable + "\n" + revision
    wTable + "\n" + revisionNote


PARAMS_0 = {
params = {
     "action": "query",
     "action": "query",
     "meta": "tokens",
     "meta": "tokens",
154行目: 131行目:
     "format": "json"
     "format": "json"
}
}
R = S.get(url=URL, params=PARAMS_0)
LOGIN_TOKEN = S.get(url=URL, params=params).json()[
DATA = R.json()
    "query"]["tokens"]["logintoken"]
LOGIN_TOKEN = DATA["query"]["tokens"]["logintoken"]


myname = (自分の利用者名を表す文字列を入力せよ)
params = {
mypass = (自分の利用者アカウントのパスワードを表す文字列を入力せよ)
PARAMS_1 = {
     "action": "login",
     "action": "login",
     "lgname": myname,
     "lgname": [ここを自分のボット利用者名で置換],
     "lgpassword": mypass,
     "lgpassword": [ここを自分のボットパスワードで置換],
     "lgtoken": LOGIN_TOKEN,
     "lgtoken": LOGIN_TOKEN,
     "format": "json"
     "format": "json"
}
}
R = S.post(URL, data=PARAMS_1)
if S.post(URL, data=params).json()["login"]["result"] == "Failed":
DATA = R.json()
     choice = input(
if DATA["login"]["result"] == "Failed":
        "\rLogin faild. Still continue with your IP? [y/N]: ").lower()
     choice = input("\rLogin faild. Still continue with your IP? [y/N]: ").lower()
     if choice in ["yes", "ye", "y"]:
     if choice in ["yes", "ye", "y"]:
         pass
         pass
     elif choice in ["no", "n"]:
     elif choice in ["no", "n"]:
         print("Processing has been aborted.")
         print("\nProcessing has been aborted.")
         sys.exit()
         sys.exit()


PARAMS_2 = {
params = {
     "action": "query",
     "action": "query",
     "meta": "tokens",
     "meta": "tokens",
     "format": "json"
     "format": "json"
}
}
R = S.get(url=URL, params=PARAMS_2)
CSRF_TOKEN = S.get(url=URL, params=params).json()[
DATA = R.json()
    "query"]["tokens"]["csrftoken"]
CSRF_TOKEN = DATA["query"]["tokens"]["csrftoken"]


PARAMS_3 = {
params = {
     "action": "edit",
     "action": "edit",
     "title": "麻薬:データ",
     "title": "麻薬:データ",
     "section":1,
     "section": 1,
     "text": wText,
     "text": wText,
     "summary": "利用者別バイト数データを更新",
     "summary": "利用者別バイト数データを更新",
    "bot": True,
     "token": CSRF_TOKEN,
     "token": CSRF_TOKEN,
     "format": "json"
     "format": "json"
}
}
R = S.post(URL, data=PARAMS_3)
print("\n" + str(S.post(URL, data=params).json()))
print(R.json())
</pre>}}
</pre>}}
== 公序プレイヤー ==
[[Sisters:WikiWikiリファレンス/公序ソング]]に掲載されている音声ファイル群を VLC media player でランダム再生します。
{| class="wikitable"
! 形式
| Python ファイル (.py)
|-
! 要件
| [[#Python|Python]] および [[#Python-VLC|Python-VLC]] ライブラリのインストール、ならびに [https://www.videolan.org/vlc/ VLC media player] のインストール
|}
{{格納|名前='''ソースコード'''|中身=
<pre>
import time
import random
import rich
import vlc
def playASong(path, length):
    vlcInstance = vlc.Instance()
    media = vlcInstance.media_new(path)
    p = vlcInstance.media_player_new()
    p.set_media(media)
    p.play()
    time.sleep(length + 1)
songsArr = [
    ("白人唾棄之歌", "芯", 33, "transcoded/e/e7/%E7%99%BD%E4%BA%BA%E5%94%BE%E6%A3%84%E4%B9%8B%E6%AD%8C.mp3/%E7%99%BD%E4%BA%BA%E5%94%BE%E6%A3%84%E4%B9%8B%E6%AD%8C.mp3.ogg"),
    ("白人唾棄之歌 (知声版)", "芯", 36, "transcoded/f/f9/%E7%99%BD%E4%BA%BA%E5%94%BE%E6%A3%84%E4%B9%8B%E6%AD%8CBy%E7%9F%A5%E5%A3%B0.mp3/%E7%99%BD%E4%BA%BA%E5%94%BE%E6%A3%84%E4%B9%8B%E6%AD%8CBy%E7%9F%A5%E5%A3%B0.mp3.m4a"),
    ("White Men", "Shin", 33, "transcoded/5/50/White_Men.mp3/White_Men.mp3.ogg"),
    ("ヒップホップ老害貶し", "キュアラプラプ", 29, "transcoded/3/3a/%E3%83%92%E3%83%83%E3%83%97%E3%83%9B%E3%83%83%E3%83%97%E8%80%81%E5%AE%B3%E8%B2%B6%E3%81%97.mp3/%E3%83%92%E3%83%83%E3%83%97%E3%83%9B%E3%83%83%E3%83%97%E8%80%81%E5%AE%B3%E8%B2%B6%E3%81%97.mp3.m4a"),
    ("Homeless", "芯", 9, "transcoded/9/9d/Homeless.mp3/Homeless.mp3.m4a"),
    ("死神の導き", "芯", 57, "transcoded/9/96/%E6%AD%BB%E7%A5%9E%E3%81%AE%E5%B0%8E%E3%81%8D.mp3/%E6%AD%BB%E7%A5%9E%E3%81%AE%E5%B0%8E%E3%81%8D.mp3.ogg"),
    ("死神の導き (知声版)", "芯", 60, "transcoded/2/2d/%E6%AD%BB%E7%A5%9E%E3%81%AE%E5%B0%8E%E3%81%8DBy%E7%9F%A5%E5%A3%B0.mp3/%E6%AD%BB%E7%A5%9E%E3%81%AE%E5%B0%8E%E3%81%8DBy%E7%9F%A5%E5%A3%B0.mp3.m4a"),
    ("障害者に捧げるエチュード", "Notorious", 61, "transcoded/e/ec/%E9%9A%9C%E5%AE%B3%E8%80%85%E3%81%AB%E6%8D%A7%E3%81%92%E3%82%8B%E3%82%A8%E3%83%81%E3%83%A5%E3%83%BC%E3%83%89.mp3/%E9%9A%9C%E5%AE%B3%E8%80%85%E3%81%AB%E6%8D%A7%E3%81%92%E3%82%8B%E3%82%A8%E3%83%81%E3%83%A5%E3%83%BC%E3%83%89.mp3.ogg"),
    ("ハミング・ザ・アメ公序", "キュアラプラプ", 108, "transcoded/0/01/%E3%83%8F%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%B6%E3%83%BB%E3%82%A2%E3%83%A1%E5%85%AC%E5%BA%8F.mp3/%E3%83%8F%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%B6%E3%83%BB%E3%82%A2%E3%83%A1%E5%85%AC%E5%BA%8F.mp3.ogg"),
    ("白昼のクレイジィ", "キュアラプラプ", 27, "transcoded/f/f3/%E7%99%BD%E6%98%BC%E3%81%AE%E3%82%AF%E3%83%AC%E3%82%A4%E3%82%B8%E3%82%A3.mp3/%E7%99%BD%E6%98%BC%E3%81%AE%E3%82%AF%E3%83%AC%E3%82%A4%E3%82%B8%E3%82%A3.mp3.m4a"),
    ("フラッシュバックナイトメアー", "キュアラプラプ", 56, "transcoded/3/31/%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%83%90%E3%83%83%E3%82%AF%E3%83%8A%E3%82%A4%E3%83%88%E3%83%A1%E3%82%A2%E3%83%BC.mp3/%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%83%90%E3%83%83%E3%82%AF%E3%83%8A%E3%82%A4%E3%83%88%E3%83%A1%E3%82%A2%E3%83%BC.mp3.m4a"),
    ("FOOL JAPAN", "キュアラプラプ", 142, "transcoded/a/a3/FOOL_JAPAN.mp3/FOOL_JAPAN.mp3.m4a"),
    ("MidNight&FatWhite", "キュアラプラプ", 135, "transcoded/a/ab/MidNight%26FatWhite.mp3/MidNight%26FatWhite.mp3.m4a"),
    ("ジェンダー讃歌", "Notorious", 85, "transcoded/d/d8/%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%80%E3%83%BC%E8%AE%83%E6%AD%8C.mp3/%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%80%E3%83%BC%E8%AE%83%E6%AD%8C.mp3.m4a"),
    ("ばいばい", "キュアラプラプ", 211, "transcoded/9/98/%E3%81%B0%E3%81%84%E3%81%B0%E3%81%84.mp3/%E3%81%B0%E3%81%84%E3%81%B0%E3%81%84.mp3.m4a"),
    ("小売店民謡", "ケツアゴコロロ", 12, "4/45/%E5%B0%8F%E5%A3%B2%E5%BA%97%E6%B0%91%E8%AC%A1.mp3"),
    ("或る女が死ぬ間際に聞いた.mp3", "利用者:ケツアゴコロロ", 44, "transcoded/e/e9/%E6%88%96%E3%82%8B%E5%A5%B3%E3%81%8C%E6%AD%BB%E3%81%AC%E9%96%93%E9%9A%9B%E3%81%AB%E8%81%9E%E3%81%84%E3%81%9F.mp3.mp3/%E6%88%96%E3%82%8B%E5%A5%B3%E3%81%8C%E6%AD%BB%E3%81%AC%E9%96%93%E9%9A%9B%E3%81%AB%E8%81%9E%E3%81%84%E3%81%9F.mp3.mp3.ogg"),
    ("Y-Genocide", "キュアラプラプ", 106, "transcoded/b/b6/Y-Genocide.mp3/Y-Genocide.mp3.m4a"),
    ("ロートモーダ=オーレ", "キュアラプラプ", 74, "transcoded/2/2b/%E3%83%AD%E3%83%BC%E3%83%88%E3%83%A2%E3%83%BC%E3%83%80%3D%E3%82%AA%E3%83%BC%E3%83%AC.mp3/%E3%83%AD%E3%83%BC%E3%83%88%E3%83%A2%E3%83%BC%E3%83%80%3D%E3%82%AA%E3%83%BC%E3%83%AC.mp3.m4a"),
    ("グッドナイト", "キュアラプラプ", 108, "transcoded/1/17/%E3%82%B0%E3%83%83%E3%83%89%E3%83%8A%E3%82%A4%E3%83%88.mp3/%E3%82%B0%E3%83%83%E3%83%89%E3%83%8A%E3%82%A4%E3%83%88.mp3.m4a"),
    ("Wi-Fiエレジー", "Notorious", 72, "transcoded/2/2a/Wi-Fi%E3%82%A8%E3%83%AC%E3%82%B8%E3%83%BC.mp3/Wi-Fi%E3%82%A8%E3%83%AC%E3%82%B8%E3%83%BC.mp3.ogg"),
    ("ワンオペ・ファイヤー", "芯", 25, "transcoded/6/64/%E3%83%AF%E3%83%B3%E3%82%AA%E3%83%9A%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%A4%E3%83%BC.mp3/%E3%83%AF%E3%83%B3%E3%82%AA%E3%83%9A%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%A4%E3%83%BC.mp3.m4a"),
    ("栃木県・40代・無職", "芯", 9, "transcoded/a/ac/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E4%BB%A3%E3%83%BB%E7%84%A1%E8%81%B7.mp3/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E4%BB%A3%E3%83%BB%E7%84%A1%E8%81%B7.mp3.ogg"),
    ("栃木県・40代・無職 (知声版)", "芯", 12, "transcoded/c/c4/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E4%BB%A3%E3%83%BB%E7%84%A1%E8%81%B7By%E7%9F%A5%E5%A3%B0.mp3/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E4%BB%A3%E3%83%BB%E7%84%A1%E8%81%B7By%E7%9F%A5%E5%A3%B0.mp3.m4a"),
    ("ワンクリックボーイ", "キュアラプラプ", 175, "transcoded/a/a7/%E3%83%AF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%82%A4.mp3/%E3%83%AF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%82%A4.mp3.m4a"),
    ("アンサー:近頃の若えモンは", "キュアラプラプ", 80, "transcoded/b/b9/%E3%82%A2%E3%83%B3%E3%82%B5%E3%83%BC%EF%BC%9A%E8%BF%91%E9%A0%83%E3%81%AE%E8%8B%A5%E3%81%88%E3%83%A2%E3%83%B3%E3%81%AF.mp3/%E3%82%A2%E3%83%B3%E3%82%B5%E3%83%BC%EF%BC%9A%E8%BF%91%E9%A0%83%E3%81%AE%E8%8B%A5%E3%81%88%E3%83%A2%E3%83%B3%E3%81%AF.mp3.m4a"),
    ("大人なのに書けん", "芯", 74, "transcoded/c/c8/%E5%A4%A7%E4%BA%BA%E3%81%AA%E3%81%AE%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%93.mp3/%E5%A4%A7%E4%BA%BA%E3%81%AA%E3%81%AE%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%93.mp3.ogg"),
    ("大人なのに書けん (知声版)", "芯", 77, "transcoded/6/68/%E5%A4%A7%E4%BA%BA%E3%81%AA%E3%81%AE%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%93By%E7%9F%A5%E5%A3%B0.mp3/%E5%A4%A7%E4%BA%BA%E3%81%AA%E3%81%AE%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%93By%E7%9F%A5%E5%A3%B0.mp3.ogg"),
    ("部落サンタ", "キュアラプラプ", 97, "transcoded/4/40/%E9%83%A8%E8%90%BD%E3%82%B5%E3%83%B3%E3%82%BF.mp3/%E9%83%A8%E8%90%BD%E3%82%B5%E3%83%B3%E3%82%BF.mp3.ogg"),
    ("介護医療院の実習生", "芯", 70, "transcoded/d/d4/%E4%BB%8B%E8%AD%B7%E5%8C%BB%E7%99%82%E9%99%A2%E3%81%AE%E5%AE%9F%E7%BF%92%E7%94%9F.mp3/%E4%BB%8B%E8%AD%B7%E5%8C%BB%E7%99%82%E9%99%A2%E3%81%AE%E5%AE%9F%E7%BF%92%E7%94%9F.mp3.ogg"),
    ("5Gがやってくる", "キュアラプラプ", 219, "transcoded/a/a7/5G%E3%81%8C%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B.mp3/5G%E3%81%8C%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B.mp3.ogg"),
    ("労働哀歌", "芯", 126, "transcoded/8/87/%E5%8A%B4%E5%83%8D%E5%93%80%E6%AD%8C.mp3/%E5%8A%B4%E5%83%8D%E5%93%80%E6%AD%8C.mp3.ogg"),
    ("労働哀歌 (知声版)", "芯", 127, "transcoded/a/ab/%E5%8A%B4%E5%83%8D%E5%93%80%E6%AD%8CBy%E7%9F%A5%E5%A3%B0.mp3/%E5%8A%B4%E5%83%8D%E5%93%80%E6%AD%8CBy%E7%9F%A5%E5%A3%B0.mp3.ogg"),
    ("ふるさと", "芯", 245, "transcoded/7/72/%E3%81%B5%E3%82%8B%E3%81%95%E3%81%A8.mp3/%E3%81%B5%E3%82%8B%E3%81%95%E3%81%A8.mp3.ogg"),
    ("ふるさと (知声版)", "芯", 242, "transcoded/b/ba/%E3%81%B5%E3%82%8B%E3%81%95%E3%81%A8By%E7%9F%A5%E5%A3%B0.mp3/%E3%81%B5%E3%82%8B%E3%81%95%E3%81%A8By%E7%9F%A5%E5%A3%B0.mp3.ogg"),
    ("White House Remix", "キュアラプラプ", 233, "d/dd/White_House_Remix.mp3"),
    ("かよわきハニー", "芯", 82, "transcoded/7/77/%E3%81%8B%E3%82%88%E3%82%8F%E3%81%8D%E3%83%8F%E3%83%8B%E3%83%BC.mp3/%E3%81%8B%E3%82%88%E3%82%8F%E3%81%8D%E3%83%8F%E3%83%8B%E3%83%BC.mp3.ogg"),
    ("かよわきハニー (知声版)", "芯", 82, "transcoded/3/36/%E3%81%8B%E3%82%88%E3%82%8F%E3%81%8D%E3%83%8F%E3%83%8B%E3%83%BCBy%E7%9F%A5%E5%A3%B0.mp3/%E3%81%8B%E3%82%88%E3%82%8F%E3%81%8D%E3%83%8F%E3%83%8B%E3%83%BCBy%E7%9F%A5%E5%A3%B0.mp3.ogg"),
    ("栃木県・40名・死傷", "キュアラプラプ", 150, "transcoded/8/8a/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E5%90%8D%E3%83%BB%E6%AD%BB%E5%82%B7.mp3/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E5%90%8D%E3%83%BB%E6%AD%BB%E5%82%B7.mp3.m4a"),
    ("He Died So Young", "Shin", 109, "transcoded/1/14/He_Died_So_Young.mp3/He_Died_So_Young.mp3.ogg"),
    ("栃木県・50代・カメラマン", "芯", 26, "transcoded/f/f5/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB50%E4%BB%A3%E3%83%BB%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%9E%E3%83%B3.mp3/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB50%E4%BB%A3%E3%83%BB%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%9E%E3%83%B3.mp3.ogg"),
    ("栃木県・50代・カメラマン (知声版)", "芯", 26, "9/95/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB50%E4%BB%A3%E3%83%BB%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%9E%E3%83%B3By%E7%9F%A5%E5%A3%B0.mp3")
]
while True:
    trgtSong = random.choice(songsArr)
    rich.print("\r[bright_cyan]" + trgtSong[0] + "[/bright_cyan]" + " [white]--[/white] " + "[bright_green]" + trgtSong[1] + "[/bright_green]", end="")
    playASong("https://ja.wikiwiki.li/images/" + trgtSong[3], trgtSong[2])
</pre>}}
== 覚え書き ==
=== インストールについて ===
==== Python ====
[https://www.python.org/downloads/ 公式のダウンロード・ページ]にアクセスし、'''"Download Python"''' とあるボタンをクリックしてください。ダウンロードされたファイルを開くとインストーラーが起動するので、その指示に従うことでインストールを完了できます。
===== 各種ライブラリ =====
Python の各種ライブラリは、[[#Python|Python]] 本体を OS にインストールしたのちに、それぞれ以下の操作を行うことでインストールできます。
*<span id="Requests">'''Requests'''</span> - コマンドプロンプトで <code>pip install requests</code> を実行する
*<span id="Python-VLC">'''Python-VLC'''</span> - コマンドプロンプトで <code>pip install python-vlc</code> を実行する

3年8月1日 (I) 13:45時点における最新版

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

利用者別バイト数データ更新リクエスト[編集 | ソースを編集]

麻薬:データ#利用者別バイト数データの内容を更新する API リクエストです。全ページのバイト数を利用者別に集計し、代表値を求めてウィキテーブルを作成します。

形式 Python ファイル (.py)
要件 Python および Requests ライブラリのインストール
備考 122 行めと 123 行めを適切に修正してください。
ソースコード
import requests
import time
import datetime
import os
import sys

S = requests.Session()
URL = "https://ja.wikiwiki.li/api.php"


def getSize(page):
    params = {
        "action": "query",
        "prop": "revisions",
        "titles": page,
        "rvprop": "size",
        "format": "json"
    }
    data = S.get(url=URL, params=params).json()
    return list(data["query"]["pages"].items())[0][1]["revisions"][0]["size"]


params = {
    "action": "query",
    "list": "logevents",
    "leprop": "title|user|timestamp",
    "leaction": "create/create",
    "lenamespace": 0,
    "lelimit": 500,
    "format": "json"
}
data = S.get(url=URL, params=params).json()
logEvents = data["query"]["logevents"]
while "continue" in data:
    time.sleep(0.5)
    params["lecontinue"] = data["continue"]["lecontinue"]
    data = S.get(url=URL, params=params).json()
    logEvents.append(data["query"]["logevents"])
logEventsLen = len(logEvents)

IPUsers = {
    "172.70.223.86": "ひしょう", "60.145.16.169": "芯"
}
byteCntArrsByUser = {
    "Yuito": [],
    "MediaWiki default": [],
    "キュアラプラプ": [],
    "せうゆ": [],
    "Mapilaplap": [],
    "芯": [],
    "Popbob": [],
    "Notorious": [],
    "しんたろう": [],
    "Long谷": [],
    "神座麟": [],
    "ケツアゴコロロ": [],
    "ひしょう": [],
    "いせ": [],
    "デデ二オン": [],
    "MagnoliaWoolery": [],
    "210.151.113.170": []
}
processed = 0
for le in logEvents:
    creator = le["user"]
    if creator not in byteCntArrsByUser:
        if creator in IPUsers:
            creator = IPUsers[creator]
        else:
            raise Exception("An unknown IP user.")
    byteCntArrsByUser[creator].append(getSize(le["title"]))
    time.sleep(0.5)
    processed += 1
    print("\rlogEvents to byteCntArrsByUser: {:.2f}%".format(
        processed / logEventsLen * 100), end="")

minMaxTtlAvg = {}
for user, data in byteCntArrsByUser.items():
    if data:
        ttl = sum(data)
        avg = round(ttl/len(data), 2)
        sortedData = sorted(data)
        min, max = sortedData[0], sortedData[-1]
        minMaxTtlAvg[user] = [
            str(min) + " バイト",
            str(max) + " バイト",
            str(ttl) + " バイト",
            str(avg) + " バイト"
        ]
    else:
        minMaxTtlAvg[user] = None

wTable = "{| class=\"wikitable sortable\" style=\"text-align: right;\"\n! 利用者名 !! style=\"width:7em;\" | 最小値 !! style=\"width:7em;\" | 最大値 !! style=\"width:7em;\" | 合計値 !! style=\"width:7em;\" | 平均値"
for user, data in minMaxTtlAvg.items():
    wTable += "\n|-\n! [[利用者:" + user + "|" + user + "]]"
    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()
revisionNote = "最終更新日時: " + str(now.year) + "/" + str(now.month) + "/" + str(
    now.day) + "/" + str(now.hour) + ":" + str(now.minute) + ":" + str(now.second) + " 頃"

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

params = {
    "action": "query",
    "meta": "tokens",
    "type": "login",
    "format": "json"
}
LOGIN_TOKEN = S.get(url=URL, params=params).json()[
    "query"]["tokens"]["logintoken"]

params = {
    "action": "login",
    "lgname": [ここを自分のボット利用者名で置換],
    "lgpassword": [ここを自分のボットパスワードで置換],
    "lgtoken": LOGIN_TOKEN,
    "format": "json"
}
if S.post(URL, data=params).json()["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("\nProcessing has been aborted.")
        sys.exit()

params = {
    "action": "query",
    "meta": "tokens",
    "format": "json"
}
CSRF_TOKEN = S.get(url=URL, params=params).json()[
    "query"]["tokens"]["csrftoken"]

params = {
    "action": "edit",
    "title": "麻薬:データ",
    "section": 1,
    "text": wText,
    "summary": "利用者別バイト数データを更新",
    "bot": True,
    "token": CSRF_TOKEN,
    "format": "json"
}
print("\n" + str(S.post(URL, data=params).json()))

公序プレイヤー[編集 | ソースを編集]

Sisters:WikiWikiリファレンス/公序ソングに掲載されている音声ファイル群を VLC media player でランダム再生します。

形式 Python ファイル (.py)
要件 Python および Python-VLC ライブラリのインストール、ならびに VLC media player のインストール
ソースコード
import time
import random
import rich
import vlc

def playASong(path, length):
    vlcInstance = vlc.Instance()
    media = vlcInstance.media_new(path)
    p = vlcInstance.media_player_new()
    p.set_media(media)
    p.play()
    time.sleep(length + 1)

songsArr = [
    ("白人唾棄之歌", "芯", 33, "transcoded/e/e7/%E7%99%BD%E4%BA%BA%E5%94%BE%E6%A3%84%E4%B9%8B%E6%AD%8C.mp3/%E7%99%BD%E4%BA%BA%E5%94%BE%E6%A3%84%E4%B9%8B%E6%AD%8C.mp3.ogg"),
    ("白人唾棄之歌 (知声版)", "芯", 36, "transcoded/f/f9/%E7%99%BD%E4%BA%BA%E5%94%BE%E6%A3%84%E4%B9%8B%E6%AD%8CBy%E7%9F%A5%E5%A3%B0.mp3/%E7%99%BD%E4%BA%BA%E5%94%BE%E6%A3%84%E4%B9%8B%E6%AD%8CBy%E7%9F%A5%E5%A3%B0.mp3.m4a"),
    ("White Men", "Shin", 33, "transcoded/5/50/White_Men.mp3/White_Men.mp3.ogg"),
    ("ヒップホップ老害貶し", "キュアラプラプ", 29, "transcoded/3/3a/%E3%83%92%E3%83%83%E3%83%97%E3%83%9B%E3%83%83%E3%83%97%E8%80%81%E5%AE%B3%E8%B2%B6%E3%81%97.mp3/%E3%83%92%E3%83%83%E3%83%97%E3%83%9B%E3%83%83%E3%83%97%E8%80%81%E5%AE%B3%E8%B2%B6%E3%81%97.mp3.m4a"),
    ("Homeless", "芯", 9, "transcoded/9/9d/Homeless.mp3/Homeless.mp3.m4a"),
    ("死神の導き", "芯", 57, "transcoded/9/96/%E6%AD%BB%E7%A5%9E%E3%81%AE%E5%B0%8E%E3%81%8D.mp3/%E6%AD%BB%E7%A5%9E%E3%81%AE%E5%B0%8E%E3%81%8D.mp3.ogg"),
    ("死神の導き (知声版)", "芯", 60, "transcoded/2/2d/%E6%AD%BB%E7%A5%9E%E3%81%AE%E5%B0%8E%E3%81%8DBy%E7%9F%A5%E5%A3%B0.mp3/%E6%AD%BB%E7%A5%9E%E3%81%AE%E5%B0%8E%E3%81%8DBy%E7%9F%A5%E5%A3%B0.mp3.m4a"),
    ("障害者に捧げるエチュード", "Notorious", 61, "transcoded/e/ec/%E9%9A%9C%E5%AE%B3%E8%80%85%E3%81%AB%E6%8D%A7%E3%81%92%E3%82%8B%E3%82%A8%E3%83%81%E3%83%A5%E3%83%BC%E3%83%89.mp3/%E9%9A%9C%E5%AE%B3%E8%80%85%E3%81%AB%E6%8D%A7%E3%81%92%E3%82%8B%E3%82%A8%E3%83%81%E3%83%A5%E3%83%BC%E3%83%89.mp3.ogg"),
    ("ハミング・ザ・アメ公序", "キュアラプラプ", 108, "transcoded/0/01/%E3%83%8F%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%B6%E3%83%BB%E3%82%A2%E3%83%A1%E5%85%AC%E5%BA%8F.mp3/%E3%83%8F%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%B6%E3%83%BB%E3%82%A2%E3%83%A1%E5%85%AC%E5%BA%8F.mp3.ogg"),
    ("白昼のクレイジィ", "キュアラプラプ", 27, "transcoded/f/f3/%E7%99%BD%E6%98%BC%E3%81%AE%E3%82%AF%E3%83%AC%E3%82%A4%E3%82%B8%E3%82%A3.mp3/%E7%99%BD%E6%98%BC%E3%81%AE%E3%82%AF%E3%83%AC%E3%82%A4%E3%82%B8%E3%82%A3.mp3.m4a"),
    ("フラッシュバックナイトメアー", "キュアラプラプ", 56, "transcoded/3/31/%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%83%90%E3%83%83%E3%82%AF%E3%83%8A%E3%82%A4%E3%83%88%E3%83%A1%E3%82%A2%E3%83%BC.mp3/%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%83%90%E3%83%83%E3%82%AF%E3%83%8A%E3%82%A4%E3%83%88%E3%83%A1%E3%82%A2%E3%83%BC.mp3.m4a"),
    ("FOOL JAPAN", "キュアラプラプ", 142, "transcoded/a/a3/FOOL_JAPAN.mp3/FOOL_JAPAN.mp3.m4a"),
    ("MidNight&FatWhite", "キュアラプラプ", 135, "transcoded/a/ab/MidNight%26FatWhite.mp3/MidNight%26FatWhite.mp3.m4a"),
    ("ジェンダー讃歌", "Notorious", 85, "transcoded/d/d8/%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%80%E3%83%BC%E8%AE%83%E6%AD%8C.mp3/%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%80%E3%83%BC%E8%AE%83%E6%AD%8C.mp3.m4a"),
    ("ばいばい", "キュアラプラプ", 211, "transcoded/9/98/%E3%81%B0%E3%81%84%E3%81%B0%E3%81%84.mp3/%E3%81%B0%E3%81%84%E3%81%B0%E3%81%84.mp3.m4a"),
    ("小売店民謡", "ケツアゴコロロ", 12, "4/45/%E5%B0%8F%E5%A3%B2%E5%BA%97%E6%B0%91%E8%AC%A1.mp3"),
    ("或る女が死ぬ間際に聞いた.mp3", "利用者:ケツアゴコロロ", 44, "transcoded/e/e9/%E6%88%96%E3%82%8B%E5%A5%B3%E3%81%8C%E6%AD%BB%E3%81%AC%E9%96%93%E9%9A%9B%E3%81%AB%E8%81%9E%E3%81%84%E3%81%9F.mp3.mp3/%E6%88%96%E3%82%8B%E5%A5%B3%E3%81%8C%E6%AD%BB%E3%81%AC%E9%96%93%E9%9A%9B%E3%81%AB%E8%81%9E%E3%81%84%E3%81%9F.mp3.mp3.ogg"),
    ("Y-Genocide", "キュアラプラプ", 106, "transcoded/b/b6/Y-Genocide.mp3/Y-Genocide.mp3.m4a"),
    ("ロートモーダ=オーレ", "キュアラプラプ", 74, "transcoded/2/2b/%E3%83%AD%E3%83%BC%E3%83%88%E3%83%A2%E3%83%BC%E3%83%80%3D%E3%82%AA%E3%83%BC%E3%83%AC.mp3/%E3%83%AD%E3%83%BC%E3%83%88%E3%83%A2%E3%83%BC%E3%83%80%3D%E3%82%AA%E3%83%BC%E3%83%AC.mp3.m4a"),
    ("グッドナイト", "キュアラプラプ", 108, "transcoded/1/17/%E3%82%B0%E3%83%83%E3%83%89%E3%83%8A%E3%82%A4%E3%83%88.mp3/%E3%82%B0%E3%83%83%E3%83%89%E3%83%8A%E3%82%A4%E3%83%88.mp3.m4a"),
    ("Wi-Fiエレジー", "Notorious", 72, "transcoded/2/2a/Wi-Fi%E3%82%A8%E3%83%AC%E3%82%B8%E3%83%BC.mp3/Wi-Fi%E3%82%A8%E3%83%AC%E3%82%B8%E3%83%BC.mp3.ogg"),
    ("ワンオペ・ファイヤー", "芯", 25, "transcoded/6/64/%E3%83%AF%E3%83%B3%E3%82%AA%E3%83%9A%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%A4%E3%83%BC.mp3/%E3%83%AF%E3%83%B3%E3%82%AA%E3%83%9A%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%A4%E3%83%BC.mp3.m4a"),
    ("栃木県・40代・無職", "芯", 9, "transcoded/a/ac/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E4%BB%A3%E3%83%BB%E7%84%A1%E8%81%B7.mp3/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E4%BB%A3%E3%83%BB%E7%84%A1%E8%81%B7.mp3.ogg"),
    ("栃木県・40代・無職 (知声版)", "芯", 12, "transcoded/c/c4/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E4%BB%A3%E3%83%BB%E7%84%A1%E8%81%B7By%E7%9F%A5%E5%A3%B0.mp3/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E4%BB%A3%E3%83%BB%E7%84%A1%E8%81%B7By%E7%9F%A5%E5%A3%B0.mp3.m4a"),
    ("ワンクリックボーイ", "キュアラプラプ", 175, "transcoded/a/a7/%E3%83%AF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%82%A4.mp3/%E3%83%AF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%82%A4.mp3.m4a"),
    ("アンサー:近頃の若えモンは", "キュアラプラプ", 80, "transcoded/b/b9/%E3%82%A2%E3%83%B3%E3%82%B5%E3%83%BC%EF%BC%9A%E8%BF%91%E9%A0%83%E3%81%AE%E8%8B%A5%E3%81%88%E3%83%A2%E3%83%B3%E3%81%AF.mp3/%E3%82%A2%E3%83%B3%E3%82%B5%E3%83%BC%EF%BC%9A%E8%BF%91%E9%A0%83%E3%81%AE%E8%8B%A5%E3%81%88%E3%83%A2%E3%83%B3%E3%81%AF.mp3.m4a"),
    ("大人なのに書けん", "芯", 74, "transcoded/c/c8/%E5%A4%A7%E4%BA%BA%E3%81%AA%E3%81%AE%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%93.mp3/%E5%A4%A7%E4%BA%BA%E3%81%AA%E3%81%AE%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%93.mp3.ogg"),
    ("大人なのに書けん (知声版)", "芯", 77, "transcoded/6/68/%E5%A4%A7%E4%BA%BA%E3%81%AA%E3%81%AE%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%93By%E7%9F%A5%E5%A3%B0.mp3/%E5%A4%A7%E4%BA%BA%E3%81%AA%E3%81%AE%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%93By%E7%9F%A5%E5%A3%B0.mp3.ogg"),
    ("部落サンタ", "キュアラプラプ", 97, "transcoded/4/40/%E9%83%A8%E8%90%BD%E3%82%B5%E3%83%B3%E3%82%BF.mp3/%E9%83%A8%E8%90%BD%E3%82%B5%E3%83%B3%E3%82%BF.mp3.ogg"),
    ("介護医療院の実習生", "芯", 70, "transcoded/d/d4/%E4%BB%8B%E8%AD%B7%E5%8C%BB%E7%99%82%E9%99%A2%E3%81%AE%E5%AE%9F%E7%BF%92%E7%94%9F.mp3/%E4%BB%8B%E8%AD%B7%E5%8C%BB%E7%99%82%E9%99%A2%E3%81%AE%E5%AE%9F%E7%BF%92%E7%94%9F.mp3.ogg"),
    ("5Gがやってくる", "キュアラプラプ", 219, "transcoded/a/a7/5G%E3%81%8C%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B.mp3/5G%E3%81%8C%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B.mp3.ogg"),
    ("労働哀歌", "芯", 126, "transcoded/8/87/%E5%8A%B4%E5%83%8D%E5%93%80%E6%AD%8C.mp3/%E5%8A%B4%E5%83%8D%E5%93%80%E6%AD%8C.mp3.ogg"),
    ("労働哀歌 (知声版)", "芯", 127, "transcoded/a/ab/%E5%8A%B4%E5%83%8D%E5%93%80%E6%AD%8CBy%E7%9F%A5%E5%A3%B0.mp3/%E5%8A%B4%E5%83%8D%E5%93%80%E6%AD%8CBy%E7%9F%A5%E5%A3%B0.mp3.ogg"),
    ("ふるさと", "芯", 245, "transcoded/7/72/%E3%81%B5%E3%82%8B%E3%81%95%E3%81%A8.mp3/%E3%81%B5%E3%82%8B%E3%81%95%E3%81%A8.mp3.ogg"),
    ("ふるさと (知声版)", "芯", 242, "transcoded/b/ba/%E3%81%B5%E3%82%8B%E3%81%95%E3%81%A8By%E7%9F%A5%E5%A3%B0.mp3/%E3%81%B5%E3%82%8B%E3%81%95%E3%81%A8By%E7%9F%A5%E5%A3%B0.mp3.ogg"),
    ("White House Remix", "キュアラプラプ", 233, "d/dd/White_House_Remix.mp3"),
    ("かよわきハニー", "芯", 82, "transcoded/7/77/%E3%81%8B%E3%82%88%E3%82%8F%E3%81%8D%E3%83%8F%E3%83%8B%E3%83%BC.mp3/%E3%81%8B%E3%82%88%E3%82%8F%E3%81%8D%E3%83%8F%E3%83%8B%E3%83%BC.mp3.ogg"),
    ("かよわきハニー (知声版)", "芯", 82, "transcoded/3/36/%E3%81%8B%E3%82%88%E3%82%8F%E3%81%8D%E3%83%8F%E3%83%8B%E3%83%BCBy%E7%9F%A5%E5%A3%B0.mp3/%E3%81%8B%E3%82%88%E3%82%8F%E3%81%8D%E3%83%8F%E3%83%8B%E3%83%BCBy%E7%9F%A5%E5%A3%B0.mp3.ogg"),
    ("栃木県・40名・死傷", "キュアラプラプ", 150, "transcoded/8/8a/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E5%90%8D%E3%83%BB%E6%AD%BB%E5%82%B7.mp3/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB40%E5%90%8D%E3%83%BB%E6%AD%BB%E5%82%B7.mp3.m4a"),
    ("He Died So Young", "Shin", 109, "transcoded/1/14/He_Died_So_Young.mp3/He_Died_So_Young.mp3.ogg"),
    ("栃木県・50代・カメラマン", "芯", 26, "transcoded/f/f5/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB50%E4%BB%A3%E3%83%BB%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%9E%E3%83%B3.mp3/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB50%E4%BB%A3%E3%83%BB%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%9E%E3%83%B3.mp3.ogg"),
    ("栃木県・50代・カメラマン (知声版)", "芯", 26, "9/95/%E6%A0%83%E6%9C%A8%E7%9C%8C%E3%83%BB50%E4%BB%A3%E3%83%BB%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%9E%E3%83%B3By%E7%9F%A5%E5%A3%B0.mp3")
]

while True:
    trgtSong = random.choice(songsArr)
    rich.print("\r[bright_cyan]" + trgtSong[0] + "[/bright_cyan]" + " [white]--[/white] " + "[bright_green]" + trgtSong[1] + "[/bright_green]", end="")
    playASong("https://ja.wikiwiki.li/images/" + trgtSong[3], trgtSong[2])

覚え書き[編集 | ソースを編集]

インストールについて[編集 | ソースを編集]

Python[編集 | ソースを編集]

公式のダウンロード・ページにアクセスし、"Download Python" とあるボタンをクリックしてください。ダウンロードされたファイルを開くとインストーラーが起動するので、その指示に従うことでインストールを完了できます。

各種ライブラリ[編集 | ソースを編集]

Python の各種ライブラリは、Python 本体を OS にインストールしたのちに、それぞれ以下の操作を行うことでインストールできます。

  • Requests - コマンドプロンプトで pip install requests を実行する
  • Python-VLC - コマンドプロンプトで pip install python-vlc を実行する