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

笹川先生
(株)ライトコードの笹川(ささがわ)です!
先日、Twitterでアンケートをしてみました。
今回は、そのアンケートの要望にお応えして、 TwitterAPI を利用してエゴサが出来る簡易Twitterクライアントを作成してみようかと思います!
前回の記事はこちら
2019.10.09Go言語(Golang)入門~第5回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、RESR ...
「ツイート」や「タイムラインの取得」、「リツイート」や「いいね」といった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 を導入してみましょう!
| package main import ( "github.com/ChimeraCoder/anaconda" ) func main() { anaconda.NewTwitterApiWithCredentials("your-access-token", "your-access-token-secret", "your-consumer-key", "your-consumer-secret") } |
venderディレクトリの配下に、ChimeraCoder というディレクトリがあったら問題なく導入できています
| $ ls vendor/github.com/ ChimeraCoder carlescere garyburd googleapis mattn azr dustin golang labstack valyala |
認証
次に、認証してみましょう!
認証情報は、別途Jsonファイルに入れておく方法にしたいと思います。
Firebaseの認証する際のJsonファイルと同様に、 path/to に twitterAccount.json を作成します。
| { "accessToken": "", "accessTokenSecret": "", "consumerKey": "", "consumerSecret": "" } |
Json の中身は、各自で書き換えてください。
構造体を用意し、Json をパースします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package main import ( "encoding/json" "fmt" "io/ioutil" "github.com/ChimeraCoder/anaconda" ) func main() { // Json読み込み raw, error := ioutil.ReadFile("path/to/twitterAccount.json") if error != nil { fmt.Println(error.Error()) return } var twitterAccount TwitterAccount // 構造体にセット json.Unmarshal(raw, &twitterAccount) // 認証 anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret) } // TwitterAccount はTwitterの認証用の情報 type TwitterAccount struct { AccessToken string `json:"accessToken"` AccessTokenSecret string `json:"accessTokenSecret"` ConsumerKey string `json:"consumerKey"` ConsumerSecret string `json:"consumerSecret"` } |
ここで実行してエラーがでなければ、認証は成功しています。
go run する前に dep ensure を忘れずに実行してくださいね。
実行
それでは、テキトーに検索してみましょう!
「ライトコード」で検索してみたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package main import ( "encoding/json" "fmt" "io/ioutil" "github.com/ChimeraCoder/anaconda" ) func main() { // Json読み込み raw, error := ioutil.ReadFile("path/to/twitterAccount.json") if error != nil { fmt.Println(error.Error()) return } var twitterAccount TwitterAccount // 構造体にセット json.Unmarshal(raw, &twitterAccount) // 認証 api := anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret) // 検索 [ライトコード] searchResult, _ := api.GetSearch(`ライトコード`, nil) for _, tweet := range searchResult.Statuses { fmt.Println(tweet.Text) } } // TwitterAccount はTwitterの認証用の情報 type TwitterAccount struct { AccessToken string `json:"accessToken"` AccessTokenSecret string `json:"accessTokenSecret"` ConsumerKey string `json:"consumerKey"` ConsumerSecret string `json:"consumerSecret"` } |
go run で実行してみます。
| $ go run main.go RT @imys_staff: 【#あいミス1周年🎉記念キャンペーン】 召喚100回分のフレアライト🎁や、 Amazonギフトコ� RT @mot59240971: 山で定番のZライトソル!パンクの心配なしで、さっと敷けて、アコーディオンのようにコ� 1件のコメント https://t.co/xNG7oNRHTS “【第2回】Go言語(Golang)入門~Firestore導入 山で定番のZライトソル!パンクの心配なしで、さっと敷けて、アコーディオンのようにコンパクトに畳� |
どうやら関係なさそうなツイートも検索で引っかかっているようです!
修正
TwitterAPIでは、キーワードに対して ” (ダブルクォーテーション)を付けることで、より厳密に検索をかけることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package main import ( "encoding/json" "fmt" "io/ioutil" "github.com/ChimeraCoder/anaconda" ) func main() { // Json読み込み raw, error := ioutil.ReadFile("path/to/twitterAccount.json") if error != nil { fmt.Println(error.Error()) return } var twitterAccount TwitterAccount // 構造体にセット json.Unmarshal(raw, &twitterAccount) // 認証 api := anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret) // 検索 ["ライトコード"] searchResult, _ := api.GetSearch(`"ライトコード"`, nil) for _, tweet := range searchResult.Statuses { fmt.Println(tweet.Text) } } // TwitterAccount はTwitterの認証用の情報 type TwitterAccount struct { AccessToken string `json:"accessToken"` AccessTokenSecret string `json:"accessTokenSecret"` ConsumerKey string `json:"consumerKey"` ConsumerSecret string `json:"consumerSecret"` } |
go run で実行してみます。
| $ go run main.go RT @hiro_matsuno2: 【第2回】Go言語(Golang)入門~Firestore導入編~ – � 1件のコメント https://t.co/xNG7oNRHTS “【第2回】Go言語(Golang)入門~Firestore導入 【第2回】Go言語(Golang)入門~Firestore導入編~ – � 【第2回】Go言語(Golang)入門~Firestore導入編~ – � 『社長と一杯やりながら話してみませんか?』 転職を考えているあなたに、ライトコードをよく知ってもらうため |
どうやら、それっぽいものがちゃんと取得できたようです!
Jsonで返す
では、これで echo を使ってパラメーターからキーワードを渡し、該当するツイートの内容をすべて Json で返してみましょう!
まずは、レスポンスのための構造体を用意します。
| // Tweet はツイートの情報 type Tweet struct { User string `json:"user"` Text string `json:"text"` } // Tweets はTweetの配列 type Tweets *[]Tweet |
次に、TwitterAPIへの接続をメソッド化します。
| func connectTwitterApi() *anaconda.TwitterApi { // Json読み込み raw, error := ioutil.ReadFile("path/to/twitterAccount.json") if error != nil { fmt.Println(error.Error()) return nil } var twitterAccount TwitterAccount // 構造体にセット json.Unmarshal(raw, &twitterAccount) // 認証 return anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret) } |
キーワードを受け取って、実際に検索をかけてから結果を返すメソッドを用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | func serach(c echo.Context) error { keyword := c.FormValue("keyword") api := connectTwitterApi() // 検索 [ライトコード] searchResult, _ := api.GetSearch(`"` + keyword + `"`, nil) tweets := make([]*Tweet, 0) for _, data := range searchResult.Statuses { tweet := new(Tweet) tweet.Text = data.FullText tweet.User = data.User.Name tweets = append(tweets, tweet) } return c.JSON(http.StatusOK, tweets) } |
あとは、echo でエンドポイントを用意したら終わりです!
まとめるとこのような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | package main import ( "encoding/json" "fmt" "io/ioutil" "net/http" "github.com/labstack/echo" "github.com/ChimeraCoder/anaconda" ) func main() { e := echo.New() e.POST("/tweet", serach) e.Logger.Fatal(e.Start(":1323")) } func serach(c echo.Context) error { keyword := c.FormValue("keyword") api := connectTwitterApi() // 検索 [ライトコード] searchResult, _ := api.GetSearch(`"` + keyword + `"`, nil) tweets := make([]*Tweet, 0) for _, data := range searchResult.Statuses { tweet := new(Tweet) tweet.Text = data.FullText tweet.User = data.User.Name tweets = append(tweets, tweet) } return c.JSON(http.StatusOK, tweets) } func connectTwitterApi() *anaconda.TwitterApi { // Json読み込み raw, error := ioutil.ReadFile("path/to/twitterAccount.json") if error != nil { fmt.Println(error.Error()) return nil } var twitterAccount TwitterAccount // 構造体にセット json.Unmarshal(raw, &twitterAccount) // 認証 return anaconda.NewTwitterApiWithCredentials(twitterAccount.AccessToken, twitterAccount.AccessTokenSecret, twitterAccount.ConsumerKey, twitterAccount.ConsumerSecret) } // TwitterAccount はTwitterの認証用の情報 type TwitterAccount struct { AccessToken string `json:"accessToken"` AccessTokenSecret string `json:"accessTokenSecret"` ConsumerKey string `json:"consumerKey"` ConsumerSecret string `json:"consumerSecret"` } // Tweet はツイートの情報 type Tweet struct { User string `json:"user"` Text string `json:"text"` } // Tweets はTweetの配列 type Tweets *[]Tweet |
実行
実行してみましょう!
| [ { "user": "hoge", "text": "fugafuga" }, { "user": "hoge", "text": "fugafuga" } } |
こんな感じでレスポンスが返ってきたら成功です。
確認
では、「Go言語 入門」で検索かけてみます。
| curl -X POST http://localhost:1323/tweet -F 'keyword=Go言語 入門' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | [ { "user": "えみぞう🐘🌻🌻🌻🌻🌻", "text": "RT @sasa_nss_app: Go言語入門の第2回が公開されました!\n以前アンケートで取ったとおりFirestoreあたりを書きました。\nよかったら見てください!はてブしてくれると嬉しいです!\nhttps://t.co/KTUnKFfFzZ" }, { "user": "笹のり", "text": "書かせて頂きました。第2回Go言語入門。Firestoreに手を出しました / 1件のコメント https://t.co/Ci9WyYB7J5 “【第2回】Go言語(Golang)入門~Firestore導入編~ – 株式会社ライトコード” (1 user) https://t.co/WP2t22mxnn" }, { "user": "笹のり", "text": "Go言語入門の第2回が公開されました!\n以前アンケートで取ったとおりFirestoreあたりを書きました。\nよかったら見てください!はてブしてくれると嬉しいです!\nhttps://t.co/KTUnKFfFzZ" }, { "user": "niconico", "text": "Day2\nドットインストールGo言語入門終了しました!\n#100DaysOfCode https://t.co/v8qCIX7q8Z" }, { "user": "BFTawfik Bot 2", "text": "RT @niconic79413696: Day1 Go言語\nドットインストールgo言語入門#01-#09 完了しました!\n環境構築の時Day入れるの忘れた。。。\n#100DaysOfCode https://t.co/9whBRIUSyR" }, { "user": "niconico", "text": "Day1 Go言語\nドットインストールgo言語入門#01-#09 完了しました!\n環境構築の時Day入れるの忘れた。。。\n#100DaysOfCode https://t.co/9whBRIUSyR" }, { "user": "kww", "text": "RT @__27ts: みんなのGo言語、入門書とかでは知ることのできない現場でのTipsみたいなのが凝縮されていて、まだ自分にはむずかしいけど、良き指針を与えてくれる" }, { "user": "mattn", "text": "RT @__27ts: みんなのGo言語、入門書とかでは知ることのできない現場でのTipsみたいなのが凝縮されていて、まだ自分にはむずかしいけど、良き指針を与えてくれる" } ] |
想定通りの結果が返ってきました!
おわりに
今回は、Go言語(Golang)でTwitterAPIを利用してみました。
Anacondaのおかげで、特に苦労せずに、認証からエゴサまでが出来るので皆様も是非使ってみてください!
次回は、今回利用したTwitterAPIとHTMLテンプレートを利用して、リッチなTwitterクライアント作成してみたいと思います
今回作成したgoファイルは、こちらのリポジトリにて管理しております!
関連記事
2019.09.13Go言語(Golang)を習得したい! 笹川先生 (株)ライトコードでモバイルアプリケーション開発をしている笹川(ささが...
2019.09.17Go言語(Golang)を習得したい!~第2回~ (株)ライトコードの笹川(ささがわ)です。 前回に引き続き、今回もGo言語(Gol...
2019.09.26Go言語(Golang)入門~第3回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です。 今回でGo言語(G...
2019.10.02Go言語(Golang)入門~第4回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です 今回も、Go言語(G...
2019.10.09Go言語(Golang)入門~第5回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、RESR ...
一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!
当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。
また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!
なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。
書いた人はこんな人
- 笹川 (社員)
- 新潟生まれ新潟育ち本業はモバイルアプリエンジニア。
日々、猫(犬)エンジニアとして活躍中!