u-ichiが書け書けと言ってきたので書いておく。
もともとは今年の頭にmixiの日記に書いていたものです。
なので、今はもっと良いやり方があるかもしれませんし、スクリプト変更方法も変わっちゃってるかもしれません。今でも通じるかどうかは未確認ですが、2008年3月の段階ではうまくいっていたやり方です。
以下そのまま転記。
//////////////////////////////////////////////////////
twitterからWindows Live Messengerのステータスをいじる方法
http://d.hatena.ne.jp/myrmecoleon/20070522/1179845918
上のリンク先で解説されているrss2psm Nutzを使ってTwitterのRSSからタイトルを拾ってきてメッセンジャーのステータス欄に表示させたんだけど、それとは逆にTwitPSMという、ステータス欄を変更すると同じ内容をTwitterにポストするスクリプトがある。
じゃあそれを組み合わせたら相互連携が実現できるんじゃね?とかうーいちが言うので試してみたら、カオスなことに。
rss2psm NutsがRSSを拾ってきてステータス欄を更新
↓
更新した瞬間にTwitPSMが変更を検知してTwitterにポスト
↓
rss2psmがポストを拾ってきてステータス欄に反映
↓
その瞬間またTwitPSMが変更検知してTwitterにポスト
・・・という恐ろしい無限ループに入ることが判明。
実験中に何回か無限ループにいれてしまってTwitterのポストがカオスになってしまったw
そこで、MPScriptのドキュメントとにらめっこしてスクリプト改造に着手。
http://mpscripts.net/docs/
まず最初に、相互連携とはちょっと関係ないけれどrss2psmの欠点解消に着手。
rss2psmのせいじゃないけども、rssのtitleをそのまま反映してるので
「jacopen: 発言」
のように、自分のTwitterネームが入ってしまう。でも自分の発言しか拾わせてないのに、わざわざネームを表示する必要はないのでこれを除去したい。
解決するには2つの方法しかない。
1.Titleから名前を除去したRSSを新たに生成
2.RSSを読ませてからスクリプト側で名前部分を除去
1はいろいろ応用が利くんだけど、どうもエレガントじゃない。あとめんどい
2のほうがシンプルなので2のほうを実装。
スクリプトの中からtitleを扱っている変数を見つけ出して、それにjavascriptのsubstr()メソッドを使って文字列から指定文字数を除去。jacopen: を除去するなら、substr(8)になる。たったこれだけ。ね、簡単でしょう?
if ( readTitle.length > 0 ) postTitle = readTitle[0].firstChild.nodeValue.substr(8);
こんな感じ。
次に無限ループの解消に着手。
TwitPSMはMPScriptのOnEvent_MyPsmChangeイベントを使って動いている様子。
なので、やり方としては
1.rss2psmがステータス変更するときに、一時的にイベントハンドラを削除する
2.特定の条件のときだけポストを見送る
の2つが思いつく。
1はremoveEventListenerで消せばいいけど、その後addEventListenerをして本当に動くのかちょっと不安だった。ので、もっとシンプルに2のほうを実装。
rss2psmはTitleを読んだ時に、最後に “by twitter”の文字を挿入する(変更可能だけど。)ので、変更された文字列にby twitterがマッチしたときはtwitterにpostしないという処理を追加。
具体的には
function OnEvent_MyPsmChange(new_psm){
Debug.Trace(new_psm);
Twitter.send(new_psm);
}
を
function OnEvent_MyPsmChange(new_psm){
if (!new_psm.match(/by\stwitter/)){
Debug.Trace(new_psm);
Twitter.send(new_psm);
}
}
にしただけ。ね、簡単でしょう?
まあそんなこんなで相互連携が実現しましたとさ。