이것은 비공식 API로, Python을 통해 AO3 (ArchiveOfourown.org) 데이터에 액세스 할 수 있습니다.
패키지 관리자 PIP를 사용하여 AO3 API를 설치하십시오.
pip install ao3_api
https://github.com/armindoflores/ao3_api
이 패키지는 작품, 장, 사용자, 시리즈, 검색, 세션, 주석, 추가 및 utils의 9 개의 핵심 모듈로 나뉩니다.
이 패키지와 함께 할 수있는 가장 기본적인 것 중 하나는 작업을로드하고 통계 및 정보를 확인하는 것입니다. 이를 위해서는 AO3.Work
클래스가 필요합니다.
우리는로드하고자하는 작업의 작업을 찾는 것으로 시작합니다. 우리는 AO3.utils.workid_from_url(url)
사용하거나 URL을 직접 보면서 그렇게합니다. 봅시다 :
import AO3
url = "https://archiveofourown.org/works/14392692/chapters/33236241"
workid = AO3 . utils . workid_from_url ( url )
print ( f"Work ID: { workid } " )
work = AO3 . Work ( workid )
print ( f"Chapters: { work . nchapters } " )
이 스 니펫을 실행 한 후 출력을 얻습니다.
Work ID: 14392692
Chapters: 46
일부 작품은 게스트 사용자가 액세스 할 수 없을 수 있으며,이 경우에는 0 장을 출력으로, 오류 AO3.utils.AuthError: This work is only available to registered users of the Archive
. 그것을로드하십시오. 그럼에도 불구하고, 우리는 여전히이 작업 대상으로 더 많은 일을 할 수 있습니다. 두 번째 장의 첫 20 단어를 얻으십시오.
import AO3
work = AO3 . Work ( 14392692 )
print ( work . chapters [ 1 ]. title ) # Second chapter name
text = work . chapters [ 1 ]. text # Second chapter text
print ( ' ' . join ( text . split ( " " )[: 20 ]))
What Branches Grow Meaning
December 27, 2018
Christmas sucked this year, and Shouto’s got the black eye to prove it.
Things had started out well enough,
작업의 객체는 AO3.Chapter
유형입니다. 그들은 Work
대상과 같은 속성을 많이 가지고 있습니다.
작업 객체로 할 수있는 또 다른 일은 전체 작업을 PDF 또는 전자 책으로 다운로드하는 것입니다. 현재 AZW3, EPUB, HTML, MOBI 및 PDF 파일로 작동 할 수 있습니다.
import AO3
work = AO3 . Work ( 14392692 )
with open ( f" { work . title } .pdf" , "wb" ) as file :
file . write ( work . download ( "PDF" ))
고급 기능
일반적으로 Work
클래스의 생성자를 호출 할 때 이에 대한 모든 정보는 __init__()
함수에로드됩니다. 그러나이 프로세스에는 꽤 시간이 걸리며 (~ 1-1.5 초) 시리즈에서 작품 목록을로드하려면 30 초 이상 기다릴 수 있습니다. 이 문제를 피하기 위해, 초기화에서 호출 된 Work.reload()
함수는 "스레드 가능"함수입니다. 즉, threaded=True
로 호출하면 Thread
객체를 반환하고 평행하게 작동합니다. 여러 작품을 동시에로드 할 수 있습니다. 구현을 살펴 보겠습니다.
import AO3
import time
series = AO3 . Series ( 1295090 )
works = []
threads = []
start = time . time ()
for work in series . work_list :
works . append ( work )
threads . append ( work . reload ( threaded = True ))
for thread in threads :
thread . join ()
print ( f"Loaded { len ( works ) } works in { round ( time . time () - start , 1 ) } seconds." )
Loaded 29 works in 2.2 seconds.
Work
생성자 내부의 load=False
클래스 인스턴스를 만들 자마자 작업을로드하지 않도록합니다. 결국, 우리는 모든 스레드를 반복하고 마지막 스레드가 .join()
사용하여 끝날 때까지 기다립니다. 이 방법을 AO3 작업을로드하는 표준 방법과 비교해 봅시다.
import AO3
import time
series = AO3 . Series ( 1295090 )
works = []
start = time . time ()
for work in series . work_list :
work . reload ()
works . append ( work )
print ( f"Loaded { len ( works ) } works in { round ( time . time () - start , 1 ) } seconds." )
Loaded 29 works in 21.6 seconds.
우리가 볼 수 있듯이, 성능이 상당히 높아집니다. 이 패키지에는이 기능이있는 다른 기능이 있습니다. 함수가 "스레드 가능"인지 확인하려면 hasattr(function, "_threadable")
사용하거나 __doc__
문자열을 확인하십시오.
더 많은 시간을 절약하려면 메타 데이터에만 관심이있는 경우 load_chapters
옵션을 사용하여 False로 설정할 수 있습니다. 또한 일부 기능 ( Series.work_list
또는 Search.results
등)이 반로로드 된 Work
객체를 반환 할 수 있습니다. 즉,이 작업을로드하라는 요청이 없음을 의미합니다 (따라서 챕터 텍스트, 메모 등에 액세스 할 수 없습니다 ...). 거의 모든 메타 데이터가 이미 캐시되었으므로 전화 할 필요가 없습니다. Work.reload()
전혀.
Work
클래스에 대한 마지막 중요한 정보는 대부분의 속성 (북마크 수, Kudos, 저자 이름 등)이 캐시 된 속성이라는 것입니다. 즉, 한 번 확인하면 값이 저장되고 해당 값이 변경 되더라도 변경되지 않습니다. 이 값을 업데이트하려면 Work.reload()
호출해야합니다. 아래 예를 참조하십시오.
import AO3
sess = AO3 . GuestSession ()
work = AO3 . Work ( 16721367 , sess )
print ( work . kudos )
work . leave_kudos ()
work . reload ()
print ( work . kudos )
392
393
당신이하고 싶은 또 다른 유용한 일은 어떤 작품 / 댓글을 쓴 사람에 대한 정보를 얻는 것입니다. 이를 위해 AO3.User
클래스를 사용합니다.
import AO3
user = AO3 . User ( "bothersomepotato" )
print ( user . url )
print ( user . bio )
print ( user . works ) # Number of works published
https://archiveofourown.org/users/bothersomepotato
University student, opening documents to write essays but writing this stuff instead. No regrets though. My Tumblr, come chat with -or yell at- me if you feel like it! :)
2
작품을 검색하려면 AO3.search()
함수를 사용하고 BeautifulSoup 객체를 직접 구문 분석하거나 AO3.Search
클래스를 사용하여 자동으로이를 수행 할 수 있습니다.
import AO3
search = AO3 . Search ( any_field = "Clarke Lexa" , word_count = AO3 . utils . Constraint ( 5000 , 15000 ))
search . update ()
print ( search . total_results )
for result in search . results :
print ( result )
3074
<Work [five times lexa falls for clarke]>
<Work [an incomplete list of reasons (why Clarke loves Lexa)]>
<Work [five times clarke and lexa aren’t sure if they're a couple or not]>
<Work [Chemistry]>
<Work [The New Commander (Lexa Joining Camp Jaha)]>
<Work [Ode to Clarke]>
<Work [it's always been (right in front of me)]>
<Work [The Girlfriend Tag]>
<Work [The After-Heda Chronicles]>
<Work [The Counter]>
<Work [May We Meet Again]>
<Work [No Filter]>
<Work [The Games We Play]>
<Work [A l'épreuve des balles]>
<Work [Celebration]>
<Work [Another level of fucked up]>
<Work [(Don't Ever Want to Tame) This Wild Heart]>
<Work [Self Control]>
<Work [Winter]>
<Work [My only wish]>
그런 다음 WorkID를 사용하여 검색 한 작품 중 하나를로드 할 수 있습니다. 처음 20 개의 작품보다 더 많은 것을 얻으려면 사용을 사용하여 페이지 번호를 변경하십시오.
search . page = 2
취하고 싶은 많은 조치에는 AO3 계정이 필요할 수 있습니다. 이미 하나가있는 경우 AO3. 세션 객체를 사용하여 해당 작업에 액세스 할 수 있습니다. 사용자 이름과 비밀번호를 사용하여 로그인하여 시작한 다음 해당 객체를 사용하여 제한된 컨텐츠에 액세스 할 수 있습니다.
import AO3
session = AO3 . Session ( "username" , "password" )
print ( f"Bookmarks: { session . bookmarks } " )
session . refresh_auth_token ()
print ( session . kudos ( AO3 . Work ( 18001499 , load = False ))
Bookmarks: 67
True
우리는 성공적으로 Kudos를 작업에 남겨두고 책갈피를 확인했습니다. session.refresh_auth_token()
은 kudos 및 댓글을 남기는 것과 같은 일부 활동에 필요합니다. 만료 되거나이 함수를 호출하는 것을 잊어 버린 경우, 오류 AO3.utils.AuthError: Invalid authentication token. Try calling session.refresh_auth_token()
제기됩니다.
또한 Work.leave_kudos()
/ Work.comment()
호출하여 Work에 kudos를 댓글을 남길 수 있으며 이미 세션 ( AO3.Work(xxxxxx, session=sess)
또는 Work.set_session()
사용으로 해당 객체를 인스턴스화 한 경우. Work.set_session()
). 이는 아마도 가장 좋은 방법 일 것입니다. 덜 인증 문제가 발생하기 때문에 (작업의 진정성 토큰이 대신 사용되므로)
댓글이나 kudos를 익명으로 남기고 싶다면 책갈피, 구독 등을 확인할 수 없다는 점을 제외하고는 일반 세션을 사용하는 것과 같은 방식으로 AO3.GuestSession
을 사용할 수 있습니다. 실제로 로그인되지 않았습니다.
주석 스레드를 검색하고 처리하려면 Work.get_comments()
메소드를 살펴볼 수 있습니다. 특정 장과 해당 스레드의 모든 주석을 반환합니다. 그런 다음 원하는대로 처리 할 수 있습니다. 봅시다 :
from time import time
import AO3
work = AO3 . Work ( 24560008 )
work . load_chapters ()
start = time ()
comments = work . get_comments ( 5 )
print ( f"Loaded { len ( comments ) } comment threads in { round ( time () - start , 1 ) } seconds n " )
for comment in comments :
print ( f"Comment ID: { comment . id } n Replies: { len ( comment . get_thread ()) } " )
Loaded 5 comment threads in 1.8 seconds
Comment ID: 312237184
Replies: 1
Comment ID: 312245032
Replies: 1
Comment ID: 312257098
Replies: 1
Comment ID: 312257860
Replies: 1
Comment ID: 312285673
Replies: 2
주석을로드하는 데 시간이 오래 걸리므로 가능한 한 적게 사용해야합니다. 또한 많은 요청이 AO3 서버로 전송되어 오류가 발생하여 오류가 발생할 수 있습니다 utils.HTTPError: We are being rate-limited. Try again in a while or reduce the number of requests
. 이 경우 요청을 공개하거나 번호를 줄이려고 노력해야합니다. AO3.utils.limit_requests()
사용하여 요청 제한을 활성화 할 수있는 옵션도있어 특정 시간 창에서 X 요청 이상을 만들 수 없도록합니다. Comment.reply()
함수를 사용하여 댓글에 회신하거나 Comment.delete()
사용하여 삭제 (귀하의 경우)를 삭제할 수 있습니다.
ao3.extra에는이 패키지의 기능의 핵심이 아닌 추가 리소스를 다운로드하는 코드가 포함되어 있으며 자주 변경되지 않습니다. 한 가지 예는 AO3에 의해 인정 된 팬덤 목록입니다. 자원을 다운로드하려면 AO3.extra.download(resource_name)
사용하십시오. 모든 리소스를 다운로드하려면 AO3.extra.download_all()
사용할 수 있습니다. 사용 가능한 리소스 목록을 보려면 AO3.extra.get_resources()
사용하십시오.
정보 또는 버그 보고서는 [email protected]으로 문의하십시오.
MIT