Skip to content

Commit 3c05116

Browse files
committed
feat: 사용자 정보 가져오는 로직 개편
1 parent 22b799a commit 3c05116

1 file changed

Lines changed: 18 additions & 32 deletions

File tree

WebtoonScraper/scrapers/_lezhin_comics.py

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,6 @@ async def async_download_webtoon(self, *args, **kwargs):
138138
self._shuffled_directory / "information.json",
139139
)
140140

141-
async def fetch_all(self, reload: bool = False) -> None:
142-
await super().fetch_all(reload)
143-
with suppress(AuthenticationError):
144-
await self.fetch_user_information(reload=reload)
145-
146141
async def _download_episodes(self, download_range, webtoon_directory: Path) -> None:
147142
if self.is_shuffled and self.unshuffle_immediately:
148143
_load_unshuffler()
@@ -204,13 +199,16 @@ async def fetch_episode_information(self, *, reload: bool = False) -> None:
204199

205200
thumbnail_url = res.single('meta[property="og:image"]').attrs.get("content")
206201
assert thumbnail_url is not None
207-
script_string = res.match("script")[-1].text()
208-
try:
209-
raw_data = re.match(r"self\.__next_.\.push\(\[\d,(.*)\]\)$", script_string)[1] # type: ignore
210-
data_raw = json.loads(json.loads(raw_data)[2:])
211-
data = data_raw[1][3]["entity"]
212-
except Exception as exc:
213-
raise WebtoonIdError.from_webtoon_id(self.webtoon_id, LezhinComicsScraper) from exc
202+
next_data = res.next_data()
203+
for possible_data in next_data.values():
204+
try:
205+
data = possible_data[1][3]["entity"]
206+
except Exception:
207+
pass
208+
else:
209+
break
210+
else:
211+
raise WebtoonIdError.from_webtoon_id(self.webtoon_id, LezhinComicsScraper)
214212

215213
selector = "body > div.lzCntnr > div > div > ul > li > a" # cspell: ignore Cntnr
216214
episode_dates: list[str] = []
@@ -245,33 +243,21 @@ async def fetch_episode_information(self, *, reload: bool = False) -> None:
245243
self.author: str = author
246244

247245
self._parse_episode_information(data["meta"]["episodes"])
246+
self._parse_user_information(data["stateByUser"])
248247

249-
@async_reload_manager
250-
async def fetch_user_information(self, *, reload: bool = False) -> None:
251-
await self.fetch_episode_information()
252-
self.purchased_episodes = [False] * len(self.episode_int_ids)
253-
return # FIXME: 현재 작동하지 않는 관계로 스킵
254-
255-
user_int_id = self.user_int_id or random.Random(self.webtoon_id).randrange(5000000000000000, 6000000000000000)
256-
url = f"https://www.lezhin.com/lz-api/v2/users/{user_int_id}/contents/{self.webtoon_int_id}"
257-
try:
258-
res = await self.client.get(url)
259-
except HTTPStatusError:
260-
raise AuthenticationError("Cookie is invalid. Failed to fetch user information.") from None
261-
data: dict = res.json()["data"]
262-
view_episodes_set = {int(episode_int_id) for episode_int_id in data["history"] or []}
263-
purchased_episodes_set = {int(episode_int_id) for episode_int_id in data["purchased"] or []}
248+
def _parse_user_information(self, data) -> None:
249+
episode_data_dict = {episode['id']: episode for episode in data["episodes"]}
264250

265-
raw_last_viewed_episode = data.get("latestViewedEpisode", 0)
266-
self.last_viewed_episode_int_id: int | None = int(raw_last_viewed_episode) if raw_last_viewed_episode else None
251+
self.last_viewed_episode_int_id: int | None = data["latestViewedEpisodeId"]
267252

268253
# 계정 상태
269-
self.is_subscribed = data["subscribed"]
254+
self.is_subscribed = data["isSubscribed"]
270255
self.does_get_notifications = data["notification"]
271256
self.is_preferred: bool | None = data["preferred"] if data["preferred"] != "none" else None
272257
# 에피소드 관련
273-
self.purchased_episodes = [episode_id in purchased_episodes_set for episode_id in self.episode_int_ids]
274-
self.viewed_episodes = [episode_id in view_episodes_set for episode_id in self.episode_int_ids]
258+
default = {"isCollected": False, "isViewed": False}
259+
self.purchased_episodes = [episode_data_dict.get(episode_id, default)["isCollected"] for episode_id in self.episode_int_ids]
260+
self.viewed_episodes = [episode_data_dict.get(episode_id, default)["isViewed"] for episode_id in self.episode_int_ids]
275261
if self.is_fhd_downloaded is None:
276262
self.is_fhd_downloaded = any(self.purchased_episodes)
277263

0 commit comments

Comments
 (0)