こんなやり方でスクリプトを作っています

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ボタンを押下、任意のディレクトリ、ファイル名でログを書き出す
  • テンプレートファイルを開き以下の場所を変更する
    1. Fx内で使用する名前を任意に付ける、ただし、この名前で管理しておるためダブって登録すると上書きされたり、レベルアップしたときに名前が異なると複数のバージョンが混在することになる
    2. 説明文を任意に書き換える
    3. ログを参照して?の左はURL、右はISBNコードの直前までのパラメータを記述
    4. 〃ISBNコード以降のパラメータを記述
    5. リンクの説明を記述
    6. 先ほど変換した図書館名を"の後に挿入、定義されているのは"図書館"なので〜立の文字
    7. ハイフンを付与するか否かを設定する、どちらでも可の場合は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の場合

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;\">&raquo; ' + 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;\">&raquo; ' + LIB_NAME_2 + '</span></br>';
	header.parentNode.insertBefore(spl_link, header.previousSibling);
}
  • 作成したユーザスクリプトを(インストール先フォルダ)\Sleipnir\plugins\seahorseフォルダへコピーする。
  • F12->拡張->再読み込み(R)でスクリプトを反映、以下同文(エラーログは見れない)

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));
	で試してみる

雑記

  • 長々と書いてしまいましたが参考になったでしょうか?
  • 立ち上げるのが面倒なので、エディタでスクリプトを直してしまいがちですがIDEを持っているならそちらで直した方が
    結局近道だったりすることが多いです(やっぱり文法チェックや文字補完、カラーコーディングって便利だわ)

*1:だから同時リリースできる