オリジナルクライアント構想

どうも飽きる様子のないTwitter。前々からオリジナルのクライアントを作りたいと考えている。とはいえ、問題はいろいろ。
家ではMacでTwitterrificとWeb、職場ではWindowsでTwitとWebを使っている。MacにはTwitterPodもインストールしてあるけど、ログが大量になりすぎて重いので使っていない。Twitterrificはログに対してちょっとゆるくて、APIの取りこぼしに加えて、リクエストが届かないとそのまま固まったり、100件しか表示してなかったりする。ブラウザの右に表示してサイドバーのようにして眺める分には便利。あと、更新するとSkypeのステータスが更新されてしまったりする。Twitは大変便利。起動してからのログを蓄積、@を使った発言などの色分け、DM、ログからのReplies一覧表示(APIではない)。Webと併用しているのはAPIの70Requests/60minutes制限があるので、1リクエストで20件しか取得できないAPIで全発言を拾うのは不可能なときがあるからだ。あとはRepliesタブが使えたり、With_Others(With_Friends)を使わないと遅延している場合もあるから。
自分がTwitterクライアントを作るなら、このAPI制限とAPIの漏れを回避しつつ、RepliesやWith_Others機能をフルで使いたい。Webと併用しなくてもいいように。そのためにはAPI経由だけではもはや不可能。それとTwitのように色分けができたり、ログを蓄積できたり、ショートカットキーでWebに飛べたり、返信できたり。そうなるとWebからスクレイピングするしかないと思っている。
APIで取得できる発言部分はXMLで取得すると下記のようになる。

  <status>
    <created_at>Thu Jul 12 13:30:40 +0000 2007</created_at>
    <id>146493502</id>
    <text>てすてす、まいくてす</text>
    <user>
      <id>6520782</id>
      <name>japo</name>
      <screen_name>japo</screen_name>
      <location>Nagoya,Japan</location>
      <description>へたれプログラマー。 Programming, Bass, Mac, DUCATI</description>
      <profile_image_url>http://assets3.twitter.com/system/user/profile_image/6520782/normal/basara3.jpg?1184180772</profile_image_url>
      <url>http://d.hatena.ne.jp/japo99/</url>
      <protected>false</protected>
    </user>
  </status>

一方、スクレイピングするとなると、取得できる発言部分のHTMLは下記のようになる。

<tr class="hentry" id="status_146493502">
  <td class="thumb vcard author">
    <a href="http://twitter.com/japo" class="url"><img alt="japo" class="photo fn" src="http://assets1.twitter.com/system/user/profile_image/6520782/normal/basara3.jpg?1184180772" /></a>
  </td>
  <td class="content">	
    <strong><a href="http://twitter.com/japo" title="japo">japo</a></strong>
    <span class="entry-title entry-content">てすてす、まいくてす</span>
    <span class="meta entry-meta">
      <a href="http://twitter.com/japo/statuses/146493502" class="entry-date" rel="bookmark"> <abbr class="published" title="2007-07-12T13:30:40+00:00">less than 10 seconds</abbr> ago</a> from web
      <span id="status_actions_146493502">
        <a href="#" onclick="new Ajax.Request('/favourings/create/146493502', {asynchronous:true, evalScripts:true, onLoading:function(request){$('status_star_146493502').src='/images/icon_throbber.gif'}}); return false;"><img alt="Icon_star_empty" border="0" id="status_star_146493502" src="http://assets2.twitter.com/images/icon_star_empty.gif?1184213699" /></a>
        <a href="/status/destroy/146493502" onclick="if (confirm('Sure you want to delete this update? There is NO undo!')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);f.submit(); };return false;" title="Delete this update?"><img alt="Icon_trash" border="0" src="http://assets2.twitter.com/images/icon_trash.gif?1184213699" /></a>
      </span>
    </span>
  </td>
</tr>

どうやらAPIで取れる情報は一通りWebから取って来れそう。ここまでは調べた。
しかしデスクトップクライアントでスクレイピングとなるとちょっとやっかい。PerlRubyが使える状況は、やろうと思えばできるだろうけど、全てのユーザにその状況を求められはしない。使おうとすると、ユーザをかなり限定してしまうことになる。利用する敷居を高くするような方向には持っていきたくない。せっかく作るならインストールも簡単で誰でも使えるのがいいよな。
で、Java+Swing+Java用Webスクレイピングライブラリならそれらしいものができるかもと妄想中。ちょっと調べてみたけど、JavaにもWebスクレイピングライブラリがいくつかあるみたい。
id:lynmock氏がJavaでのクライアントを作られてて、それがヒントになっている。ダウンロードして、jarをダブルクリックで起動っていいよね。Javaのいいとこを有効に使えるケースだと思った。
Swingは大学の頃の卒業研究でJXTAを使ったP2Pクライアントを実装したときに使ったのでちょっと興味深い。
SWTという選択肢もあるけど、これだとPure Javaじゃなくなるし、本当にマルチプラットフォームで動かせるのか心配。

とはいえ、Mac専用クライアントの線も捨て置けない。正直、自宅よりも会社の方が快適にTwitterできたりする。まぁ、Alt+Tabの構えなんですけどね。自宅だとWebを何度もクリックしないといけないので正直面倒。Objective-Cも勉強中なので題材としてはちょうどいいかもとか。

Webも止まるような重い状態ではどんなクライアント作っても不自由が残るんだけどね。

もんもん。