メインコンテンツまでスキップ

特定のチャンネルのチャットを時期を指定してCSVで取得する(Python)

· 約2分
Hanamaru
Openchat Owner

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)