【第6回】Go言語(Golang)入門~Twitter API利用編~
IT技術
第6回~Go言語(Golang)入門~
(株)ライトコードの笹川(ささがわ)です!
先日、Twitterでアンケートをしてみました。
今回は、そのアンケートの要望にお応えして、 TwitterAPI を利用してエゴサが出来る簡易Twitterクライアントを作成してみようかと思います!
今日入門編書いたけど、次のGolangの記事どんなのがいいかな
— 笹のり (@sasa_nss_app) September 5, 2019
前回の記事はこちら
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ファイルは、こちらのリポジトリにて管理しております!
次回の記事はこちら
オススメのGo入門本
こちらの記事もオススメ!
2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
第1回の記事はこちら
2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!