golangでTwitterのタイムラインをブラウザに表示させてみた。

Posted by kwmt on Wed, May 23, 2012

まえおき

Andrew Gerrandさんのgithubはgolangの宝の宝庫。その中に

https://github.com/nf/gotweet{.broken_link}というTwitter APIを使うサンプルがあったので(2013/04/07追加 リポジトリが削除されてました)、

参考にさせてもらって、それにGAEのチュートリアルをあわせて、

Twitterのuser_timelineをブラウザに表示させるようにしてみました。

準備

gotweetのプロジェクトをcloneします。(あとで名前をgotweet_changeプロジェクトに変更しています)

READMEにも書かれてますが、mrjonesさんのoauthライブラリを使用するので、まずインストールしてください。

go install とありますが、うまく動かなかったので、clone しています。

(goファイルのimport文には"github.com/mrjones/oauth"となっているのを

"oauth"と変更しています。)

clone先のディレクトリは、僕が確認したのは、myappのGAEのプロジェクトだとすると、myappディレクトリの直下においてください。

下図のようなイメージです。

READMEには、ドキュメントを読んでください、と書いています。oauthライブラリの使い方の説明などが書いています。

(まだ軽くしか読んでないので、いずれちゃんと読みます。。)

実際にTwitterAPIを使用する際は、

Consumer IDとConsumer Secret をTwitter Devloperサイト{.broken_link}から取得しておいてください。

ソースごにょごにょ

全体のソースはgithubにあげました。

忘れそうなポイントだけ書いておくことにします。

JSONデータのたくさんのパラメータから、type structで取得したいパラメータ名のみを定義すると、

そのパラメータのみ取得できます。(取得したいデータを絞り込むことができます)

下記は、TwitterのtimelineをGETしてパースしてテンプレートに出力しているところです。

コメント参照。

Go version 1 になってからかなりのパッケージが変更になっています。詳細は以下のページが分りやすいかもです。

http://golang.org/doc/go1.html#packages

たとえば、"json""json"だけでよかったのが、"encoding/json"と変更になっています。

7行目のjson.Unmarshalについて、

JSONエンコードされたデータ(ここではbody)を解析し、tweetsに格納しています。

template.ParseFiles()の引数で

テンプレートとなるファイルを指定することが出来ます。template.ParseFiles("template/tweet.html")と書くと、

gotweet_changeプロジェクトであれば、gotweet_change/template/tweet.htmlとしてテンプレートファイルを作成します。

また、template.ParseFiles()の引数には、複数ファイルを指定することができ、

たとえば、header.html、main.html、footer.htmlなどに分けることができます。

さて、tweet.htmlの中身は以下のようになっています。

{{range .}} T1 {{end}}T1を繰り返します。ドットは、この例ではtweetsです。

{{.Created_at}}{{.Text}}は、TweetObjectのメンバ変数に当たるもので、それらを表示します。

{{.User.Screen_name}}UserObjectのメンバ変数Screen_nameを表示するということです。

これらの書き方は、http://golang.org/pkg/text/template/#hdr-Actionsが参考になると思います。

これを実行すると、下図のように、ユーザータイムラインを取得することができました。

参考

jsonのUnmarshalについて参考にしたgist
https://gist.github.com/775526
Templateについて参考にしたgolang_guestbook
https://bitbucket.org/IanLewis/golang_guestbook/src/ece99a50ddfa/templates/base.html


comments powered by Disqus