** แม้ว่าทุกอย่างดูเหมือนจะได้ผลแล้ว แต่นี่เป็นงานที่อยู่ระหว่างดำเนินการอย่างแน่นอน -
สำหรับโปรแกรม Accelerated Reader จำเป็นต้องทราบประเด็นและรายละเอียดอื่นๆ ของหนังสือที่นักเรียนกำลังอ่าน สามารถพบได้ใน arbookfind.co.uk แต่เมื่อพยายามจัดรายการหนังสือจำนวนมาก ข้อเท็จจริงที่ว่าเว็บไซต์ไม่รองรับ API ทำให้เกิดปัญหา แท้จริงแล้วไซต์จำเป็นต้องตั้งค่าคุกกี้เพื่อเข้าถึงเครื่องมือค้นหา
พื้นที่เก็บข้อมูลนี้รวบรวมความพยายามต่างๆ ของฉันเพื่อเอาชนะข้อจำกัดนี้ จุดประสงค์ของโค้ดที่นี่คือการนำ ISBN (ไม่ว่าจะพิมพ์หรือสแกน) และค้นหารายละเอียดหนังสือ ซึ่งทำได้โดยใช้ phantomjs เพื่อขูดเว็บไซต์และส่งคืนข้อมูลในรูปแบบที่ใช้งานได้ สคริปต์จะพยายามเข้าถึง Google หนังสือ API ด้วยเช่นกัน หากไม่พบข้อมูลบนเว็บไซต์ arbookfind เป็นทางเลือกสำรอง
ขณะนี้ฉันกำลังทดลองใช้สองวิธีที่แตกต่างกันในการเรียกใช้โปรแกรมและการจัดรูปแบบผลลัพธ์ สิ่งเหล่านี้อาจจะรวมเข้าด้วยกันเป็นสคริปต์เดียว ณ จุดใดจุดหนึ่ง แต่ในขณะนี้ ฉันได้แยกพวกมันออกจากกัน วิธีการมีดังนี้:
ด้านล่างนี้เป็นเวอร์ชันย่อของเอาต์พุต JSON ที่จัดทำโดยโปรแกรม นี่คือสิ่งที่คุณจะได้รับหากคุณเขียนตัวจัดการของคุณเองหรือใช้เวอร์ชันเซิร์ฟเวอร์ http ไคลเอนต์ CSV เพียงใช้ข้อมูลนี้และแทรกลงในไฟล์ CSV โดยไม่มีการเปลี่ยนแปลง หากไม่พบข้อมูลสำหรับคุณสมบัติใดคุณสมบัติหนึ่ง ข้อมูลนั้นจะยังคงถูกเพิ่มเข้าไป อย่างไรก็ตาม หากไม่พบข้อมูลใดๆ ในหนังสือเลย ระบบจะส่งคืนเฉพาะหมายเลข ISBN และจะไม่มีการตั้งค่าคุณสมบัติอื่นๆ
{
"author" : "Rowling, J.K. " ,
"category" : "Fiction" ,
"imageURL" : "http://somewhere.com/image.jpg" ,
"interest" : "Middle Years" ,
"isbn" : "9750747532743" ,
"lang" : "EN" ,
"level" : "2.0" ,
"pages" : "223" ,
"points" : "19.0" ,
"publishedDate" : "1997" ,
"publisher" : "Bloomsbury Publishing" ,
"quizNumber" : "210738" ,
"ranking" : "3" ,
"series" : "Harry Potter; " ,
"summary" : "Harry thinks he is an ordinary boy till he finds out he is a wizard. First in the series." ,
"title" : "Harry Potter and the Philosopher's Stone" ,
"topic" : "Award Winners/Nominee..." ,
"words" : "77325"
}
แม้ว่าโค้ดสำหรับแนวทางนี้จะไม่ได้สวยงามนัก แต่ก็ใช้งานได้ เมื่อสคริปต์ถูกเรียกใช้ด้วย phantomjs มันจะแจ้งให้คุณค้นหา ISBN ข้อมูลผลลัพธ์จะถูกสรุปบนคอนโซลเท่านั้น - ชื่อหนังสือจะปรากฏขึ้นหากพบ ข้อมูลอื่นๆ ทั้งหมดจะถูกบันทึกลงในหนึ่งในสองไฟล์ที่สร้างขึ้นในไดเร็กทอรีการทำงานปัจจุบันของสคริปต์
สคริปต์จะขอ ISBN ใหม่หลังการค้นหาแต่ละครั้ง หากต้องการสิ้นสุดสคริปต์ ให้ป้อน ISBN ว่างๆ
###กำลังดำเนินการ
phantomjs arfinder-cli-csv.js
ยังใช้งานได้ในตอนนี้ แม้ว่าโค้ดจะต้องได้รับการปรับปรุงอีกครั้งก็ตาม เมื่อสคริปต์ถูกรัน สคริปต์จะเปิดเว็บเซิร์ฟเวอร์ phantomjs ภายในและฟังพอร์ต 8080 หากต้องการใช้เซิร์ฟเวอร์ ให้ไปที่ http://localhost:8080/{isbn} ในเว็บเบราว์เซอร์ของคุณ โดยคุณได้แทนที่ส่วน isbn ด้วยหมายเลขที่คุณต้องการ เพื่อค้นหา ตัวอย่างเช่น ไปที่ http://localhost:8080/9780439023528 และจะส่งคืนข้อมูลเกี่ยวกับหนังสือในรูปแบบ JSON
ยังคงทำงานกับรหัส http ที่จะส่งคืน แต่ในขณะนี้ หากคุณใช้อักขระที่ไม่ถูกต้องในเส้นทาง ข้อผิดพลาด 401 จะถูกส่งกลับ หาก ISBN ไม่ถูกต้องหรือหากเกิดข้อผิดพลาดระหว่างการประมวลผล ข้อผิดพลาด 404 จะถูกส่งกลับ หาก ISBN ถูกต้อง ออบเจ็กต์ JSON ที่เป็นสตริงจะถูกส่งกลับโดยมีข้อมูลทั้งหมดที่รวบรวมไว้ หากไม่มีข้อมูลสำหรับ ISBN วัตถุก็จะมีเพียงค่า ISBN นั่นเอง
###กำลังดำเนินการ
phantomjs arfinder-http-json.js
หากคุณต้องการใช้โค้ดในสคริปต์ของคุณเอง ในปัจจุบันการโทรนั้นง่ายมาก - ดูตัวอย่างด้านล่าง
var arfinder = import('./core/arfinder-core);
var isbn = 1234567890; // the isbn you are looking for.
core.searchByISBN(isbn, function (result) {
// do something with the result.
// only call this if you want to
// close phantomjs and stop.
core.exit();
});
หากคุณต้องการเพิ่มตัวจัดการเพิ่มเติม เพื่อที่ว่าหากไม่พบรายละเอียดหนังสือ ระบบจะตรวจสอบแหล่งอื่นที่ค่อนข้างตรงไปตรงมาอีกครั้ง สร้างโมดูลของคุณในโฟลเดอร์ core/handlers ด้วยชื่อที่สมเหตุสมผล สร้างฟังก์ชันการส่งออกที่รับพารามิเตอร์สองตัว - isbn และการโทรกลับสำหรับผลลัพธ์ โปรดจำไว้ว่าฟิลด์มาตรฐานที่ตัวจัดการควรส่งคืนจะแสดงใน core/datamapping/core-datamapping.js ควรมีช่องทั้งหมดแม้ว่าจะเป็นสตริงว่างก็ตาม
function mySearch(isbn, callback) {
// Write what you want here.
// When complete you should call the callback function with
// the JSON formatted results as a parameter. If you can't
// find the information then pass null or call the function
// without supplying the parameter - as below.
callback();
}
// Export your function from the module.
module.exports.mySearch = mySearch;
ถัดไปแก้ไขไฟล์ handlers.js ในโฟลเดอร์เดียวกัน นำเข้าโมดูลของคุณและเปลี่ยนอาร์เรย์ที่ส่งออกในตอนท้าย (ดูตัวอย่าง) เพื่อให้ฟังก์ชันของคุณถูกเพิ่มเข้าไป โปรดทราบว่าการค้นหาจะดำเนินการตามลำดับของอาร์เรย์ และเมื่อตัวจัดการส่งคืนผลลัพธ์บางส่วน ตัวจัดการต่อไปนี้จะไม่ถูกเรียก
var arBookFind = require("./arfinder-handlers.js");
var googleBooks = require("./google-handlers.js");
var mySearch = require("./mySearch-handlers.js")
module.exports = [arBookFind.arBookSearch, googleBooks.googleBookSearch, mySearch.mySearch];