API ที่ไม่เป็นทางการสำหรับ RoyalRoad.com
npm i -s @fsoc/royalroadl-api
นี่เป็นความพยายามที่จะเขียนเสื้อคลุมที่คาดเดาได้และสอดคล้องกันรอบ ๆ ความยุ่งเหยิงที่เป็น RR เนื่องจากไม่มีการเปิดเผย API สาธารณะอย่างเป็นทางการโมดูลนี้จึงทำให้ข้อมูลทั้งหมดตรงจาก HTML ซึ่งทำให้มีแนวโน้มที่จะตายไปตามธรรมชาติและน่ากลัว
เอกสาร Barebones ที่สร้างขึ้นจาก Typedoc สามารถพบได้ใน fs-c.github.io/royalroad-api/ นอกจากนี้คุณยังสามารถสร้างเอกสารเหล่านี้ด้วยตัวเองโดยเรียกใช้ npm run docs ในรูทของโครงการ
สำหรับตัวอย่างเพิ่มเติมตรวจสอบไดเรกทอรี /examples ดูที่การทดสอบใน /test
import { RoyalRoadAPI } from '@fsoc/royalroadl-api' ;
const api = new RoyalRoadAPI ( ) ;
const { data } = await api . fictions . getPopular ( ) ;
const titles = data . slice ( 10 ) . map ( ( fic ) => fic . title ) ;
console . log ( `The top 10 popular fictions are: ${ titles . join ( ', ' ) } ` ) ; โมดูลเองส่งออกเพียงคลาส RoyalRoadAPI ซึ่งโดยตัวมันเองไม่มีวิธีการ ฟังก์ชั่นทั้งหมดได้รับการมอบหมายให้คลาสบริการซึ่งเป็นคุณสมบัติของอินสแตนซ์ RoyalRoadAPI
All responses and errors are either an instance of a RoyalResponse or a RoyalError , which extends RoyalResponse . This is done to easily allow for meta information to be tacked onto responses, and to have a consistent interface between user and module. โปรดทราบว่า RoyalError ทำหน้าที่คล้ายกับวัตถุ Error ของ NodeJS ซึ่งมันจับและส่งคืนการติดตามสแต็กสั้น ๆ
ตัวอย่างเช่นการโทรไปยัง RoyalRoadAPI#fiction.getFiction() อาจให้การตอบสนองต่อความสำเร็จดังต่อไปนี้:
RoyalResponse {
data :
{ type : 'Original' ,
tags : [ 'Action' , 'Adventure' , 'Sci-fi' , ... 3 more items ] ,
stats :
{ pages : 766 ,
ratings : 719 ,
followers : 2991 ,
favorites : 690 ,
views : [ Object ] ,
score : [ Object ] } ,
title : 'Paladin' ,
image :
'https://www.royalroadcdn.com/(...)' ,
status : 'HIATUS' ,
author :
{ name : 'Komikhan' ,
title : '' ,
avatar :
'https://www.royalroadcdn.com/(...)' ,
id : 66486 } ,
warnings : [ 'Gore' , 'Profanity' ] ,
chapters : [ [ Object ] , [ Object ] , [ Object ] , ... 71 more items ] ,
description :
'When the first derelict alien spacecraft fell to Earth, (...)' } ,
success : true ,
timestamp : 1528119296799 }...or on error:
RoyalError {
data :
{ message : 'Page Not Found' ,
stack :
[ 'Error' ,
' at new RoyalError' , ... 8 more items ] } ,
success : false ,
timestamp : 1528119381034 } All service classes use the same instance of the Requester , the class responsible for making HTTP requests and returning their responses. โดยค่าเริ่มต้นมันจะโยน RoyalError หากพบรหัสสถานะอื่นนอกเหนือจาก 200 (สามารถปิดใช้งานได้ด้วยตัวเลือก ignoreStatus )
เนื่องจาก RR ชอบที่จะคืน 200 แม้ว่าการตอบกลับจริงควรเป็น 404 หรือ 304 Requester จะแยกวิเคราะห์ HTML ที่ได้รับ (ถ้ามี) และลองอ่านข้อผิดพลาดจากมัน หากพบสัญญาณว่าคำขอล้มเหลวมันจะโยน - สิ่งนี้สามารถปิดใช้งานได้ด้วยตัวเลือก ignoreParser
เป้าหมายหลักของ Requester คือการติดตามคุกกี้และเพื่อดึง __ResponseVerificationToken โดยอัตโนมัติมักจะจำเป็นสำหรับการร้องขอโพสต์ซึ่งเป็นส่วนหนึ่งของมาตรการต่อต้าน CSRF This fetching of tokens is disabled by default and can be enabled with the fetchToken option.
บริการทั้งหมดมีโครงสร้างในลักษณะที่คล้ายกันมาก: ด้วย <Type>Service เปิดเผยวิธีการทั้งหมดที่เกี่ยวข้องและ <Type>Parser ซึ่งมักจะเปิดเผยวิธีการคงที่จำนวนหนึ่งที่ใช้ในการแยกวิเคราะห์การตอบสนอง HTML
บริการที่มีอยู่ทั้งหมดอย่างรวดเร็วคือ:
ChapterService มีวิธีการในการดึงและเผยแพร่บทและบทที่แสดงความคิดเห็นFictionService ดึงข้อมูลนิยายและบทวิจารณ์FictionsService วิธีการดึงนิยายทุกประเภทแสดงรายการข้อเสนอ RRL โดยมีระดับรายละเอียดต่อนิยายตามลำดับProfileService , handling profiles, returns parsed user profiles.UserService การกระทำที่เกี่ยวข้องกับผู้ใช้ที่เข้าสู่ระบบเช่นการเข้าสู่ระบบรับนิยายของผู้ใช้บุ๊กมาร์กหรือการแจ้งเตือนสิ่งนี้ใช้ Cheerio เพื่อแยกวิเคราะห์ HTML ซึ่งเป็นตัวแยกวิเคราะห์ที่ให้อภัยมาก ซึ่งหมายความว่าแม้ว่า RRL จะทำการเปลี่ยนแปลงเล็กน้อยในเค้าโครงหน้าของพวกเขาส่วนใหญ่ของ API (แม้ชิ้นส่วนที่รับผิดชอบพื้นที่ที่เปลี่ยนแปลง) จะยังคงทำงานอยู่
ดังนั้นคาดว่าคุณสมบัติจะว่างเปล่าหรือ null และรู้ว่าข้อผิดพลาดจะไม่ถูกโยนทิ้งเพียงเพราะค่าบางอย่างไม่สามารถแยกวิเคราะห์ได้