学校でウェブコンピューティングという授業のためにpythonでTwitterやら他のWEB系のサービスのマッシュアップを体験してみよう、という課題をやっていました。
いやー、エクストリームでした。やっぱりね、3週間とかもっと期間あったのに他のことにかまけているから残り5日でpythonの文法学習から始まってOAuth認証の仕方をググりまくって期限1時間前にやっと完成するとかそういうアホみたいなことになるんですよ。
というわけで今回のプログラム
○やったこと
Twitterからプログラム実行した日のツイート全部取得してその中からキーワードをピックアップして今日という日を振り返るCUIプログラムを書いた。所謂マッシュアップというもの。TwitterからAPI制限とかされて理由がわからず苦労した。今思えばAPI制限だと思うのだけどやっている時は突然データが取得できなくなって絶望した。リポD一杯飲んだ。
○マッシュアップって?
他の団体が提供しているサービスを組み合わせて新しいサービスを作ること。
(正確な定義かわかりません。個人の意見です)
現在色々な団体がGET/POST方式で様々なサービスを提供していまして、それらから簡単に自分のサービスを登録して権限を貰えばそのAPIサービスを利用できます。
例えばyahooのテキスト解析、したのHOGEHOGEの部分に自分が取得したappidを入力するとXMLが返ってきます。appidを入力せずにアクセスしようとすると権限ねぇよ!!みたいな返答が返ってくるはずです
URLにリクエストを直接書くのをGET方式、書かないのをPOST方式と呼ぶそうです。すいません、詳細はよくわかっていません。
Googleが提供する、Googleマップやグラフ描写のためのAPIからマッシュアップブームが始まった、みたいな認識で僕はいます。
Google検索で、「API 一覧」と検索すると一杯API一覧みたいなまとめページがひっかかります。代表的な所でhttp://www.find-job.net/startup/api-2013を紹介します。
今回はTwitterとYahooのAPIを利用しました。YahooのAPI,とっても扱いやすくてブラウザで直接URLに貼り付けて遊んでみるのが理解の手助けになりました。
それが終わったらpythonのインタラクティブモードでurlopenを使って叩いて返信を見てました。
で返信は上のようなXMLかJSONの形式で返ってくるのが一般的のようですが、自分でいちいちパースするのはめんどくさい。主なAPIサービスにはこれを便利に使うためのライブラリが提供されています。Twitterなんかはいっぱい色々な言語のライブラリがありますね。
Twitterの開発者ページにも紹介されています(Twitter Libraries : https://dev.twitter.com/docs/twitter-libraries)
まぁそうじゃなくてもXMLのパーサーは外部のライブラリとして様々な言語で提供されていると思います。
○道具
1.python2.5.7(だったかな?)
2.tweepy(Twitterとやり取りするための外部ライブラリ)
https://github.com/tweepy/tweepy
3.BeautifulSoup(XMLのパーサー)
http://www.crummy.com/software/BeautifulSoup/
4.Yahooが提供するテキスト解析・キーワード抽出API
pythonは外部のライブラリは簡単にインストールできて快適でした。今回はpipというライブラリ管理のためのツールをこれまたapt-getでお手軽にインストールして行いました。楽ちんですね。
pip : https://pypi.python.org/pypi/pip
○結果
ソースコードはこちら
https://gist.github.com/tokunomaddojp/6190712
※注意:そのままでは動きません。
・Twitterの開発者ページからコンシューマー・キーとコンシューマー・シークレットを取得(https://dev.twitter.com/)
・Yahooの開発者ページ(http://developer.yahoo.co.jp/)
からappidを取得
して、ソースコードの一部を書き換える必要があります。
危険な第三者に渡ると僕が困るのでこれらのキーは秘密です。
ほんとにやってることは単純です。
・初回利用ならば、Twitterにアクセスしてアクセスのためのキーを貰う
(次回のためにそのキーを保存する)
・ツイートをその人のその日の分だけ全部取得する
・それをくっつけてYahooのキーフレーズ抽出サービスに投げる
・結果をプリントする
これをやっているだけです。 ソースもこの前までアップロードしていたOCamlのものよりも読みやすい?いや型情報がソース内にないので雰囲気は分かるんだけども困ることも。
○考察:pythonって良い言語なのかな?
すいません、マサカリ投げるみたいな事を書いてますがまずは純粋に自分が不便だなぁと思ったことを書いておきます。これは動的型付け言語の特性なのかpythonの特性なのかほんとはちゃんと考えなきゃいけないところですが、取り急ぎ上げてみます。
いつもは単純な処理であればOCamlを書くので、
・ソース書く
・コンパイラが怒る エラー箇所を教えてくれる
・ソース修正する 振り出しに戻る
を繰り返していたのですが、python書いててどこでエラーが起きたのかわかりづらいと感じました。特にホントに単純な、例えばオブジェクトにないメソッドやメンバにアクセスしようとしているようなエラーは、なるべく実行前に分かりたい。
実際に実行しないとわからないので、後の方の処理にそういうエラーが含まれていると前半の処理が終わってからじゃないとエラーを検出してくれないので、不便だなぁと思って次第です。またNoneであるメンバにアクセスしようとして落ちたりなんでNoneなんだろって散々考えたり、すこし困ったなぁと思いました。
あとは書いてる時にあまり型を意識できないなぁと思いました。OCamlだと型の設計からするのですが、そういうアプローチがやりにくい?自分が良く出来てないだけかもしれませんが、そういう方法が取りづらいんじゃないのかなぁと。
そいう意味でちょっと普段使う静的な型付け言語と違うなぁと思いつつ、pythonは良いところも色々と感じました。
・WEB系の情報が集まっている(当たり前?
・情報量が多い(これもメジャーな言語なら当然?
・学習しやすい、わかりやすい、コードが簡潔
実際C, SML,OCamlなどを学習している時よりも、実際に動くコードを書けるようになるまでの時間は断然短かったです。とても分かりやすいと感じました。
また日本語の書籍が沢山あるので(僕の普段使う言語が無いだけかもしれない…。)とても簡単に情報にアクセスできました。大学図書館大活躍です。
たまには関数型言語以外の言語も扱うのは良いエキササイズになるなぁと思った次第です。CとML系言語のみって、見てる範囲が狭いですね。
ホントはCGIサーバーをローカルで立ててブラウザ上で動くようなプログラムにしたかったのですが、挫折しました。友人Nよ、チュートリアルしてもらったのにすまぬ。
TwitterのOAuth認証をブラウザ上でどうやったら良いのか分からなかったんや…。
次回、python触る機会があればブラウザ上で動かしたいですね。djangoのウェブフレームワークのチュートリアルもやったのですが結局それは役に立たず。そういうのを触ってからじゃないとちゃんとした評価はできないんじゃないかと。
よーし、もっとがんばるぞー。
○参考文献:主に参考にしたサイト様
分かりやすいtweepyを用いたpythonによるツイッターを扱うチュートリアル
#junki::acoustic : PythonでYahoo! APIのキーフレーズ検索、画像検索を使う
同じく分かりやすいYahooAPIのチュートリアル
BeautifulSoupの存在もこのページで知りました
Lindoc : みんなのPython Webアプリ編 柴田 純著
無料公開されている分かりやすいpythonの参考書
CGIは結局使わなかったのですが少しWEBの仕組みがわかった気がしました。感謝!