JavaScript?

Facebookの「あいさつ」を自動的に返す - Javascript

概要

  • rogy内でFacebookのあいさつテロが横行している
  • 中にはあいさつ返しに追われて作業が1時間停止する者まで現れた
  • そこで、Greasemonkeyを使ってFacebookの「あいさつ」を自動的に返したい
  • XPathで「あいさつを返す」リンクを指定してオブジェクトを根こそぎ刈ってくる
  • それぞれに対して、clickイベントを発生させればいけるはず
  • リアルタイムっぽくするためにsetIntervalで一定間隔(500〜1000ms)で実行する

実装

まずは、Firefoxのアドオンである、XPath Checkerを使って「あいさつを返す」のリンクのXPathを調べると、次のようにわかる。

これでは少しややこしいので、周辺のソースコードを読んでみると、ajaxify属性をもつaタグがみつかった。これを取得すれば良い。XPathのあいまい検索を使って、

 //*[contains(@ajaxify,'pokes')]

のように書くことができた。

次に、これに該当するエレメントを取得するためのスクリプトを書く。
XPathを指定してエレメントを取得するには、次のように書く。

 document.evaluate(xpath,document,null,7,null);

xpathにXPathを指定する。これは関数としてしまいたいので、Greasemonkeyから呼び出すときは以下のようにするとよい。

 (function(){
 	function $x(path,d){
 		if(!d) d=document;
 		return document.evaluate(path,d,null,7,null);
 	}
 	var pokelinks=$x('//*[contains(@ajaxify,"pokes")]');
 	if(pokelinks.snapshotLength>0){
 		alert("poke!");
 	}
 })();

実行すると、未処理のあいさつが存在するときに「poke!」がダイアログ表示される。
これで準備はほぼ整った。あとはこのpokelinksの中のそれぞれのエレメントに対してclickイベントを発生させる関数を作り、それをsetIntervalで呼び出すだけだ。

 (function(){
 	function $x(path,d){
 		if(!d) d=document;
 		return document.evaluate(path,d,null,7,null);
 	}
 	var pokeback = function(){
 		var pokelinks=$x('//*[contains(@ajaxify,"pokes")]'),pokelink;
 		for(i=0;i<pokelinks.snapshotLength;i++){
 			pokelink=pokelinks.snapshotItem(i);
 			if(pokelink.ajaxify!=""){
 				pokelink.click();
 			}
 		}
 	};
 	setInterval(pokeback,500);    // interval=500ms
 })();

意外とすんなりと動いた。500ms間隔は短すぎるかも。1000msで実用上は十分であろう。

拡張(1/31更新)

あいさつに温かみがないという指摘があったため、setIntervalによる一定間隔の返信ではなく、より人間味のある返信を試みた。
まず、乱数を導入してすぐに返ってくる/一定間隔で返ってくるのを防止、更にあいさつラッシュ時にはこれまでどおり機械的に返すという2つのパターンを用意することで人間味を持たせることに成功した。
具体的には以下のようなコードに差し替えた。

(function(){
	function $x(path,d){
		if(!d) d=document;
		return document.evaluate(path,d,null,7,null);
	}
	var retnum=0;
	var pokeback = function(){
		var pokelinks=$x('//*[contains(@ajaxify,"pokes")]'),pokelink,timeval;
		if(retnum>1&&pokelinks.snapshotLength>0){
			timeval=Math.floor(Math.random()*4300);
		} else {
			timeval=0;
		}
		retnum=0;
		for(i=0;i<pokelinks.snapshotLength;i++){
			pokelink=pokelinks.snapshotItem(i);
			if(pokelink.ajaxify!=""){
				pokelink.click();
				retnum++;
			}
		}
		setTimeout(pokeback,500+timeval);
	};
	reply();
})();

配布

ソースコード書いてあるし配布しなくていいよね

コメントはこちら

  • おもしろいですw -- @mattarila? 2013-11-10 (日) 04:52:26
  • あざますw 今はちょっと仕様が違うみたいなので,Chromeとかで該当するボタンのソースからパターン見つけてやってくださいw -- Tokoro? 2013-11-11 (月) 01:35:19


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-01-03 (金) 17:31:38 (1327d)