82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 2 as
|
|
# published by the Free Software Foundation.
|
|
|
|
"""Extractors for https://chzzk.naver.com/"""
|
|
|
|
from .common import Extractor, Message
|
|
from .. import text, util
|
|
|
|
|
|
class NaverChzzkExtractor(Extractor):
|
|
"""Base class for chzzk.naver.com extractors"""
|
|
category = "naver-chzzk"
|
|
filename_fmt = "{uid}_{id}_{num}.{extension}"
|
|
directory_fmt = ("{category}", "{user[userNickname]}")
|
|
archive_fmt = "{uid}_{id}_{num}"
|
|
|
|
def request_api(self, uid, id=None, params=None):
|
|
return self.request_json(
|
|
f"https://apis.naver.com/nng_main/nng_comment_api/v1/type"
|
|
f"/CHANNEL_POST/id/{uid}/comments/{id or ''}",
|
|
params=params)["content"]
|
|
|
|
def items(self):
|
|
for comment in self.comments():
|
|
data = comment["comment"]
|
|
files = data.pop("attaches") or ()
|
|
data["id"] = data["commentId"]
|
|
data["uid"] = data["objectId"]
|
|
data["user"] = comment["user"]
|
|
data["count"] = len(files)
|
|
data["date"] = self.parse_datetime(
|
|
data["createdDate"], "%Y%m%d%H%M%S")
|
|
|
|
yield Message.Directory, "", data
|
|
for data["num"], file in enumerate(files, 1):
|
|
if extra := file.get("extraJson"):
|
|
file.update(util.json_loads(extra))
|
|
file["date"] = self.parse_datetime_iso(
|
|
file["createdDate"])
|
|
file["date_updated"] = self.parse_datetime_iso(
|
|
file["updatedDate"])
|
|
data["file"] = file
|
|
url = file["attachValue"]
|
|
yield Message.Url, url, text.nameext_from_url(url, data)
|
|
|
|
|
|
class NaverChzzkCommentExtractor(NaverChzzkExtractor):
|
|
"""Extractor for individual comment from chzzk.naver.com"""
|
|
subcategory = "comment"
|
|
pattern = r"(?:https?://)?chzzk\.naver\.com/(\w+)/community/detail/(\d+)"
|
|
example = "https://chzzk.naver.com/0123456789abcdef/community/detail/12345"
|
|
|
|
def comments(self):
|
|
uid, id = self.groups
|
|
res = self.request_api(uid, id)
|
|
return ({"comment": res["comment"], "user": res["user"]},)
|
|
|
|
|
|
class NaverChzzkCommunityExtractor(NaverChzzkExtractor):
|
|
"""Extractor for comments from chzzk.naver.com"""
|
|
subcategory = "community"
|
|
pattern = r"(?:https?://)?chzzk\.naver\.com/(\w+)/community"
|
|
example = "https://chzzk.naver.com/0123456789abcdef/community"
|
|
request_interval = (0.5, 1.5)
|
|
|
|
def comments(self):
|
|
uid = self.match[1]
|
|
params = {
|
|
"limit": 10,
|
|
"offset": text.parse_int(self.config("offset")),
|
|
"pagingType": "PAGE",
|
|
}
|
|
while True:
|
|
comments = self.request_api(uid, params=params)["comments"]
|
|
yield from comments["data"]
|
|
if not comments["page"]["next"]:
|
|
return
|
|
params["offset"] += params["limit"]
|