日記「芦」

「君は恐縮しながら図々しいことをやる男だね。」(阿佐田哲也著「麻雀放浪記(四)」より) Twitterでいろいろ遊ぶメモ - JScript 2011/3/11(Fri.)
TwitterはAPIを公開しているのでそれを使うべきなんですが、ネットで資料漁って
勉強してみたんですが、どうもわからないです。今度本でも立ち読みして勉強した方が
いいのかな。

で、苦し紛れにこんな手法を。
JScriptでIEを操作。
IEでhttp://mobile.twitter.com/にアクセスしてブラウジング。
データの取得はHTMLの解析。
呆れるほど単純ですね。はい
IEエンジンを挟むのできっとAPIを使うスマートなやり方に比べて動作は重いんでしょうね。
もちろんウィンドウを表示させたりはしませんが、それでも。
あ、APIを利用しないということは当然API制限に引っかかりません。やったー

IEハンドラ
ie=new ActiveXObject("InternetExplorer.Application");
IEハンドラっていう呼称は今考えた。オブジェクトだよね。これを使って
IEが操作できます。ウィンドウハンドラみたいなもんやろ。
ちなみにie.visible=true;とすると実際にIEのウィンドウが表示され、何をやっている
かがリアルタイムに見られます。もちろんその分処理がかかります。

これ以降のコードではこの変数var ieを用います。グローバル変数にしたらいい
と思う。

ログイン
ie.Navigate("https://mobile.twitter.com/session/new");
while(ie.Busy||ie.ReadyState!=4)WScript.Sleep(100);
ie.document.getElementById("username").value=username;//ユーザーネーム
ie.document.getElementById("password").value=password;//パスワード。
ie.document.forms[0].submit();
while(ie.Busy||ie.ReadyState!=4)WScript.Sleep(100);
ログインした、という何か(クッキー?)はIEの方に残るみたいですが、何も考えず
プログラムの初めに毎回行わせています。

ポスト
ie.Navigate("http://mobile.twitter.com/");
while(ie.Busy||ie.ReadyState != 4)WScript.Sleep(100);
ie.document.getElementById("tweet_text").value=tweets;//投稿の内容。
ie.document.forms[0].submit();
while(ie.Busy||ie.ReadyState != 4)WScript.Sleep(100);

@リプライ
ポストする際に投稿の内容の頭に"@username "を付け、submit()の直前に
ie.document.getElementById("tweet_in_reply_to_status_id").value=id;
の一行を挿入します。
このvar idとは相手の呟きのstatus idです。頑張って取得して下さい。

自分への@リプライ取得
var index=0;//後述
ie.Navigate("http://mobile.twitter.com/replies");
while(ie.Busy||ie.ReadyState!=4)WScript.Sleep(100);
X=ie.document.getElementById("tweets-list").getElementsByTagName("div")[index*4];
Y=X.getElementsByTagName("span")[0];
id=eval(String(X.id).replace("tweet_",""));
user=Y.getElementsByTagName("strong")[0].getElementsByTagName("a")[0].innerHTML;
twt=Y.getElementsByTagName("span")[0].innerHTML.replace(/@.+<\/A>/g,"");
twt_index=twt.indexOf("</a>");
twt_index=twt_index==-1?0:twt_index+4;
twt=twt.slice(twt_index,twt.length);
return {"user":user,"twt":twt,"id":id};
自分への@リプライの内、最も最近のがindex=0です。
index=1,2,3..としてくことで次々に古いのが取得できます。

関数でもないのに最後にreturnしてますが、返しているオブジェクトを取得内容とします。
実はもっと解析すればほとんどの情報が取得できます。IDとは別の名前(screen_nameだっけ?)
とかタイムゾーンだとか。

あ、で、idというのがその呟きのstatus idです。先に書いたリプを返す時に使用できます。


以上。
投稿は「via Mobile web」ということになります。botを作るだけならこれで十分です。//

おまけ。
音楽を鳴らす。
ie.Navigate("file:///C:/Users/owner/Desktop/iraiza/downtown.mp3");
なかなか卑怯ですね。
IEで音楽ファイル(フルパスであること)にアクセスします。
初回だと「保存しますか、開きますか」みたいなダイアログが出るので、「開く」にチェックし、
かつ「次回からも同じようにする」にもチェックすれば二回目以降は音楽ファイルに
アクセスしたら即、適当な音楽プレイヤが起動して音楽を鳴らします。

コメ(0) | トラ(0)


(c)Kero's World