هذه واجهة برمجة تطبيقات غير رسمية تتيح لك الوصول إلى بعض بيانات AO3 (Archiveofourown.org) عبر Python.
استخدم Package 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 أو كتاب إلكتروني. في الوقت الحالي ، يمكنك تنزيل أعمال 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 ثانية. Thread
هذه المشكلة threaded=True
فإن Work.reload()
يمكنك تحميل أعمال متعددة في نفس الوقت. لنلقي نظرة على التنفيذ:
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
. أيضًا ، كن على دراية بأن بعض الوظائف (مثل 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()
وتحليل كائن 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 لتحميل أحد الأعمال التي بحثت عنها. للحصول على المزيد ثم العشرين أعمالًا ، قم بتغيير رقم الصفحة باستخدام
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()
سيتم رفعها.
يمكنك أيضًا التعليق / ترك judos في عمل عن طريق الاتصال Work.leave_kudos()
/ Work.comment()
وشريطة أن تكون قد قمت بتثبيت هذا الكائن بجلسة بالفعل Work.set_session()
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 على الكود لتنزيل بعض الموارد الإضافية التي ليست جوهرية لوظائف هذه الحزمة ولا تتغير كثيرًا. ومن الأمثلة على ذلك قائمة fandoms المعترف بها بواسطة AO3. لتنزيل مورد ، ما عليك سوى استخدام AO3.extra.download(resource_name)
. لتنزيل كل مورد ، يمكنك استخدام AO3.extra.download_all()
. لمشاهدة قائمة الموارد المتاحة ، استخدم AO3.extra.get_resources()
.
للحصول على معلومات أو تقارير الأخطاء ، يرجى الاتصال بـ [email protected].
معهد ماساتشوستس للتكنولوجيا