• トップ
  • ブログ一覧
  • 【第6回】Go言語(Golang)入門~Twitter API利用編~
  • 【第6回】Go言語(Golang)入門~Twitter API利用編~

    笹川(エンジニア)笹川(エンジニア)
    2019.10.17

    IT技術

    第6回~Go言語(Golang)入門~

    秋山笹川先生

    (株)ライトコードの笹川(ささがわ)です!

    先日、Twitterでアンケートをしてみました。

    今回は、そのアンケートの要望にお応えして、 TwitterAPI を利用してエゴサが出来る簡易Twitterクライアントを作成してみようかと思います!

    前回の記事はこちら

    featureImg2019.10.09【第5回】Go言語(Golang)入門~REST API実装編~第5回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!前回は、RESR APIを構築...

    TwitterAPIとは

    「ツイート」や「タイムラインの取得」、「リツイート」や「いいね」といったTwitterのサービスを、APIから利用できるサービです。

    今回は、TwitterAPIの「登録方法」や「初期設定」などは紹介しません。

    そちらについては、以下の記事で詳しく説明されているようなので参考にしてみてください。

    【Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ】
    https://qiita.com/kngsym2018/items/2524d21455aac111cdee

    この記事では、すでにTwitterAPIの利用登録が済んでいる前提のもと、進めていきたいと思います。

    Anacondaを入れてOAuth認証をしてみよう!

    TwitterAPIを利用するにあたって、まずは「OAuth認証」が必要となります

    今回は、自前でOAuth認証の実装を用意はせず、Anaconda という TwitterAPI専用ライブラリを利用したいと思います。

    【Anaconda】
    https://github.com/ChimeraCoder/anaconda

    Anacondaを導入

    それでは、下記のように書いて dep ensure で Anaconda を導入してみましょう!

    1package main
    2
    3import (
    4    "github.com/ChimeraCoder/anaconda"
    5)
    6
    7func main() {
    8    anaconda.NewTwitterApiWithCredentials("your-access-token", "your-access-token-secret", "your-consumer-key", "your-consumer-secret")
    9}

    venderディレクトリの配下に、ChimeraCoder というディレクトリがあったら問題なく導入できています

    1$ ls vendor/github.com/
    2ChimeraCoder    carlescere      garyburd        googleapis      mattn
    3azr             dustin          golang          labstack        valyala

    認証

    次に、認証してみましょう!

    認証情報は、別途Jsonファイルに入れておく方法にしたいと思います。

    Firebaseの認証する際のJsonファイルと同様に、 path/to  に twitterAccount.json を作成します。

    1{
    2  "accessToken": "",
    3  "accessTokenSecret": "",
    4  "consumerKey": "",
    5  "consumerSecret": ""
    6}

    Json の中身は、各自で書き換えてください。

    構造体を用意し、Json をパースします。

    1package main
    2
    3import (
    4    "encoding/json"
    5    "fmt"
    6    "io/ioutil"
    7
    8    "github.com/ChimeraCoder/anaconda"
    9)
    10
    11func main() {
    12    // Json読み込み
    13    raw, error := ioutil.ReadFile("path/to/twitterAccount.json")
    14    if error != nil {
    15        fmt.Println(error.Error())
    16        return
    17    }
    18
    19    var twitterAccount TwitterAccount
    20    // 構造体にセット
    21    json.Unmarshal(raw, &twitterAccount)
    22
    23    // 認証
    24    anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret)
    25}
    26
    27// TwitterAccount はTwitterの認証用の情報
    28type TwitterAccount struct {
    29    AccessToken       string `json:"accessToken"`
    30    AccessTokenSecret string `json:"accessTokenSecret"`
    31    ConsumerKey       string `json:"consumerKey"`
    32    ConsumerSecret    string `json:"consumerSecret"`
    33}

    ここで実行してエラーがでなければ、認証は成功しています。

    go run する前に dep ensure を忘れずに実行してくださいね。

    実行

    それでは、テキトーに検索してみましょう!

    「ライトコード」で検索してみたいと思います。

    1package main
    2
    3import (
    4    "encoding/json"
    5    "fmt"
    6    "io/ioutil"
    7    "github.com/ChimeraCoder/anaconda"
    8)
    9
    10func main() {
    11    // Json読み込み
    12    raw, error := ioutil.ReadFile("path/to/twitterAccount.json")
    13    if error != nil {
    14        fmt.Println(error.Error())
    15        return
    16    }
    17
    18    var twitterAccount TwitterAccount
    19    // 構造体にセット
    20    json.Unmarshal(raw, &twitterAccount)
    21
    22    // 認証
    23    api := anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret)
    24
    25    // 検索 [ライトコード]
    26    searchResult, _ := api.GetSearch(`ライトコード`, nil)
    27    for _, tweet := range searchResult.Statuses {
    28        fmt.Println(tweet.Text)
    29    }
    30}
    31
    32// TwitterAccount はTwitterの認証用の情報
    33type TwitterAccount struct {
    34    AccessToken       string `json:"accessToken"`
    35    AccessTokenSecret string `json:"accessTokenSecret"`
    36    ConsumerKey       string `json:"consumerKey"`
    37    ConsumerSecret    string `json:"consumerSecret"`
    38}

    go run で実行してみます。

    1$ go run main.go 
    2RT @imys_staff: 【#あいミス1周年🎉記念キャンペーン】
    3
    4召喚100回分のフレアライト🎁や、
    5Amazonギフトコ�
    6RT @mot59240971: 山で定番のZライトソル!パンクの心配なしで、さっと敷けて、アコーディオンのようにコ�
    71件のコメント https://t.co/xNG7oNRHTS “【第2回】Go言語(Golang)入門~Firestore導入
    8山で定番のZライトソル!パンクの心配なしで、さっと敷けて、アコーディオンのようにコンパクトに畳�

    どうやら関係なさそうなツイートも検索で引っかかっているようです!

    修正

    TwitterAPIでは、キーワードに対して " (ダブルクォーテーション)を付けることで、より厳密に検索をかけることができます。

    1package main
    2
    3import (
    4    "encoding/json"
    5    "fmt"
    6    "io/ioutil"
    7    "github.com/ChimeraCoder/anaconda"
    8)
    9
    10func main() {
    11    // Json読み込み
    12    raw, error := ioutil.ReadFile("path/to/twitterAccount.json")
    13    if error != nil {
    14        fmt.Println(error.Error())
    15        return
    16    }
    17
    18    var twitterAccount TwitterAccount
    19    // 構造体にセット
    20    json.Unmarshal(raw, &twitterAccount)
    21
    22    // 認証
    23    api := anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret)
    24
    25    // 検索 ["ライトコード"]
    26    searchResult, _ := api.GetSearch(`"ライトコード"`, nil)
    27    for _, tweet := range searchResult.Statuses {
    28        fmt.Println(tweet.Text)
    29    }
    30}
    31
    32// TwitterAccount はTwitterの認証用の情報
    33type TwitterAccount struct {
    34    AccessToken       string `json:"accessToken"`
    35    AccessTokenSecret string `json:"accessTokenSecret"`
    36    ConsumerKey       string `json:"consumerKey"`
    37    ConsumerSecret    string `json:"consumerSecret"`
    38}

    go run で実行してみます。

    1$ go run main.go 
    2RT @hiro_matsuno2: 【第2回】Go言語(Golang)入門~Firestore導入編~ – �
    31件のコメント https://t.co/xNG7oNRHTS “【第2回】Go言語(Golang)入門~Firestore導入
    4【第2回】Go言語(Golang)入門~Firestore導入編~ – �
    5【第2回】Go言語(Golang)入門~Firestore導入編~ – �
    6『社長と一杯やりながら話してみませんか?』
    7
    8転職を考えているあなたに、ライトコードをよく知ってもらうため

    どうやら、それっぽいものがちゃんと取得できたようです!

    Jsonで返す

    では、これで echo を使ってパラメーターからキーワードを渡し、該当するツイートの内容をすべて Json で返してみましょう!

    まずは、レスポンスのための構造体を用意します。

    1// Tweet はツイートの情報
    2type Tweet struct {
    3    User string `json:"user"`
    4    Text string `json:"text"`
    5}
    6
    7// Tweets はTweetの配列
    8type Tweets *[]Tweet

    次に、TwitterAPIへの接続をメソッド化します。

    1func connectTwitterApi() *anaconda.TwitterApi {
    2    // Json読み込み
    3    raw, error := ioutil.ReadFile("path/to/twitterAccount.json")
    4    if error != nil {
    5        fmt.Println(error.Error())
    6        return nil
    7    }
    8
    9    var twitterAccount TwitterAccount
    10    // 構造体にセット
    11    json.Unmarshal(raw, &twitterAccount)
    12
    13    // 認証
    14    return anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret)
    15}

    キーワードを受け取って、実際に検索をかけてから結果を返すメソッドを用意します。

    1func serach(c echo.Context) error {
    2    keyword := c.FormValue("keyword")
    3    api := connectTwitterApi()
    4    // 検索 [ライトコード]
    5    searchResult, _ := api.GetSearch(`"` + keyword + `"`, nil)
    6    
    7    tweets := make([]*Tweet, 0)
    8
    9    for _, data := range searchResult.Statuses {
    10        tweet := new(Tweet)
    11        tweet.Text = data.FullText
    12        tweet.User = data.User.Name
    13        
    14        tweets = append(tweets, tweet)
    15    }
    16
    17    return c.JSON(http.StatusOK, tweets)
    18}

    あとは、echo でエンドポイントを用意したら終わりです!

    まとめるとこのような感じになります。

    1package main
    2
    3import (
    4    "encoding/json"
    5    "fmt"
    6    "io/ioutil"
    7    "net/http"
    8
    9    "github.com/labstack/echo"
    10    "github.com/ChimeraCoder/anaconda"
    11)
    12
    13func main() {
    14    e := echo.New()
    15    e.POST("/tweet", serach)
    16    e.Logger.Fatal(e.Start(":1323"))
    17}
    18
    19func serach(c echo.Context) error {
    20    keyword := c.FormValue("keyword")
    21    api := connectTwitterApi()
    22    // 検索 [ライトコード]
    23    searchResult, _ := api.GetSearch(`"` + keyword + `"`, nil)
    24    
    25    tweets := make([]*Tweet, 0)
    26
    27    for _, data := range searchResult.Statuses {
    28        tweet := new(Tweet)
    29        tweet.Text = data.FullText
    30        tweet.User = data.User.Name
    31        
    32        tweets = append(tweets, tweet)
    33    }
    34
    35    return c.JSON(http.StatusOK, tweets)
    36}
    37
    38func connectTwitterApi() *anaconda.TwitterApi {
    39    // Json読み込み
    40    raw, error := ioutil.ReadFile("path/to/twitterAccount.json")
    41    if error != nil {
    42        fmt.Println(error.Error())
    43        return nil
    44    }
    45
    46    var twitterAccount TwitterAccount
    47    // 構造体にセット
    48    json.Unmarshal(raw, &twitterAccount)
    49
    50    // 認証
    51    return anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret)
    52}
    53
    54// TwitterAccount はTwitterの認証用の情報
    55type TwitterAccount struct {
    56    AccessToken       string `json:"accessToken"`
    57    AccessTokenSecret string `json:"accessTokenSecret"`
    58    ConsumerKey       string `json:"consumerKey"`
    59    ConsumerSecret    string `json:"consumerSecret"`
    60}
    61
    62// Tweet はツイートの情報
    63type Tweet struct {
    64    User string `json:"user"`
    65    Text string `json:"text"`
    66}
    67
    68// Tweets はTweetの配列
    69type Tweets *[]Tweet

    実行

    実行してみましょう!

    1[
    2    {
    3        "user": "hoge",
    4        "text": "fugafuga"
    5    },
    6    {
    7        "user": "hoge",
    8        "text": "fugafuga"
    9    }
    10}

    こんな感じでレスポンスが返ってきたら成功です。

    確認

    では、「Go言語 入門」で検索かけてみます。

    1 curl -X POST http://localhost:1323/tweet -F 'keyword=Go言語 入門'
    1[
    2    {
    3        "user": "えみぞう🐘🌻🌻🌻🌻🌻",
    4        "text": "RT @sasa_nss_app: Go言語入門の第2回が公開されました!\n以前アンケートで取ったとおりFirestoreあたりを書きました。\nよかったら見てください!はてブしてくれると嬉しいです!\nhttps://t.co/KTUnKFfFzZ"
    5    },
    6    {
    7        "user": "笹のり",
    8        "text": "書かせて頂きました。第2回Go言語入門。Firestoreに手を出しました / 1件のコメント https://t.co/Ci9WyYB7J5 “【第2回】Go言語(Golang)入門~Firestore導入編~ – 株式会社ライトコード” (1 user) https://t.co/WP2t22mxnn"
    9    },
    10    {
    11        "user": "笹のり",
    12        "text": "Go言語入門の第2回が公開されました!\n以前アンケートで取ったとおりFirestoreあたりを書きました。\nよかったら見てください!はてブしてくれると嬉しいです!\nhttps://t.co/KTUnKFfFzZ"
    13    },
    14    {
    15        "user": "niconico",
    16        "text": "Day2\nドットインストールGo言語入門終了しました!\n#100DaysOfCode https://t.co/v8qCIX7q8Z"
    17    },
    18    {
    19        "user": "BFTawfik Bot 2",
    20        "text": "RT @niconic79413696: Day1 Go言語\nドットインストールgo言語入門#01-#09 完了しました!\n環境構築の時Day入れるの忘れた。。。\n#100DaysOfCode https://t.co/9whBRIUSyR"
    21    },
    22    {
    23        "user": "niconico",
    24        "text": "Day1 Go言語\nドットインストールgo言語入門#01-#09 完了しました!\n環境構築の時Day入れるの忘れた。。。\n#100DaysOfCode https://t.co/9whBRIUSyR"
    25    },
    26    {
    27        "user": "kww",
    28        "text": "RT @__27ts: みんなのGo言語、入門書とかでは知ることのできない現場でのTipsみたいなのが凝縮されていて、まだ自分にはむずかしいけど、良き指針を与えてくれる"
    29    },
    30    {
    31        "user": "mattn",
    32        "text": "RT @__27ts: みんなのGo言語、入門書とかでは知ることのできない現場でのTipsみたいなのが凝縮されていて、まだ自分にはむずかしいけど、良き指針を与えてくれる"
    33    }
    34]

    想定通りの結果が返ってきました!

    第7回へつづく

    今回は、Go言語(Golang)でTwitterAPIを利用してみました。

    Anacondaのおかげで、特に苦労せずに、認証からエゴサまでが出来るので皆様も是非使ってみてください!

    次回は、今回利用したTwitterAPIとHTMLテンプレートを利用して、リッチなTwitterクライアント作成してみたいと思います

    今回作成したgoファイルは、こちらのリポジトリにて管理しております!

    次回の記事はこちら

    featureImg2019.10.23【第7回】Go言語(Golang)入門~HTMLテンプレート利用編~第7回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!今回は、前回に引き続き、Twi...

    オススメのGo入門本

    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る

     

    こちらの記事もオススメ!

    featureImg2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    第1回の記事はこちら

    featureImg2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事