** 現在はすべて機能しているように見えますが、これは間違いなく進行中です。 **
Accelerated Reader プログラムでは、学生が読んでいる本のポイントやその他の詳細を知る必要があります。これらは arbookfind.co.uk で見つけることができますが、多数の書籍をカタログ化しようとする場合、Web サイトが API をサポートしていないという事実が問題になります。実際、このサイトでは検索エンジンにアクセスするために Cookie を設定する必要があります。
このリポジトリには、この制限を克服するための私のさまざまな取り組みが保存されています。ここでのコードの目的は、ISBN (入力またはスキャン) を取得し、書籍の詳細を検索することです。これは、phantomjsを使用して Web サイトをスクレイピングし、情報を使用可能な形式で返すことで実現されます。 arbookfind Web サイトで情報が見つからない場合、スクリプトはフォールバックとして Google Books API へのアクセスも試行します。
現在、プログラムの呼び出しと結果のフォーマットの両方について 2 つの異なる方法を試しています。これらは、ある時点で 1 つのスクリプトに結合される可能性がありますが、現時点では別々に保っています。方法は次のとおりです。
以下は、プログラムによって生成される 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 の入力を求めるプロンプトが表示されます。結果として得られる情報はコンソールに要約されるだけです。書籍のタイトルが見つかった場合は、その書籍のタイトルが表示されます。他のすべての情報は、スクリプトの現在の作業ディレクトリに作成される 2 つのファイルのいずれかに保存されます。
スクリプトは検索のたびに新しい ISBN を要求します。スクリプトを終了するには、空白の ISBN を入力するだけです。
###実行中
phantomjs arfinder-cli-csv.js
現時点でも動作していますが、やはりコードに作業が必要です。スクリプトが実行されると、内部の phantomjs Web サーバーが開き、ポート 8080 をリッスンします。サーバーを使用するには、Web ブラウザーで 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 フォルダーに適切な名前を付けてモジュールを作成します。 2 つのパラメーター (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];