라프텔 API 뜯어보기 4

아카·2020년 10월 24일
0

라프텔 API(비공식)

목록 보기
4/8

알림

  • 이 포스팅의 정보는 공식적이지 않습니다.

이전 포스팅

이전 포스팅 바로가기

API 뜯어보기

저번 시간엔 아마도 분기별로 가장 많이 방영된 애니메이션 태그(판타지, 일상 등)을 알아보았다. 이번 시간에는 라프텔에 있는 테마 기능에 대해서 알아보자.

우선, 라프텔 테마 기능은 https://laftel.net/theme/basic/{id} 형식으로 접근할 수 있다. 최근의 테마인, https://laftel.net/theme/basic/158 에 접근한 다음, 어떤 API 요청을 하는 지 보면 다음 API가 요청되는 것을 알 수 있다.

https://laftel.net/api/recommends/v1/themes/158/

이 API의 response는 다음과 같다.

형식을 뜯어보면, 대충 id는 이 테마의 id(number)인 것 같고, title은 이 테마이 제목, 그리고 content는 이 테마의 설명이고, theme_item_list는 이 테마에 속한 애니메이션들을 나타내는 것 같다. theme_item_list를 펼쳐보면 다음과 같다.

첫 번째 포스팅에서 설명한 정보 중에서 필요한 부분만을 보내주고 있다는 것을 알 수 있다(전문 용어로 뭐라고 하는 지는 모르겠다). 첫 번째 포스팅에서 추측한 애니메이션 API 명세를 사용하면, 여기서 얻지 못한 정보들(has_free_episode, award 등)을 얻을 수 있을 것이다.

  • API에 대한 TMI
    • theme API로 얻는 것은 img_url인데, 첫 번째 포스팅에서 설명한 api/v1.0/items/{id}/detail API로 얻어오는 것은 img이다. 용도가 다른 것은 아닌가 조사해보았지만, 용도가 동일한 것을 확인했다. 아마 API를 수동으로 짜서 두 개의 속성 이름이 다른 것이 아닐까 싶다. 아님 말고.

API 사용하기

접근

최근에 판권이 만료된 애니메이션을 찾아보자. 첫 번째 포스팅에서 사용한 API로 애니메이션을 전수조사해서 판권만료가 된 애니메이션을 찾을 수도 있겠지만, 이 방법은 너무 비효율적이다. 다행히도, 라프텔은 그달에 판권이 만료된 애니메이션을 테마로 만들어두기 때문에 그 테마들을 모두 찾아, 그 테마에 속하는 애니메이션을 전부 판권이 만료된 애니메이션으로 간주하면 라프텔에서 판권 만료가 된 모든 애니메이션을 찾을 수 있을 것이다.

최근에 판권 만료를 알리는 테마를 찾기

import requests
import time
import random
import json

expired_themes = []

for x in range(120,130):
  url = "https://laftel.net/api/recommends/v1/themes/" + str(x) + "/"
  header = {"laftel": "TeJava"}

  response = requests.get(url = url, headers = header)

  if (response.status_code == 200):
    data = response.json()
    title = data["title"]
    if ("판권" in title):
      expired_themes.append((x, title))

  time.sleep(random.random())

print("판권 만료를 알리는 테마들: ")
print(expired_themes)

이 코드를 실행하면, 테마 id 가 120~129이고, title 에 "판권"이 포함된 테마들은 모두 expired_themes에 기록된다.

  • TMI
    • 엄밀하게는, 테마 이름에 "판권"이 포함되었다고 해서 전부 만료된 애니메이션을 포함하고 있다고는 할 수 없다. 예를 들자면, "판권 만료 예정" 같은 경우가 있을 수 있다.

우리가 필요로 하는 것은 expired_themes에 있는 테마들에 속한 애니메이션들 이므로, expired_themes에 포함된 각 테마가 가진 모든 애니메이션을 기록해야 한다. 테마에 속한 애니메이션을 list로 반환하는 메소드를 만들자.

def animations_from_theme(data):
  animations = []
  for x in data:
    id = x["id"]
    content = x["item"]
    content_id = content["id"]
    content_name = content["name"]
    animations.append((content_id, content_name))
  return animations

animations_from_theme메소드를 추가한 버전은 다음과 같다.

import requests
import time
import random
import json

def animations_from_theme(data):
  animations = []
  for x in data:
    id = x["id"]
    content = x["item"]
    content_id = content["id"]
    content_name = content["name"]
    animations.append((content_id, content_name))
  return animations

expired_themes = []
expired_animations = []

for x in range(120,130):
  url = "https://laftel.net/api/recommends/v1/themes/" + str(x) + "/"
  header = {"laftel": "TeJava"}

  response = requests.get(url = url, headers = header)

  if (response.status_code == 200):
    data = response.json()
    title = data["title"]
    if ("판권" in title):
      expired_animations.extend(animations_from_theme(data["theme_item_list"]))

  time.sleep(random.random())

print("판권 만료된 애니메이션들 : ")
for x, y in expired_animations:
  print(y)

위 코드를 실행하면, 판권 만료된 애니메이션들을 찾을 수 있다.

profile
코딩한량.

0개의 댓글