|
|
user.scriptの書き方とgreasemonkey API の内容は何月かのsoftware designの特集の丸写しなので、このページのアドレスをあちこちに公開しないように!
grease monkeyとは
wikipedia 拡張機能より
user.script
Position user.scriptの書き方
Greasemonkeyのユーザスクリプトの実体は、拡張子 .user.js が示すようにjavascriptそのものです。
javascriptとまったく同じ言語使用ですので、手軽に開発が行えます。 リスト1は、単にWebブラウザウィンドウのタイトルバーに「Hello, World!」 と表示するだけのスクリプトです。
ファイル名をhello.user.jsとして保存して、firefoxで開くと画面上部にGrasemonkeyの確認メッセージが表示されます。 そこで他のスクリプトと同じように[install]ボタンを押せば導入完了です。 リスト1
// ==UserScript== // @name hello // @namespace http://www.net.info.mie-u.ac.jp/~sakatani/hello/ // @description hello world! // @include * // ==/UserScript== document.title = "Hello, World!"; 適当なWebページにアクセスすると、タイトルバーが書き変わるのが確認できます。
ソース冒頭のコメントはgreasemonkey特有のメタデータです。
==UserScript==と==/UserScript==に囲まれたコメントの間にプロパティを指定します。 表3の5種類が定義されています。 greasemonkeyでは全てのプロパティを省略可能です。 表3
プロパティ 内容 単/複 デフォルト値 @name ユーザスクリプトの名称 1回のみ スクリプトファイル名 (拡張子のぞく) @namespace ネームスペース (URI) 1回のみ スクリプトを設置したドメイン @description ユーザスクリプトの説明 1回のみ なし @include スクリプトの動作対象URL 複数可能 *(全てのサイトが対象となる) @exclude スクリプトの動作除外URL 複数可能 なし(除外サイトなし) @nameプロパティは、本スクリプトの名称「hello」を指定しています。
.user.jsファイル名と同じにする必要はありません。 半角空白も利用できます。 @namespaceには通常、スクリプト作者のホームページURLなどを指定します。
@nameと@namespaceの組み合わせが同じスクリプトをインストールすると、重複して登録されず。 2回目以降は上書きになります。 Manege User Scriptの画面上には@nameで指定したスクリプト名のみが表示されます。 @descriptionは、動作の説明などを記述します。 @includeは動作対象のURLを指定します。
リスト1では「*」 なので、すべてのWebページが対象となります。 なお、動作対象のURLを指定するプロパティ@excludeは、リスト1では省略されています。 リスト1はグローバル変数を利用しない単純なプログラムですが、ユーザスクリプト内で変数を宣言したり関数を定義すると、
名前空間が汚されてしまいHTMLページ本体に埋め込まれたjavascrptプログラムにまで影響を与える可能性があります。 そこで、多くのユーザスクリプトでは無名関数を利用してスコープを限定する方法が利用されています。(リスト2)
メタデータはリスト1と同じです。 直感的にはわかりにくくなりますが、定義したばかりの無名関数をその場で実行しています。 リスト2
( function(){ document.title = "Hello, Worl! (anonymous function)"; }) (); さらに、実行タイミングをずらしてページ内のコンテンツを安全に書き換えられるようにしたのが(リスト3)です。
HTMLのダウンロードが終了して、ページ本体のonLoadイベントがあれば、それも終わった後にはじめて書き換えを行います。 リスト3
( function(){ windows.addEventListener( "Load", function(e){ document.title = "Hello, Worl! (addEventListener)"; }, false); }) (); Greasemonkey API
greasemonkeyのユーザスクリプトは基本的にfirefoxのjavascriptのすべての機能が利用できますが、それに加えてgreasemonkey apiとして7種類の特殊関数が定義されています。
GM_log( message, level)
message : ログ出力する文字列 level : ログレベル(0~2) 省略可能 0 メッセージとして出力(デフォルト値) 1 警告として出力 2 エラーとして出力 [ツール]→[javascriptコンソール]にログ出力する GM_setValue( name, value)
name : 変数名 value : 代入する値 Greasemonkeyでは、ユーザスクリプトごとに記録される変数を利用できます。 どのURLのWebページにアクセスしていても、同じユーザスクリプト内では変数地が共有されます。 また、この変数はWebブラウザを閉じても保持されます。 firefoxのアドレス欄で「about:config」を参照すれば変数の内容を確認できます。 GM_getValue( name, default)
name : 変数名 default : 未定義の場合に返されるデフォルト値 GM_setValue()で設定した変数の値を取得します。 GM_xmlhttpRequest( default )
以下のプロパティを持つオブジェクト method : メソッド (GET/POST) url : アクセス先URL data : POSTメソッド使用時のリクエストボディ headers : リクエストヘッダを指定するオブジェクト onload : 通信完了時にypばれるコールバック関数 戻り値なし HTTP通信が終了するとコールバック関数が呼び出されます。 コールバック関数の第一引数で得られるオブジェクトのresponseTextプロパティに、 サーバからのレスポンスボディ(テキスト)が入ります。 □sample var func = function(obj){alert(obj.responseText)}; GM_xmlhttpRequest({method:"get", url:"http://www.google.com", onload:func}); GM_addStyle( css )
css : スタイルシート(文字列) "body { color : red;}"のような文字列を指定できます GM_openInTab( url )
url : URL 指定したURLを新しいタブで開きます。 GM_registerMenuCommand( commandName,
commandFunc, accelKey, accelModifiers, accessKey) commandName : [ツール]→[User Script Commands]に表示するメニュー名 commandFunc : メニュー選択時に呼ばれる関数 戻り値なし [ツール]→[User Script Commands]にスクリプト独自のメニューを追加します。 メニューを選択した時のみページを置き換えたり、プロンプトを表示して入力を促したりすることができます。 第3引数以降でキーバインドを登録できる仕様ですが、省略可能です。 参照すれば変数の内容を確認できます。 |