こんなやり方でスクリプトを作っています
Firefoxの場合(以下Fxと表記)自称GM1,0系(最新は1.4)
- Greasemonkeyをインストールしておく、なければmozdev.org - greasemonkey: indexより入手
- FxにLive HTTP Headersをインストールしておく、なければmozdev.org - livehttpheaders: indexより入手
- http://www.eris.ais.ne.jp/~hiro/html/で図書館名を16進に変換しておく
- Fxで作成したい図書館の検索ページを開き、ツール(T)>Live HTTP Headersを開きCaptureにチェックがついていることを確認し、
検索ページに必要なパラメータ(ISBNコード)を入力し検索ボタンを押下する - Live HTTP Headersに切り替えてCaptureのチェックをはずし、Save Asボタンを押下、任意のディレクトリ、ファイル名でログを書き出す
- テンプレートファイルを開き以下の場所を変更する
- Fx内で使用する名前を任意に付ける、ただし、この名前で管理しておるためダブって登録すると上書きされたり、レベルアップしたときに名前が異なると複数のバージョンが混在することになる
- 説明文を任意に書き換える
- ログを参照して?の左はURL、右はISBNコードの直前までのパラメータを記述
- 〃ISBNコード以降のパラメータを記述
- リンクの説明を記述
- 先ほど変換した図書館名を"の後に挿入、定義されているのは"図書館"なので〜立の文字
- ハイフンを付与するか否かを設定する、どちらでも可の場合は1:付けないのままでよい
テンプレートの変更点
// ==UserScript== 1. // @name Amazon Iwaki City Lib linky for Greasemonkey // @namespace 2. // @description Iwaki City Lookup from Amazon book listings. // @include http://*.amazon.* // ==/UserScript== //■検索ページのURL。プログラム内では、このURLにISBNを付加して呼び出します 3. var TARGET_URL_1 = "?"; 4. var TARGET_URL_2 = ""; //■検索結果の文字列。_1は英字、_2はUNICODEにエンコードされた全角文字を設定 5. var LIB_NAME_1 = "To Iwaki City Library"; 6. var LIB_NAME_2 = "図書館"; //■ハイフンを付与するか否か 1:付けない 2:付ける 7. var DASH = 1;
ログの読み方(テンプレートの項番と同じ)
3. http://www1.library.iwaki.fukushima.jp/scripts/Books.dll/titles ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?より前の部分に POST /scripts/Books.dll/titles HTTP/1.1 ^^^^POSTだけどGETでかまわない Host: www1.library.iwaki.fukushima.jp User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://www1.library.iwaki.fukushima.jp/ Content-Type: application/x-www-form-urlencoded Content-Length: 140 3&4 TYPE=123&ROWS=25&ITEM0=120&TERM0=4-344-00106-0&JOIN1=0&ITEM1=4&TERM1=&JOIN2=0& 〜 略 〜 &SEARCH.y=26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^TAGET_URL_1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^TAGET_URL_2 HTTP/1.x 200 OK Server: Microsoft-IIS/5.0 Date: Thu, 14 Sep 2006 13:47:04 GMT X-Powered-By: ASP.NET Content-Type: text/html Content-Length: 1110 -----------------------------
- テンプレートファイルを名前を付けて保存する(foo.user.jsのかたちで)
あわてると上書きするので気をつけて - 保存したユーザスクリプトをFxにD&Dし、INSTALLボタンを押下、OKボタンを押下
- 動作するはずのページ(Amazon)を開き(すでに開いている場合はリロード)
- 挿入されたリンクをクリックして動作確認
- 動かない場合はAlert分をスクリプトに挿入するか、文法エラーの場合はツール(T)>JavaScriptコンソール(C)で確認
Sleipnirの場合
- Seahorseをインストールしておく、なければタブブラウザ Sleipnir 6 - Windows / Macの先端的ウェブブラウザ | フェンリルより入手
- http://www.eris.ais.ne.jp/~hiro/html/で図書館名を16進に変換しておく
- Live HTTP Headerといきたいところだが、無論Sleipnirでは動かないので、IEでieHTTPHeadershttp://www.blunck.info/より入手というてもあるが使ったことがないので使い物になるかは不明、この際なのでFirefoxをインストールしてみては
- どうにかしてログを採取
- Greasemonkey版と同様に修整、ただしテンプレートはSeahorse用を使うことと、Sleipnirはファイル名でユーザスクリプトの管理をしていることに注意すること
- FxとSleipnirを併用している場合はもっと簡単で、それぞれのスクリプトの違いは以下の部分だけなのでまるっと張替えのほうが早い*1
Greasemonkey版テンプレート
var header = document.evaluate("//b[@class='sans']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; if (header) { var spl_link = document.createElement('a'); spl_link.setAttribute('href', TARGET_URL_1 + asin + TARGET_URL_2); spl_link.setAttribute('title', LIB_NAME_1); spl_link.innerHTML = '</br><span style=\"font-size:90%; background-color:#ffffcc;\">» ' + LIB_NAME_2 + '</span>'; header.parentNode.insertBefore(spl_link, header.nextSibling); }
Seahorse版テンプレート
var header = document.getElementById("primaryUsedAndNew"); if (header) { var spl_link = document.createElement('a'); spl_link.setAttribute('href', TARGET_URL_1 + asin + TARGET_URL_2); spl_link.setAttribute('title', LIB_NAME_1); spl_link.innerHTML = '</br><span style=\"font-size:90%; background-color:#ffffcc;\">» ' + LIB_NAME_2 + '</span></br>'; header.parentNode.insertBefore(spl_link, header.previousSibling); }
Fx 自称GM1.5系(最新は1.8)
- テンプレートの先頭部分の修正(DASHの値まで)は、1.0系と同様に修整(ただしテンプレートは1.5系の最新のものを使用する)
- 蔵書がある場合とない場合のソースを見比べ(右クリック->ページのソースを表示(V)で)、必ず蔵書ある場合にのみ存在する文字を見つける
記号や日本語だと面倒なので英数字のもの - 見つけた文字で、テンプレートの以下の部分を書き換える
//■検索結果HTML中の、「蔵書が存在」する目印となる文字列をmatchの引数に設定 spl_link.innerHTML= getResultString(response.responseText.match(/tilcod/i)); ^^^^^^
- 「名前を付けて保存する」以降は1.0系と同様
間にワンクッションおいてページが変わっていたりするケースがあるので、すんなり見つけられないことが良くあるががんばろう
著者名で検索など複数ヒットした場合のソースのjavascriptを読み、どうなればページが切り替わるのかを見極める
(特定の関数で切り替わるとすれば、本が1冊しかない場合にその関数を呼ぶ処理が挿入されるとか)
例)
function foo(str) { document.location.replace('bar&'+str); } となっていれば <A href="JavaScript:foo('xxx');">〜</a> が挿入されると想像 match(/JavaScript:foo/i)); で試してみる
雑記
*1:だから同時リリースできる