特定のチャンネルのチャットを時期を指定してCSVで取得する(Python)
· 約2分
CSV と TXT で保存している。API なので、あまりループさせると相手のサーバに迷惑がかかるので留意。
パスを指定しないと、Windows ならユーザー直下に保存される(はず)
import requests
import csv
from datetime import datetime, timedelta, date
'''
M_ID はhttps://www.openrec.tv/live/gkrpkm6ljz5 の gkrpkm6ljz5 が該当
start_at はチャット取得の起点とする日時
filename にはファイルパス等を指定
today は実行時の日時がセットされる → 終点の時間指定をしたい場合は書き換え
'''
M_ID = 'gkrpkm6ljz5'
start_at = '2024-01-01T15:00:00'
filename = "chat_data.csv"
today = date.today().isoformat()
# API を叩く
endpoint = f"https://public.openrec.tv/external/api/v5/movies/{M_ID}/chats"
limit = 300
params = {
"from_created_at": start_at,
"is_including_system_message": "false",
"limit": str(limit)
}
headers = ["Posted At", "Nickname", "User ID", "Message", "Recxuser ID"]
# ループ回数のカウンターを初期化
loop_count = 0
with open(filename, "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(headers)
while True:
response = requests.get(endpoint, params=params)
data = response.json()
if not data:
break
# ループ回数のカウンターをインクリメント
loop_count += 1
for item in data:
nickname = item["user"]["nickname"]
user_id = item["user"]["id"]
message = item["message"]
posted_at = item["posted_at"]
recxuser_id = item["user"]["recxuser_id"]
posted_at_datetime = datetime.fromisoformat(posted_at)
formatted_posted_at = posted_at_datetime.strftime("%Y/%m/%d %H:%M:%S")
row = [formatted_posted_at, nickname, user_id, message, recxuser_id]
writer.writerow(row)
last_posted_at = data[-1]["posted_at"]
next_posted_at_datetime = datetime.fromisoformat(last_posted_at) + timedelta(seconds=1)
next_posted_at_str = next_posted_at_datetime.strftime("%Y-%m-%dT%H:%M:%S")
if next_posted_at_str[:10] >= today:
break
params["from_created_at"] = next_posted_at_str
print(next_posted_at_str)
# ループ回数(累計)を表示
print("Total loop count:", loop_count)
