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?
- あざますw 今はちょっと仕様が違うみたいなので,Chromeとかで該当するボタンのソースからパターン見つけてやってくださいw -- Tokoro?