YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

コマンドラインで動作するTwitterクライアントを30分くらいで作れるPythonはかっこいい

はじめに

こんにちは、Python界のほぼ日手帳です。RSSリーダーを眺めてたら、なんかPythonを使ってTwitterコマンドラインアプリを作る見たいのがはやってたみたいなのでまぜてまぜてー。というわけで書きました。

とりあえず作り散らかした

forkでもspoonでもなんでもしてください。

準備

Pythonライブラリ

最近はPyPIに便利パッケージが増えましたね、めでたいめでたい。Twitterでタイムライン取得や発言をするだけならtweepyが便利だぜ。OAuth 1.0対応。あとコマンドラインアプリケーションは標準モジュールのcmdモジュールで作る。こんだけ。Python入ってて、easy_installとか入ってる人なら10秒だね。

$ easy_install tweepy
アプリケーションの準備

すでにTwitterにアプリケーション登録したよって人はいいんですが、まだの人はしましょう。

ここにログインして、からYour appsってところをクリック。右側のRegister a new appをクリック。
f:id:ymotongpoo:20110127231626p:image
でもって適当に名前登録したりしてください。注意するのは

  • Application Type : client
  • Default Access Type : Read & Write

にするくらいです。で登録できたらConsumer keyとConsumer secretっていうのが書かれてると思うんでメモ。
さらに以前と比べてだいぶ管理画面が楽になって、そのページの右側にMy Access Tokenていうのがあるんでクリックしてください。
f:id:ymotongpoo:20110127231627p:image
これで自分のアカウントでのAccess tokenとAccess token secretがわかります。TwitterではOAuth 1.0用のAccess tokenとAccess token secretはexpireしないので、これをメモっとけばもうこのアプリケーションを自分のアカウントから使いたい放題です。*1

それじゃ早速アプリを起動

お手数ですがgithubから落としてきてください。「git入れてねえよ!」って人はzipで。入れたら設定ファイルであるconf.pyを書きます。サンプルがあるのでコピって編集です。設定ファイルっていってもauth系の変数だけですが。

$ git clone git@github.com:ymotongpoo/TwCmd.git
$ cd TwCmd
$ cp conf.py.sample conf.py
$ vim conf.py
# -*- coding: utf-8 -*-

consumer_key = "<さっきゲットしたconsumer key>"
consumer_secret = "<さっきゲットしたconsumer secret>"
#access_token = None <-- こっちがデフォルト
#access_secret = None <-- こっちがデフォルト

# if you get access token and access token secret
# you can assign them here
access_token = "<手に入れたAccess token>"
access_secret = "<手に入れたAccess token secret>"

さて起動します。

$ python TwCmd.py

そうするとこんな感じでバナーがでます。
f:id:ymotongpoo:20110127231628p:image
ぶっちゃけこれがやりたかっただけです!まあ簡単な操作の説明だけ。まずログインします。auth系の諸々を登録していてもloginコマンドは絶対。

Twitter >>> login
ymotongpoo logged in

ログインに成功すると上のようになります。で、タイムラインをみるのはtlコマンド。

Twitter >>> tl 10

[2011-01-27 14:29:23] : wyukawa >> s/みやび/みやぎ

...

[2011-01-27 14:32:24] : chkfj >> あしたこそ早く起きるの締切ってなんだよwww

Twitter >>> 

まあこんな感じで表示されます。普通のクライアントは上の方が最新ですが、シェルの特性を考えて下を最新にしました。tlコマンドは引数なしでも起動できますし、第1引数に数字を渡すと最新からその数だけ取ってきます。引数なしのデフォルトは30個。
発言したいときはtwコマンド。

Twitter >>> tw テストです

第1引数に発言を書いてください。半角スペースがあっても大丈夫です。
最後にmentionsというコマンドを。これは名前のとおりmentionを確認できます。

Twitter >>> mentions

引数なしで20個最新のmentionを取得します。とりあえず今のところこれだけしか実装してませんが、十分使えますよ。これが30分もしないで出来てしまうのでPythonって便利ですねー。

ちょっとだけ解説

tweepyの部分

「別にコマンドラインアプリとかどうでもいいからtweepyでOAuthつかって発言するところだけ教えろ!」って人は次のコードでいいです。

import tweepy

# secretsって辞書にさっきのauth系の値いれたと思ってください
auth = tweepy.OAuthHandler(secrets['consumer_key'], 
                           secrets['consumer_secret'])
auth.set_access_token(secrets['access_token'], 
                      secrets['access_secret'])
api = tweepy.API(auth)
api.update_status(u'テスト')

めちゃ簡単ですね。メソッドは上にリンク貼ったAPIドキュメントに載ってます。ドキュメント見るとUserとかStatusに関してはmodelのドキュメントを見ろって書いてあるけど、そんなものはありません。でもTwitterの公式APIでjsonを確認してもらえばいいです。tweepyはmodels.pyでモデルを定義してますが、こんな感じの実装になってます。

たとえばStatusクラス(各発言用のクラス)の場合。

class Status(Model):

    @classmethod
    def parse(cls, api, json):
        status = cls(api)
        for k, v in json.items():
            if k == 'user':
                user = User.parse(api, v)
                setattr(status, 'author', user)
                setattr(status, 'user', user) # DEPRECIATED
            elif k == 'created_at':
                setattr(status, k, parse_datetime(v))
            elif k == 'source':
                if '<' in v:
                    setattr(status, k, parse_html_value(v))
                    setattr(status, 'source_url', parse_a_href(v))
                else:
                    setattr(status, k, v)
                    setattr(status, 'source_url', None)
            elif k == 'retweeted_status':
                setattr(status, k, Status.parse(api, v))
            else:
                setattr(status, k, v)
        return status
...

要するにjsonから取得した辞書のキーと値をそのまま各モデルのattributeにしてます。だからこういう感じでドットでキーの名前をつないでいけばそのまま値を取得できます。(公式ドキュメントにその扱い方の記載がないのがちょっと不親切だと思うけど)

timeline = self.api.home_timeline(count=num)
timeline.reverse()
for tw in timeline:
    print (tweet_tmpl
           % (tw.created_at, tw.user.screen_name, tw.text))

まああとはよろしくやってください。

cmdモジュール

cmdモジュールは標準ライブラリのドキュメントを読めば使い方がバッチリわかります。自分がちょっと引っかかったところだけ挙げると

  • Cmdクラスは旧スタイルクラス
  • Cmd.emptyline()はオーバーライドしないとうざい

くらいですかねえ。公式ドキュメントのサンプルコードやここに貼った便所コードをいじってれば使い方がわかると思います。基本的にはdo_xxxとhelp_xxxというメソッドを追加してやるだけです。第0引数(コマンド名)はCmdモジュールの方で勝手にパースしてくれるし、対応するコマンドがなければhelp_xxxの内容を全部表示してくれます。僕が解説するより公式ドキュメントにほんとに詳しく書いてあるのでそっち推奨。
まあそんな感じでPythonは標準モジュールを使ってコマンドラインアプリを簡単に作れるよという話でした。コード書いてた時間よりこの記事書いてる時間のほうが長かった。

*1:それもどうかと思うけど