のどあめ

ググってもなかなか出てこなかった情報を垂れ流すブログ。

golang + anacondaでTwitter Streamimg APIを使う

goのTwitter APIライブラリの一つとして、anacondaがあります。

最近まで(?)Streaming APIには対応されていなかったようですが、 ソースを見る限りすでにStreaming APIに対応するための実装があるようです。

GoDocを見ながら適当に実装してみたらちゃんと動いたので、 今回はその方法について書きます。

準備

$ go get github.com/ChimeraCoder/anaconda

実装

github.com

package main

import (
    "encoding/json"
    "flag"
    "fmt"
    "github.com/ChimeraCoder/anaconda"
    "io/ioutil"
)

type ApiConf struct {
    ConsumerKey       string `json:"consumer_key"`
    ConsumerSecret    string `json:"consumer_secret"`
    AccessToken       string `json:"access_token"`
    AccessTokenSecret string `json:"access_token_secret"`
}

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {
    var apiConf ApiConf
    {
        apiConfPath := flag.String("conf", "config.json", "API Config File")
        flag.Parse()
        data, err_file := ioutil.ReadFile(*apiConfPath)
        check(err_file)
        err_json := json.Unmarshal(data, &apiConf)
        check(err_json)
    }

    anaconda.SetConsumerKey(apiConf.ConsumerKey)
    anaconda.SetConsumerSecret(apiConf.ConsumerSecret)
    api := anaconda.NewTwitterApi(apiConf.AccessToken, apiConf.AccessTokenSecret)

    twitterStream := api.PublicStreamSample(nil)
    for {
        x := <-twitterStream.C
        switch tweet := x.(type) {
        case anaconda.Tweet:
            fmt.Println(tweet.Text)
            fmt.Println("-----------")
        case anaconda.StatusDeletionNotice:
            // pass
        default:
            fmt.Printf("unknown type(%T) : %v \n", x, x)
        }
    }
}

簡単に説明すると、twitterStream.Cからどんどんツイートを取得して表示するだけです。

twitterStream.Canaconda.Tweet型(ツイート本体)と anaconda.StatusDeletionNotice型(ツイート消されてますNotice?)が流れてきます。 消されたツイートはどうでもよいので今回はスルーしています。

goを使うとJsonパースが楽なのも良いですね。

実行

$ go run main.go -conf=config.json

追記:環境によっては-conf="config.json"とする必要があるそうです

世界中のツイート(の一部)がどんどん流れてきます。 これを使って何かおもしろいことができればよいですね!