greasemonkey note
Last edited January 14, 2007
More by sktn »
user.scriptの書き方とgreasemonkey API の内容は何月かのsoftware designの特集の丸写しなので、このページのアドレスをあちこちに公開しないように!
grease monkeyとは

firefoxの拡張機能です
公式サイト

以下の項目からリンクをたどり拡張機能をインストールしましょう。

wikipedia 拡張機能より
  • Greasemonkey:一般のWebページに見た目の修正を行うスクリプトを追加する。
    • スクリプトはuserscripts.orgなどから手に入れることができる。
    • 目的に合ったスクリプトがない場合には、Platypusを使えば、コンテンツフォームを削除したり、コンテンツを回り込ませたり、ページにコンテンツを加えたりするスクリプトなどを自分のスクリプトとして作成する事もできる。 
user.script

Position
// ==UserScript==
// @name position
// @version 0.1
// @namespace http://133.67.35.137/s/
// @description position
// @include https://mail.google.com/*
// @include http://mail.google.com/*
// ==/UserScript

(function() {

function getNode(id){return document.getElementById(id);}

function set(id){
var node = getNode(id);
if(node != null){
node.style.position = 'fixed';
node.onclick = function(e){unset(id)};
}
}

function unset(id){
var node = getNode(id);
if(node != null){
node.style.position = '';
node.onclick = function(e){set(id)};
}
}
//document.onload = function(){set('nav');alert('ok');}
set('nav');

})();
 
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引数以降でキーバインドを登録できる仕様ですが、省略可能です。
参照すれば変数の内容を確認できます。

The content on this page is provided by a Google Notebook user, and Google assumes no responsibility for this content.