** Si bien todo parece funcionar ahora, definitivamente es un trabajo en progreso. **
Para el programa de lectura acelerada es necesario conocer los puntos y otros detalles de los libros que están leyendo los estudiantes. Estos se pueden encontrar en arbookfind.co.uk, pero al intentar catalogar una gran cantidad de libros, el hecho de que el sitio web no admita una API presenta una dificultad. De hecho, el sitio requiere la configuración de una cookie para acceder al motor de búsqueda.
Este repositorio contiene mis diversos esfuerzos para superar esta limitación. El objetivo del código aquí es tomar un ISBN (ya sea escrito o escaneado) y buscar los detalles de un libro. Esto se logra mediante el uso de phantomjs para extraer su sitio web y devolver la información en un formato utilizable. Como alternativa, los scripts también intentarán acceder a la API de Google Books si no se encuentra información en el sitio web arbookfind.
Actualmente estoy experimentando con dos métodos diferentes para invocar el programa y formatear el resultado. Es posible que en algún momento se unan en un guión, pero por el momento los he mantenido separados. Los métodos son los siguientes:
A continuación se muestra una versión abreviada de la salida JSON que produce el programa. Esto es lo que obtendrá como resultado si escribe sus propios controladores o utiliza la versión del servidor http. El cliente CSV simplemente toma esta información y la inserta, sin cambios, en un archivo CSV. Si no se encuentra información para una propiedad en particular, aún así se agregará. Sin embargo, si no se encuentra ninguna información en el libro, solo se devolverá el isbn y no se establecerán otras propiedades.
{
"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"
}
Si bien el código para este enfoque no es bonito, funciona. Una vez que se invoca el script con phantomjs, se le solicitará un ISBN para buscar. La información resultante solo se resumirá en la consola; el título del libro aparecerá si se encontró. El resto de la información se guarda en uno de los dos archivos que se crean en el directorio de trabajo actual del script.
El script solicitará un nuevo ISBN después de cada búsqueda. Para finalizar el guión simplemente ingrese un ISBN en blanco.
###Ejecutando
phantomjs arfinder-cli-csv.js
También funciona a partir de ahora aunque, nuevamente, el código necesita trabajo. Cuando se ejecuta el script, abre el servidor web interno phantomjs y escucha el puerto 8080. Para usar el servidor, vaya a http://localhost:8080/{isbn} en su navegador web, donde reemplazó la parte isbn con el número que desee. para buscar. Por ejemplo, vaya a http://localhost:8080/9780439023528 y le devolverá la información sobre el libro en formato JSON.
Todavía estoy trabajando con qué códigos http devolver, pero por el momento, si utiliza caracteres no válidos en la ruta, se devolverá un error 401. Si el ISBN no es válido o si se produce un error durante el procesamiento, se devolverá un error 404. Si el ISBN es válido, se devolverá un objeto JSON en cadena que contiene toda la información recopilada. Si no había información disponible para el ISBN, entonces el objeto simplemente contendrá el valor del ISBN.
###Ejecutando
phantomjs arfinder-http-json.js
Si desea utilizar el código en sus propios scripts, actualmente es muy fácil llamarlo; consulte el ejemplo a continuación.
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();
});
Si desea agregar más controladores, de modo que si no se encuentran detalles del libro, verificará otra fuente que, nuevamente, es bastante sencilla. Cree su módulo en la carpeta core/handlers con un nombre razonable. Cree una función de exportación que tome dos parámetros: isbn y la devolución de llamada para los resultados. Recuerde que los campos estandarizados que deben devolver los controladores se muestran en core/datamapping/core-datamapping.js. Todos los campos deberían estar ahí incluso si son cadenas vacías.
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;
Luego edite el archivo handlers.js en la misma carpeta. Importe su módulo y cambie la matriz exportada al final (ver ejemplo) para que se le agregue su función. Tenga en cuenta que las búsquedas se llevan a cabo en el orden de la matriz y una vez que un controlador devuelve algunos resultados, NO se llama a los siguientes controladores.
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];