|
import streamlit as st |
|
import requests |
|
import re |
|
|
|
|
|
st.title("VOD μ±ν
ν¬λ‘€λ¬") |
|
st.write("VOD URLμ μ
λ ₯νκ³ μ±ν
λ°μ΄ν°λ₯Ό ν¬λ‘€λ§ν©λλ€.") |
|
|
|
|
|
vod_url = st.text_input("VOD URL μ
λ ₯") |
|
|
|
|
|
|
|
def crawl_chats(vod_url): |
|
|
|
url = vod_url + "/chats" |
|
|
|
|
|
headers = { |
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36", |
|
"Accept": "application/json, text/plain, */*", |
|
"Referer": "https://chzzk.naver.com/video/3646597", |
|
"Origin": "https://chzzk.naver.com", |
|
"Cookie": "your-cookie-string-here" |
|
} |
|
|
|
|
|
params = { |
|
"playerMessageTime": 0, |
|
"previousVideoChatSize": 50 |
|
} |
|
|
|
|
|
last_collected_chats = None |
|
total_collected_chats = 0 |
|
chat_logs = [] |
|
|
|
|
|
while True: |
|
|
|
response = requests.get(url, params=params, headers=headers) |
|
|
|
|
|
if response.status_code != 200: |
|
return f"API μμ² μ€ν¨: {response.status_code}" |
|
|
|
|
|
data = response.json() |
|
|
|
|
|
chats = data.get("content", {}).get("videoChats", []) |
|
|
|
|
|
if not chats: |
|
break |
|
|
|
|
|
if last_collected_chats == chats: |
|
break |
|
|
|
|
|
for chat in chats: |
|
chat_content = chat.get("content") |
|
message_time = chat.get("playerMessageTime") |
|
|
|
|
|
if not re.search(r'{:[^}]*:}', chat_content): |
|
|
|
hours, remainder = divmod(message_time // 1000, 3600) |
|
minutes, seconds = divmod(remainder, 60) |
|
|
|
if hours > 0: |
|
formatted_time = f"{hours:02}:{minutes:02}:{seconds:02}" |
|
else: |
|
formatted_time = f"{minutes:02}:{seconds:02}" |
|
|
|
|
|
chat_logs.append(f"{formatted_time} - {chat_content}") |
|
|
|
|
|
last_collected_chats = chats |
|
|
|
|
|
total_collected_chats += len(chats) |
|
|
|
|
|
next_time = data["content"].get("nextPlayerMessageTime") |
|
if next_time is None: |
|
break |
|
params["playerMessageTime"] = next_time |
|
|
|
|
|
return "\n".join(chat_logs) |
|
|
|
|
|
|
|
if st.button("ν¬λ‘€λ§ μμ"): |
|
if vod_url: |
|
chat_logs = crawl_chats(vod_url) |
|
st.text_area("μ±ν
λ‘κ·Έ", value=chat_logs, height=400) |
|
|
|
|
|
file_name = "chat_logs.txt" |
|
with open(file_name, "w") as file: |
|
file.write(chat_logs) |
|
|
|
|
|
with open(file_name, "rb") as file: |
|
btn = st.download_button( |
|
label="μ±ν
λ‘κ·Έ λ€μ΄λ‘λ", |
|
data=file, |
|
file_name=file_name, |
|
mime="text/plain" |
|
) |
|
else: |
|
st.warning("URLμ μ
λ ₯νμΈμ.") |