2011年5月5日木曜日

Common Lisp から Twitter 操作 cl-twitter


このエントリーをはてなブックマークに追加


タイトルの通り、cl-twitter というパッケージを使ってTwitterを操作してみます。



Windows7 64bit + sbcl + NTEmacs で動作を確認しています。

導入方法は簡単で、
CL-USER> (ql:quickload :cl-twitter)
CL-USER> (ql:quickload :cl-twit-repl)
以上。二つ目のcl-twit-replはREPLからcl-twitterを操作するための拡張パッケージっぽいです。


使うための準備
CL-USER> (in-package :cl-twitter)

初回のOAuth認証。事前にホームディレクトリに alias, access というディレクトリを作成しておく必要あり。
TWIT> (cl-twit-repl:cl-twit-repl)
URLが表示されるので、ブラウザからアクセスする。アプリからのアクセスを許可すると、PINコードが取得できるのでそれを入力する。これでOAuthのトークンやPINコードが、~/access/access.ht ファイルに保存され、次回からはこのファイルをロードするだけでアクセスできるようになる。


2回目以降
TWIT> (get-authenticated-user "username")
認証が完了すると操作ができるようになります。


タイムラインを取得するには以下の関数が使えます。
home-timeline
user-timeline
public-timeline
friends-timeline


試しに public-timelineを使ってみると、
TWIT> (public-timeline)

(#<TWEET 'ed20xx' id:66125386781696000>
 #<TWEET 'shatat_sports' id:66125386039296000>
 #<TWEET 'rokkmysoul' id:66125385733120000>
 #<TWEET 'KrisFogleTaylor' id:66125384269312000>
 #<TWEET 'ThePerfectQuran' id:66125383526912000>
 #<TWEET 'NooBoyssAllowed' id:66125382172160000>
 #<TWEET 'AmeTsuti' id:66125381756928000>
 #<TWEET 'ipaddisti' id:66125380184064000>
 #<TWEET 'LearningME' id:66125379550720000>
 #<TWEET 'YiNg_NP' id:66125378699264000>
 #<TWEET 'diariodelduero' id:66125376077824000>
 #<TWEET 'Nynaeve' id:66125375553536000>
 #<TWEET 'wahyusetiawan_' id:66125373565440000>
 #<TWEET 'brookluvv_ball' id:66125373259264000>
 #<TWEET 'huzya_ta' id:66125373150208000>
 #<TWEET 'iamidas' id:66125372407808000>
 #<TWEET 'PurpleTapeRec' id:66125368737792000>
 #<TWEET 'Translabot' id:66125367492096000>
 #<TWEET 'Soyletichas' id:66125366116352000>
 #<TWEET 'felipe_stewie' id:66125365176832000>)
こんな感じでTWEETクラスのオブジェクトが取得できる。


これをちゃんと読めるように展開するには、print-tweet を使う。
TWIT> (loop for i in (public-timeline)
            do (print-tweet i))

In mY way 4 six flags !!
by JorgeCdLo at Thu May 05 13:02:34 +0000 2011

#np Muse - Recess
by J0rtje at Thu May 05 13:02:34 +0000 2011

I usually like thursdays, but today I'm definitely NOT likeing. >:(
by b0NkERS19 at Thu May 05 13:02:34 +0000 2011

RT @Juwlaa: Ey... Mention me is:$
by BrandyJi_ at Thu May 05 13:02:34 +0000 2011
他にもTWEETクラスから要素を抽出する関数は他にも、tweet-text、twitter-user-screen-name、tweet-user tweet、tweet-created-at tweet 等の関数がある。


TWEETクラスの要素はこんな感じ
TWIT> (closer-common-lisp:class-slots (cl:find-class 'tweet))

(#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION ID>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION CONTRIBUTORS>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION CREATED-AT>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION TEXT>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SOURCE>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION TRUNCATED>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION FAVORITED>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION IN-REPLY-TO-STATUS-ID>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION IN-REPLY-TO-USER-ID>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION IN-REPLY-TO-SCREEN-NAME>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION GEO>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION GEO-ENABLED>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION USER>)


最後のUSER は TWITTER-USER クラスでスロットはこんな感じ、
TWIT> (closer-common-lisp:class-slots (cl:find-class 'twitter-user))

(#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION ID>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NAME>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SCREEN-NAME>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PASSWORD>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION ACCESS-TOKEN>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION DESCRIPTION>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION LOCATION>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-IMAGE-URL>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION URL>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROTECTED>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION VERIFIED>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION VERIFIED-PROFILE>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION CONTRIBUTORS-ENABLED>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION LANG>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION STATUS>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION GEO>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION GEO-ENABLED>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION CREATED-AT>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION FOLLOWING>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION FOLLOWERS-COUNT>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION STATUSES-COUNT>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION FRIENDS-COUNT>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION FAVOURITES-COUNT>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NOTIFICATIONS>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION UTC-OFFSET>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION TIME-ZONE>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-TEXT-COLOR>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-LINK-COLOR>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-SIDEBAR-COLOR>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-SIDEBAR-BORDER-COLOR>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-SIDEBAR-FILL-COLOR>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-BACKGROUND-COLOR>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-BACKGROUND-IMAGE-URL>
 #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION PROFILE-BACKGROUND-TILE>)


例えばあるユーザーのフォロワーを取得する場合はこんな感じ。
TWIT> (collect-follower-ids (slot-value (slot-value (first (public-timeline)) 'user) 'screen-name))

(145292454 148296004 190719795 84280484 66685391 173404989 242546543 270293370
 281882378 220582345 282956936 268383321 38171749 155540497 213171927 144235212
 264179461 272306716 274052039 229524588 226562017 121939366 152975539
 133668089 271511226 269306065 270897683 257927321 116923040 50736360 269797722
 259567967 261552036 261842048 134653449 241848687 108760825 125237799
 264631682 254818650 63735381 262546278 131467234 239639034 260701628 250576751
 258261000 243952856 206604184 84834664 126857176 12116282 170231949 123220734
 224185893 69218404 161319776 138759367 236048739 249388342 83988063 151493034
 135788580 200833598 53766870 248669171 116071199 242218358 68242517 152524337
 246541613 112740289 244895419 235487124 105131649 241070287 219236487
 127584000 133768597 223108086 125964142 219647201 177420588 150290482
 126904379 143399824 183264533 107762629 94760632 211875602 227510975 236534751
 232577573 223086057 228078460 142109831 166101094 181628667 146940325
 203009352 192287084 63097969 189642652 116127672 177191290 139984514 137287935
 138392746 126398368 108912820 163852662 159993240 131013911 105749163 74774130
 100344632 153970302)
パブリックタイムラインに出てくる最後のユーザ(いちばん発言が最近のユーザが最初に出てくる)のUSERオブジェクトを取得して、そこから表示名(screen-name)を取得し、その名前を使って collect-follower-ids を呼び出している。


こんな感じで取得されたIDから更にユーザ情報を抽出するにはこんな感じでできた。
TWIT> (let ((i (show-user-by-id 
            (first (collect-follower-ids 
               (slot-value (slot-value
                    (first (public-timeline)) 'user) 'screen-name))))))
       (list
         (slot-value i 'name)
         (slot-value i 'screen-name)
         (slot-value i 'following)
         (slot-value i 'followers-count)
         (slot-value i 'status)))

("fauzan asrizal" "fauzanasrizal" NIL 5 NIL)

CLOSとか理解できてないので、まだまだ使いこなせてないけど、これを使えばLispからTwitter操作ができそう。

0 件のコメント:

コメントを投稿