クローラー対策にメアドをJavaScriptで表示してみる

車輪の再発明上等。
インターネット上にメールアドレスを生で書いておくと、そういうのを収集するクローラーに捕まってSPAM届きまくりいやーん、になりやすいので、例えばokela@saku2.comのように@を全角(@)にしてみたりとか、そういう感じの事をしてあることがあります。っていうか私もしてます。スパム来てるけど。
んで、こういう、人間なら正しいアドレスが分かるけど正しくないアドレスってのはユーザには不便だったりします。

<a href="mailto:foo@example.com">foo@example.com</a>

みたいなことができないし、コピペもできないし。


で、普通こういうのをクロールするときはそのクローラーJavaScriptなんか実行しないだろうと思うわけです。いや、するかもしれないけどね?
なので、アドレスはJavaScriptを使って表示させれば*1ロボットに収集されずに普通に便利に使えるんじゃないかというわけで。
でもJavaScriptソースコードに生でアドレス書いてたら、真面目なクローラーにはバレバレなわけで。
メアドは半角英数字なのでcharCodeを使って符号化した数字の配列として覚えておけば良いんじゃないかと。傍目にはただの数値配列にしか見えないからロボットにはバレる心配無し(たぶん)。
というわけでとりあえずこんなコードを書いてみる。
(同日追記:buildStringfromCharCodeArrayが、公開当初のだと破壊的メソッドになってたのでcodesを変更しないように変更。)

function buildStringFromCharCodeArray( codes ){
	var str = "";
	for(var i=0; i<codes.length; i++)
		str += String.fromCharCode(codes[i]);
	return str;
}
function getCharCodeArray( string ){
	var codes = new Array();
	for(var i=0; i<string.length; i++)
		codes.push(string.charCodeAt(i));
	return codes;
}

Firefox 2.0.2とSafari 2.0.4で動作確認済。IEはシラネ。
使い方は関数名の通り。buildStringFromCharCodeArray([84, 101, 115, 116]);とすれば"Test"という文字列が返る。
でもgetCharCodeArrayを普通に使ったらソースコード内に元になる文字列が残って意味無い罠。
なので、実際のコード内ではgetCharCodeArray無しで、予め変換した配列を直に書いときます。配列が欲しかったら↓をURL欄にコピペしてみると良い事あるかも。

javascript:void((function(){var codes=new Array(); var str=prompt("Input Text to get charCode Array");for(var i=0;i<str.length;i++)codes.push(str.charCodeAt(i));alert(codes);})());

んで、例えばこんな感じでメアドを取得する関数を作っておけば簡単に使える、かも。

function getAddress(){
	return buildStringFromCharCodeArray([111, 107, 101, 108, 97, 64, 115, 97, 107, 117, 50, 46, 99, 111, 109]);
}

20070809追記
メアドをスパムに利用されないように暗号化する「emailProtector.js」 - GIGAZINE
わざわざ鍵使って暗号化してるみたいだけど、そんな煩雑な手を使わんでも。

*1:noscriptで上述の全角にしたアドレスとかも書いときゃ良いし。