wxPythonを使ったTwitterのGUIクライアント

2012/12/01 追記:Twitterでは、BASIC認証をすでに廃止してOAuthが必須となっているため、本エントリでのタイムラインの取得は動作しません。

wxPythontwitter-pythonライブラリを用いてTwitterGUIクライアントを作った。認証などに関してライブラリによる違いやAPIを自分が調べた範囲で書いておく。他の人の役に立てば幸い。

クライアントは以下の2つのファイルから構成される。

simpletweet.py 直
simpletweet.xrc 直


利用するには2つのファイルを同じディレクトリに保存して、ファイル冒頭の

  • username
  • password

という2つの変数に自分のアカウント情報をタイプしてあとは実行すればいい。

実行環境にPythonwxPythontwitter-pythonライブラリが必要で、さらにtwitter-pythonはsimplejsonライブラリに依存している。

方針

自分自身が高度なTwitterユーザではないのでリスト機能だとかfavoriteだとかよくわからないし使わないやー、と思ったので、

  • ユーザタイムラインをリアルタイムに表示できる
  • ユーザのプロフィール画像を表示できる
  • postができる
  • RT、公式RTが簡単にできる

という最低限の機能を持ったクライアントになるよう作った。

機能

ユーザタイムラインの表示に加えて

  • Ctrl + Alt + Rで入力欄にRTを挿入
  • Ctrl + Alt + Xで公式RT

の2つのショートカットが使える。

今回作成したクライアントはBasic認証を用いて60秒に1度サーバにアクセスすることで表示を更新する。

UIはWindowsTwitterクライアントのTwitを参考にさせてもらった。

実装してみて

wxPythonのドキュメントが少ない

ネットで手に入るwxPythonのドキュメントは総じて不十分だ。特に、特にイベントハンドリングに関してはコーディングの際にwxPythonのベースとなるwxWidgetsの資料に当たらないとコーディングできない事が多い。wxPythonでのみ利用可能なmixinなどのドキュメントにはその使い方すらまともに解説されていないものも多い。また、GUIパーツのレイアウトとロジックを分離するためのXRCという仕組みに関しても備忘録程度の情報しかない。wxPython In Actionにはその単語すらでてこない始末。なんだか悲しくなってきた。

思わず他のGUIライブラリについて調査してみたり。wxWidgetsと同様のクロスプラットフォームGUIライブラリとしてQtがある。こちらは使った事がないのでよくわからない。後発のためより洗練されている、らしい。QtのGUIデザイナのQt Designerを使ってみた感じでは、サイザーを使った面倒なレイアウトを必要とせずより簡単にGUIを構築できそうな印象をうけた。

wxPythonGUIデザイナが微妙

GUIのレイアウトを検討するときに、いちいちvimで開いてパラメータを調整して実行してみて目で確認、なんて煩雑なことはやってられないのでwxGladeというGUIデザイナを用いてレイアウトを記述した。このwxGlade、突然落ちたりパスに日本語が含まれているとファイルを読めないだの中々微妙な代物。ないよりまし位の信頼度で使った。

以前にwxGladeを使った記事
wxGladeでGUIアプリを構築してみた

ユーザのプロフィール画像の扱いには工夫が必要そう

各postにはユーザのプロフィール画像の情報がある。GUIにpostの情報を表示するときに、画像をその都度HTTPリクエストで取得していてはリクエストの回数が多くなりサーバに大きな負担をかけるし、クライアントの動作が緩慢になってしまう。そこでユーザ画像をローカルにキャッシュして、画像が更新されたら必要に応じてリクエストして読み込むように書いた。この方法ならTwitterのサーバに負担をかけないだけでなく、ユーザの体感速度も上がる。

もっと簡単に考えて、取得されたpostを全てメモリ上のsqlite DBに格納してしまうのもいいかもしれない。TLに表示されていた5人分のプロフィール画像を適当に保存してサイズを計ったら大きい物で8KBぐらいだったので、10000postで78MBか。ちょっと大きいかも。

複数の認証方法がある

現状、認証方法に

の2つの方法もある。将来的にはOAuthに移行するらしくこれからクライアントを作成するならばOAuthに対応させるべき。この点、作り始めは分からずOAuthに対応していないtwitter-pythonを利用してしまった。Basic認証OAuth認証の機能の最大の違いはポストの「from ○」の部分をアプリケーション側で与える事ができるかどうか。

twitter-pythonライブラリについて

twitter-pythonは簡単に使えるため手軽にタイムラインを取得したりポストするのに適してはいるが、一方でOAuthや公式RTに対応していないなど古くなっている点は否めない。
より高機能なライブラリとしてtweepyというのがあるようだ。tweepyはOAuthとStreaming APIの両方に対応しているようなのでこれからPythonでクライアントを作るならtwitter-pythonよりもtweepyのほうが良い。クライアントならやっぱりfromうんちゃらの部分を出したい。

Streaming API

このクライアントではREST APIを使った。TwitterはこのAPIの他にStreaming APIを公開している。Streaming APIは今年から正式に利用可能になったAPIで、Twitterのポストをプッシュ型で受け取る事ができるらしい。今回のクライアントの実装のように、ポーリングループで一定時間待機して定期的にサーバにアクセスするのではなく、サーバと接続しっぱなしでリアルタイムにどんどん通知を受けられるようになる。
便利なAPIだが、実際にこれを使ったクライアントの開発者によると

  • フォロワーの数に制限がある
  • 接続が不安定
  • タイムラインを取得できないユーザが存在する

などなかなかきつい制限のため、クライアントの実装の際にはStreaming APIで可能な限りリアルタイムにポストを取得しつつ、取得できない部分をREST APIで補うなどというように適宜使い分ける必要があるようだ。将来的にはもっと安定で高機能なAPIになるのかもしれない。

参考

Twitter API Document
QtとPyQt
UsingXmlResources
UbuntuのOpenOffice.orgで入力中の行が上下に揺れる

wxPython in Action

wxPython in Action