Greasemonkey

Blog Hackers Conference 2005からかなり経ちました.遅ればせながら私もGreasemonkeyを使ってみようと思っています.そんなこんなで作ってみたのがログイン用のuser.jsです.BizGooという企業向けサイトへのログイン,ログアウトをサポートします.

// ==UserScript==
// @name        BizGooLoginOut
// @namespace   http://d.hatena.ne.jp/kdaiba/
// @description Login Logout BizGoo
// @include     http://biz2.goo.ne.jp/ssl.jsp
// @include     https://biz2.goo.ne.jp/html/theme/new00/totalmenu.jsp
// ==/UserScript==

function xpath(query){
	var all;
	all = document.evaluate(query, document, null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	return all.snapshotItem(0);
}

var cid, uid, pass, form, out;

if (window.location.href == 'http://biz2.goo.ne.jp/ssl.jsp'){
	cid  = xpath("//input[@name='vcid']");
	uid  = xpath("//input[@name='vuid']");
	pass = xpath("//input[@name='vpasswd']");
	form = xpath("//form[@name='item']");
	cid.value  = '企業コード';
	uid.value  = 'ユーザID';
	pass.value = 'パスワード';
	form.submit();
}else{
	out = xpath("//a[@onClick='sso_logout_all();']");
	out.addEventListener('click', function(event){
		alert('NOT EFFECT. Please close this window');
		event.stopPropagation();
		event.preventDefault();
	}, true);
}

if (window.location.href == 'http://biz2.goo.ne.jp/ssl.jsp'){

の部分が,ログイン時にアクセスしているURLです.この部分にアクセスすると,Greasemonkeyが企業コード,ユーザID,パスワードを設定し,サーバにデータを送信します.URLはhttpになっていますが,POSTする際にはhttpsを使っているので,セキュリティ的に問題ありません.もっとも,ユーザIDやパスワードを平文で書いてること自体が問題です.

out = xpath("//a[@onClick='sso_logout_all();']")

から始まる部分は,ログイン中に表示される「ログアウトボタン」を探している箇所です.ボタンをクリックした際のイベントを横取りし,標準のログアウト関数が動かないようにしています.これをやらないと,ログアウトボタンを押す→ログイン画面に戻る→Greasemonkeyがログイン処理→元通り,ってことになってしまいます.ログアウト処理では,サーバ側のセッション削除,クライアント側のクッキー削除を行なっているようなので,この対処はセキュリティ的に問題あります.でも,初めてだし,自分用のメモだから,いいかなと.JavaScriptを触ったのが久しぶりなので,色々思い出さないとやりたいことが中々できません.今後は,地道に色々なスクリプトを作っていきたいと思ってます.