Ini adalah API tidak resmi yang memungkinkan Anda mengakses beberapa data AO3 (archiveofourown.org) melalui Python.
Gunakan PIP Paket untuk menginstal AO3 API.
pip install ao3_api
https://github.com/armindoflores/ao3_api
Paket ini dibagi dalam 9 modul inti: karya, bab, pengguna, seri, pencarian, sesi, komentar, ekstra, dan util.
Salah satu hal paling mendasar yang mungkin ingin Anda lakukan dengan paket ini adalah memuat pekerjaan dan memeriksa statistik dan informasinya. Untuk melakukan itu, Anda akan membutuhkan kelas AO3.Work
.
Kami mulai dengan menemukan pekerjaan dari pekerjaan yang ingin kami muat. Kami melakukannya dengan menggunakan AO3.utils.workid_from_url(url)
atau hanya dengan melihat URL sendiri. Mari kita lihat:
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 } " )
Setelah menjalankan cuplikan ini, kami mendapatkan output:
Work ID: 14392692
Chapters: 46
Penting untuk dicatat bahwa beberapa karya mungkin tidak dapat diakses oleh pengguna tamu, dan dalam hal ini Anda akan mendapatkan 0 bab sebagai output, dan kesalahan AO3.utils.AuthError: This work is only available to registered users of the Archive
jika Anda Cobalah memuatnya. Nonstheless, kita masih bisa melakukan lebih banyak hal dengan objek kerja ini: mari kita coba mendapatkan 20 kata pertama dari bab kedua.
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,
Objek dalam pekerjaan. Baban adalah tipe AO3.Chapter
. Mereka memiliki banyak properti yang sama dengan objek Work
.
Hal lain yang dapat Anda lakukan dengan objek kerja adalah mengunduh seluruh karya sebagai PDF atau e-book. Saat ini Anda dapat mengunduh karya AZW3, EPUB, HTML, MOBI, dan PDF.
import AO3
work = AO3 . Work ( 14392692 )
with open ( f" { work . title } .pdf" , "wb" ) as file :
file . write ( work . download ( "PDF" ))
Fungsionalitas lanjutan
Biasanya, ketika Anda memanggil konstruktor untuk kelas Work
, semua info tentang itu dimuat dalam fungsi __init__()
. Namun, proses ini membutuhkan waktu cukup lama (~ 1-1,5 detik) dan jika Anda ingin memuat daftar karya dari seri, misalnya, Anda mungkin menunggu lebih dari 30 detik. Untuk menghindari masalah ini, fungsi Work.reload()
, dipanggil pada inisialisasi, adalah fungsi "dapat disetel", yang berarti bahwa jika Anda menyebutnya dengan argumen threaded=True
, itu akan mengembalikan objek Thread
dan bekerja secara paralel, makna Anda dapat memuat beberapa karya secara bersamaan. Mari kita lihat implementasi:
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
di dalam konstruktor Work
memastikan kami tidak memuat pekerjaan segera setelah kami membuat instance dari kelas. Pada akhirnya, kami mengulangi setiap utas dan menunggu yang terakhir selesai menggunakan .join()
. Mari kita bandingkan metode ini dengan cara standar memuat AO3 berfungsi:
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.
Seperti yang bisa kita lihat, ada peningkatan kinerja yang signifikan. Ada fungsi lain dalam paket ini yang memiliki fungsi ini. Untuk melihat apakah suatu fungsi adalah "Threadable", baik menggunakan hasattr(function, "_threadable")
atau periksa string __doc__
-nya.
Untuk menghemat lebih banyak waktu, jika Anda hanya tertarik pada metadata, Anda dapat memuat pekerjaan dengan opsi load_chapters
diatur ke False. Juga, ketahuilah bahwa beberapa fungsi (seperti Series.work_list
atau Search.results
) dapat mengembalikan objek Work
semi-muatan. Ini berarti bahwa tidak ada permintaan yang dibuat untuk memuat pekerjaan ini (jadi Anda tidak memiliki akses ke teks bab, catatan, dll ...) tetapi hampir semua metadatanya sudah di -cache, dan Anda mungkin tidak perlu menelepon Work.reload()
sama sekali.
Informasi penting terakhir tentang kelas Work
adalah bahwa sebagian besar propertinya (seperti jumlah bookmark, pujian, nama penulis, dll ...) adalah properti yang di -cache. Itu berarti bahwa begitu Anda memeriksanya sekali, nilainya disimpan dan tidak akan pernah berubah, bahkan jika nilai -nilai itu berubah. Untuk memperbarui nilai -nilai ini, Anda perlu menghubungi Work.reload()
. Lihat contoh di bawah ini:
import AO3
sess = AO3 . GuestSession ()
work = AO3 . Work ( 16721367 , sess )
print ( work . kudos )
work . leave_kudos ()
work . reload ()
print ( work . kudos )
392
393
Hal bermanfaat lain yang mungkin ingin Anda lakukan adalah mendapatkan informasi tentang siapa yang menulis / komentar mana. Untuk itu, kami menggunakan kelas 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
Untuk mencari karya, Anda dapat menggunakan fungsi AO3.search()
dan menguraikan objek cantik kembali kembali, atau menggunakan kelas AO3.Search
untuk secara otomatis melakukannya untuk Anda.
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]>
Anda kemudian dapat menggunakan WorkID untuk memuat salah satu karya yang Anda cari. Untuk mendapatkan lebih dari 20 karya pertama, ubah nomor halaman menggunakan
search . page = 2
Banyak tindakan yang mungkin ingin Anda ambil mungkin memerlukan akun AO3. Jika Anda sudah memilikinya, Anda dapat mengakses tindakan tersebut menggunakan objek AO3.Session. Anda mulai dengan masuk menggunakan nama pengguna dan kata sandi Anda, dan kemudian Anda dapat menggunakan objek itu untuk mengakses konten terbatas.
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
Kami berhasil meninggalkan pujian dalam sebuah karya dan memeriksa bookmark kami. session.refresh_auth_token()
diperlukan untuk beberapa kegiatan seperti meninggalkan pujian dan komentar. Jika kedaluwarsa atau Anda lupa memanggil fungsi ini, kesalahan AO3.utils.AuthError: Invalid authentication token. Try calling session.refresh_auth_token()
akan dinaikkan.
Anda juga dapat berkomentar / meninggalkan pujian dalam sebuah karya dengan menelepon Work.leave_kudos()
Work.set_session()
Work.comment()
dan asalkan Anda telah membuat objek itu sudah dengan sesi ( AO3.Work(xxxxxx, session=sess)
Work.set_session()
). Ini mungkin cara terbaik untuk melakukannya karena Anda akan mengalami masalah yang kurang otentikasi (karena token keaslian pekerjaan akan digunakan sebagai gantinya).
Jika Anda lebih suka meninggalkan komentar atau kudos secara anonim, Anda dapat menggunakan AO3.GuestSession
dengan cara yang sama seperti Anda menggunakan sesi normal, kecuali Anda tidak akan dapat memeriksa bookmark, langganan, dll. Karena Anda ' tidak benar -benar masuk.
Untuk mengambil dan memproses utas komentar, Anda mungkin ingin melihat metode Work.get_comments()
. Ini mengembalikan semua komentar dalam bab tertentu dan utasnya masing -masing. Anda kemudian dapat memprosesnya sesuka Anda. Mari kita lihat:
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
Memuat komentar membutuhkan waktu yang sangat lama sehingga Anda harus mencoba dan menggunakannya sesedikit mungkin. Ini juga menyebabkan banyak permintaan dikirim ke server AO3, yang mungkin mengakibatkan mendapatkan utils.HTTPError: We are being rate-limited. Try again in a while or reduce the number of requests
. utils.HTTPError: We are being rate-limited. Try again in a while or reduce the number of requests
. Jika itu terjadi, Anda harus mencoba menghapus permintaan Anda atau mengurangi nomor mereka. Ada juga opsi untuk mengaktifkan permintaan yang membatasi menggunakan AO3.utils.limit_requests()
, yang membuatnya sehingga Anda tidak dapat membuat lebih dari permintaan X di jendela waktu tertentu. Anda juga dapat membalas komentar menggunakan fungsi Comment.reply()
, atau hapus satu (jika itu milik Anda) menggunakan Comment.delete()
.
AO3.Extra berisi kode untuk mengunduh beberapa sumber daya tambahan yang bukan inti dari fungsionalitas paket ini dan tidak sering berubah. Salah satu contoh adalah daftar fandom yang diakui oleh AO3. Untuk mengunduh sumber daya, cukup gunakan AO3.extra.download(resource_name)
. Untuk mengunduh setiap sumber daya, Anda dapat menggunakan AO3.extra.download_all()
. Untuk melihat daftar sumber daya yang tersedia, gunakan AO3.extra.get_resources()
.
Untuk informasi atau laporan bug, silakan hubungi [email protected].
Mit