** Embora tudo pareça funcionar agora, este é definitivamente um trabalho em andamento. **
Para o programa de leitura acelerada é necessário conhecer os pontos e outros detalhes dos livros que os alunos estão lendo. Eles podem ser encontrados em arbookfind.co.uk, mas ao tentar catalogar um grande número de livros, o fato de o site não suportar uma API apresenta uma dificuldade. Na verdade, o site requer a configuração de um cookie para acessar o mecanismo de pesquisa.
Este repositório contém meus vários esforços para superar essa limitação. O objetivo do código aqui é pegar um ISBN (digitado ou digitalizado) e procurar os detalhes do livro. Isso é conseguido usando phantomjs para raspar seu site e retornar as informações em um formato utilizável. Como alternativa, os scripts também tentarão acessar a API do Google Livros se nenhuma informação for encontrada no site arbookfind.
Atualmente estou experimentando dois métodos diferentes de invocar o programa e formatar o resultado. Eles podem ser unidos em um script em algum momento, mas no momento eu os mantive separados. Os métodos são os seguintes:
Abaixo está uma versão abreviada da saída JSON produzida pelo programa. Isto é o que você receberá como resultado se escrever seus próprios manipuladores ou usar a versão do servidor http. O cliente CSV simplesmente pega essas informações e as insere, inalteradas, em um arquivo CSV. Se nenhuma informação for encontrada para uma propriedade específica, ela ainda será adicionada. No entanto, se nenhuma informação for encontrada no livro, apenas o isbn será retornado e nenhuma outra propriedade será definida.
{
"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"
}
Embora o código para esta abordagem não seja bonito, ele funciona. Depois que o script for invocado com o phantomjs, ele solicitará um ISBN para pesquisa. As informações resultantes serão resumidas apenas no console - o título do livro aparecerá se for encontrado. Todas as outras informações são salvas em um dos dois arquivos criados no diretório de trabalho atual do script.
O script solicitará um novo ISBN após cada pesquisa. Para finalizar o script basta inserir um ISBN em branco.
###Executando
phantomjs arfinder-cli-csv.js
Também funcionando a partir de agora, embora, novamente, o código precise de melhorias. Quando o script é executado, ele abre o servidor web interno do phantomjs e escuta a porta 8080. Para usar o servidor, vá para http://localhost:8080/{isbn} em seu navegador, onde você substituiu a parte isbn pelo número desejado para pesquisar. Por exemplo, acesse http://localhost:8080/9780439023528 e ele retornará as informações sobre o livro no formato JSON.
Ainda estou trabalhando com quais códigos http retornar, mas no momento se você usar caracteres inválidos no caminho, um erro 401 será retornado. Se o ISBN for inválido ou se ocorrer algum erro durante o processamento, será retornado um erro 404. Se o ISBN for válido, um objeto JSON stringificado será retornado contendo todas as informações coletadas. Se não houver informações disponíveis para o ISBN, o objeto conterá simplesmente o próprio valor do ISBN.
###Executando
phantomjs arfinder-http-json.js
Se você quiser usar o código em seus próprios scripts, atualmente é muito fácil chamá-lo - veja o exemplo abaixo.
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();
});
Se você quiser adicionar mais manipuladores para que, se nenhum detalhe do livro for encontrado, ele verificará outra fonte que, novamente, é bastante direta. Crie seu módulo na pasta core/handlers com um nome razoável. Crie uma função de exportação que receba dois parâmetros - o isbn e o retorno de chamada para os resultados. Lembre-se de que os campos padronizados que os manipuladores devem retornar são mostrados em core/datamapping/core-datamapping.js. Todos os campos devem estar lá, mesmo que sejam strings vazias.
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;
Em seguida, edite o arquivo handlers.js na mesma pasta. Importe seu módulo e altere o array exportado no final (veja exemplo) para que sua função seja adicionada a ele. Esteja ciente de que as pesquisas são realizadas na ordem do array e, uma vez que um manipulador retorna alguns resultados, os manipuladores a seguir NÃO são chamados.
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];