茶漬けの技術メモ

Golang, Rubyで趣味開発します。テックニュース書いたり。ガジェット触ったり。

GoでTwitter

Go で Twitterクライアントを作成してみようと思います

今回は

  • タイムラインの取得
  • 特定ワード付きのツイートの取得
  • ツイートする

をしていこうと思います


まずは Twitter API Key を取得

これがなければ話になりません。
Consumer Key
Consumer Secret
Access Token
Access Token Secret
をそれぞれ取得します。

取得方法は Twitter Application Management にアクセスし、今回作りたいアプリケーションを作成します。

ベースとなるクライアントを作成しよう

フルスクラッチするのも大変なので、今回は
github.com こちらを利用します。

先ほど取得した Twitter API Key を元に anaconda のクライアントを作成する関数を作ります。

base.go (key は適宜入れてください)

package main

import "github.com/ChimeraCoder/anaconda"

const (
    consumerKey       = "consumer_key"
    consumerSecret    = "consumer_secret"
    accessToken       = "access_token"
    accessTokenSecret = "access_token_secret"
)

func getClient() *anaconda.TwitterApi {
    anaconda.SetConsumerKey(consumerKey)
    anaconda.SetConsumerSecret(consumerSecret)
    return anaconda.NewTwitterApi(accessToken, accessTokenSecret)
}


タイムラインを取得しよう!

先ほど作成した base.go を利用します

get_timeline.go

package main

import (
    "log"
    "net/url"
)

func main(){
    api := GetClient()

    v := url.Values{}
    v.Set("count","30")

    tweets, err := api.GetHomeTimeline(v)
    if err != nil {
        panic(err)
    }

    for _, tweet := range tweets {
        log.Printf("tweet: %v", tweet.Text)
    }
}


ここで

    v := url.Values{}
    v.Set("count","30")

としているところは、APIを叩く際のオプションを指定しています
もっと詳しい情報はこちらをどうぞ

https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets


特定のワードの付いたツイートを取得してみよう

search.go

package main

import (
    "net/url"

    "github.com/k0kubun/pp"
)

func main() {
    api := getClient()

    v := url.Values{}
    v.Set("result_type", "recent")

    searchResult, err := api.GetSearch("golang", v)
    if err != nil {
        panic(err)
    }

    for _, tw := range searchResult.Statuses {
        pp.Print(tw)
    }
}

これで golang というワード付きのツイートが取得できます

話がそれますが、↑で使っている pp というパッケージ便利ですw


ツイートしてみよう

tweet.go

package main

import (
    "log"
    "net/url"
)

func main() {
    api := getClient()

    text := "hello world from golang"
    v := url.Values{}

    tweet, err := api.PostTweet(text, v)
    if err != nil {
        log.Fatal(err)
    }

    log.Printf("tweet: %#v", tweet.Text)
}

シンプルですね。これまでのコードが理解できていれば特に問題ないと思います。


まとめ

anaconda を使って twitter からの取得と実際にツイートをしてみました。
この流れで画像付きのツイートも実装!と思ったのですが、そちらはちょっと一筋縄ではいかないようだったので、また別の記事にでも書きます。


書きました

o-tyazuke.hatenablog.com