นี่คือ API ที่ไม่เป็นทางการที่ให้คุณเข้าถึงข้อมูลของ AO3 (ArchiveOfourown.org) บางส่วนผ่าน Python
ใช้แพ็คเกจ Manager PIP เพื่อติดตั้ง AO3 API
pip install ao3_api
https://github.com/armindoflores/ao3_api
แพ็คเกจนี้แบ่งออกเป็น 9 โมดูลหลัก: งาน, บท, ผู้ใช้, ซีรีส์, การค้นหา, เซสชัน, ความคิดเห็น, พิเศษและ utils
หนึ่งในสิ่งพื้นฐานที่สุดที่คุณอาจต้องการทำกับแพ็คเกจนี้คือการโหลดงานและตรวจสอบสถิติและข้อมูล ในการทำเช่นนั้นคุณจะต้องเรียน 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 หรือ e-book ในขณะนี้คุณสามารถดาวน์โหลดผลงานเป็นไฟล์ 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()
ที่เรียกว่าการเริ่มต้นเป็นฟังก์ชัน "threadable" ซึ่งหมายความว่าถ้าคุณเรียกมันด้วยอาร์กิวเมนต์ 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.
load=False
ภายในตัวสร้าง Work
ทำให้แน่ใจว่าเราจะไม่โหลดงานทันทีที่เราสร้างอินสแตนซ์ของคลาส ในที่สุดเราก็วนซ้ำทุกกระทู้และรอให้คนสุดท้ายใช้ .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
คือคุณสมบัติส่วนใหญ่ (เช่นจำนวนบุ๊กมาร์ก, รุ่งโรจน์, ชื่อผู้เขียน ฯลฯ ) เป็นคุณสมบัติแคช นั่นหมายความว่าเมื่อคุณตรวจสอบครั้งเดียวค่าจะถูกเก็บไว้และจะไม่เปลี่ยนแปลงแม้ว่าค่าเหล่านั้นจะเปลี่ยนไป ในการอัปเดตค่าเหล่านี้คุณจะต้องโทรหา 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()
และแยกวิเคราะห์วัตถุที่สวยงามกลับมาด้วยตัวเองหรือใช้คลาส 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.session คุณเริ่มต้นด้วยการเข้าสู่ระบบในการใช้ชื่อผู้ใช้และรหัสผ่านของคุณจากนั้นคุณสามารถใช้วัตถุนั้นเพื่อเข้าถึงเนื้อหาที่ จำกัด
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
เราประสบความสำเร็จในการทำงานและตรวจสอบบุ๊กมาร์กของเราสำเร็จ session.refresh_auth_token()
เป็นสิ่งจำเป็นสำหรับกิจกรรมบางอย่างเช่นการทิ้งความรุ่งโรจน์และความคิดเห็น หากหมดอายุหรือคุณลืมเรียกฟังก์ชั่นนี้ข้อผิดพลาด AO3.utils.AuthError: Invalid authentication token. Try calling session.refresh_auth_token()
นอกจากนี้คุณยังสามารถแสดงความคิดเห็น / ปล่อยความรุ่งโรจน์ในงานโดยการโทรหา Work.leave_kudos()
/ Work.comment()
และหากคุณได้สร้างอินสแตนซ์วัตถุนั้นด้วยเซสชันแล้ว ( AO3.Work(xxxxxx, session=sess)
Work.set_session()
) นี่อาจเป็นวิธีที่ดีที่สุดในการทำเช่นนั้นเพราะคุณจะพบปัญหาการตรวจสอบน้อยลง (เนื่องจากโทเค็นความถูกต้องของงานจะถูกใช้แทน)
หากคุณต้องการแสดงความคิดเห็นหรือความรุ่งโรจน์โดยไม่ระบุชื่อคุณสามารถใช้ 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]
มิกซ์