
【第14回】Go言語(Golang)入門~Twitterアプリ作成編~
2021.12.20
第14回~Go言語(Golang)入門~

(株)ライトコードの笹川(ささがわ)です!
そろそろレベルも上がり、Go言語(Golang)も 入門 とは言えなくなってきた感も否めません。
そこで、入門編はそろそろ終わりにしたいと考えています。
修了記念にGo言語(Golang)を使ってWebアプリを作ってみようと思います!
それでは、いってみましょう!
前回の記事はこちら
どんなアプリ作るの?
修了に際して、どのようなアプリを作ろうか考えました。
色々悩んだのですが、過去の記事でTwitterAPIを利用したのを思い出し、TwitterAPIを使ったTwitterアプリケーションを作ってみようと思いました。
ツイートしたい内容の一部を、猫語(「にゃ」とか「にゃん」)に変えるという簡単なアプリです!
その制作過程を、今回と次回で書かせていただいて、Go言語(Golang)入門は一旦修了とさせていただきます!
どう進めていくのか?
- まずは、TwitterAPIの登録
- その後、Go言語(Golang)の実装
- 最後に、HTMLの実装
今回のメイン言語は、Go言語(Golang)となります。
そのため、画面の実装はFWなどを利用せずに進めます。
ちなみに、TwitterAPI の登録方法は、今回は割愛させていただきます。
それでは、作っていきましょー!
Twitter認証の実装
TwitterAPI の「ConsumerKey」と「ConsumerSecret」だけ今回は利用し、それらを JSON 形式でファイルに保存します。
1 2 3 4 | { "consumerKey": "aaaaaaaaaaaaaaaaaaaaa", "consumerSecret": "abcd1234abcd1234abcd1234abcd1234abcd1234" } |
Anacondaを利用して認証
作成したファイルを読み込んで、Anaconda を利用して認証します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | func connectAPI() *anaconda.TwitterApi { // Json読み込み raw, error := ioutil.ReadFile("./path/to/twitterAccount.json") if error != nil { fmt.Println(error.Error()) return nil } var twitterAccount Account // 構造体にセット json.Unmarshal(raw, &twitterAccount) anaconda.SetConsumerKey(twitterAccount.ConsumerKey) anaconda.SetConsumerSecret(twitterAccount.ConsumerSecret) // 認証 return anaconda.NewTwitterApi("", "") } |
ちなみに、このへんの実装は、第6回目の記事でやりましたね!
echoの設定
次に、echo の設定をします。
アクセスされた時の実装は、このような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | const callback = "https://cat.newstyleservice.net/callback" const test = "http://localhost:3022/callback" // AuthTwitter ツイッターの認証開始 func AuthTwitter(c echo.Context) error { api := connectAPI() var url = callback hostname, _ := os.Hostname() if strings.Contains(hostname, "local") { url = test } // 認証 uri, _, error := api.AuthorizationURL(url) if error != nil { fmt.Println(error) return error } // 成功したらTwitterのログイン画面へ return c.Redirect(http.StatusFound, uri) } |
ローカルの開発環境とサーバーで、TwitterAPI の Callback の設定が異なるので、 hostname で判定して設定しています。
認証が無事にできたら、Twitterのログイン画面へ遷移するようになっています。
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 | // RunAPIServer APIサーバー実行 func RunAPIServer() { e := echo.New() e.GET("/auth", twitter.AuthTwitter) // サーバーを開始 go func() { if err := e.Start(":3022"); err != nil { e.Logger.Info("shutting down the server") } }() // (Graceful Shutdown) quit := make(chan os.Signal) signal.Notify(quit, os.Interrupt) <-quit ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := e.Shutdown(ctx); err != nil { e.Logger.Fatal(err) } } |
これで、「localhost:3022/auth」へアクセスすると、Twitterのログイン画面が表示されるようになりました。
ログイン成功後のCallbackの実装
次に、ログイン成功後の Callbackの実装をします。
token などは、GETのパラメーターとして受け取れるので、それらの値をセッションへ保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // Callback ログイン後のコールバックから認証まで func Callback(c echo.Context) error { token := c.QueryParam("oauth_token") secret := c.QueryParam("oauth_verifier") api := connectAPI() cred, _, error := api.GetCredentials(&oauth.Credentials{ Token: token, }, secret) if error != nil { fmt.Println(error) return error } api = anaconda.NewTwitterApi(cred.Token, cred.Secret) sess := session.Default(c) sess.Set("token", cred.Token) sess.Set("secret", cred.Secret) sess.Save() return c.Redirect(http.StatusFound, "./tweet") } |
token と secret が無事に取得でき、セッションに値を保存したら、ツイート画面へリダイレクトするようにしています。
echoインスタンス側への実装は、下記で完了です。
1 | e.GET("/callback", twitter.Callback) |
これで「認証」と「ログイン」周りの実装は終わりになります!
ツイートするための実装
ログインまでできたので、画面より先に、実際にツイートをする処理を実装します。
「POST でメッセージを受け取って、そのままツイートする」ならば、下記のような実装になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // PostTwitterAPI ツイッター投稿 func PostTwitterAPI(c echo.Context) error { sess := session.Default(c) token := sess.Get("token") secret := sess.Get("secret") if token == nil || secret == nil { return c.JSON(http.StatusAccepted, "redirect") } api := anaconda.NewTwitterApi(token.(string), secret.(string)) message := c.FormValue("message") tweet, error := api.PostTweet(message, nil) if error != nil { fmt.Println(error) return c.JSON(http.StatusAccepted, "redirect") } link := "https://twitter.com/" + tweet.User.IdStr + "/status/" + tweet.IdStr return c.JSON(http.StatusOK, link) } |
先ほどの認証周りで、セッションに入れたトークンなどが不正の場合はツイートされません。
api.PostTwet() では、認証が正しくないとTwitterAPI側で「400エラー」が発生します。
その場合は、もう一度認証させるようにしましょう。
今回は、再認証のリダイレクトはフロント側でやります。
そのため、こちらでは成功とは異なるレスポンスをするようにします。
1 | curl --request POST --url http://localhost:3022/post --data input=テストツイート |
認証が正しくされていれば、これで『テストツイート』と、自分のタイムラインにツイートされているはずです。
ここの実装では、生成されたツイートのURLをレスポンスとしていますので、そちらにアクセスすると成否がわかるはずです。
これで、Go言語(Golang)での実装の半分は終わりました!
では、残りは次回にします!
最終話へつづく!
Go言語は、扱いやすく1つ1つの実装は簡単です。
しかし、組み合わせていくと、やはりちょっと難しくなってきますね!
習得していった手法を駆使して様々やっていますが、ちょっとオレオレコードになっている感も否めません…。
ソースコードの汚さは、一旦目をつぶっていただき、「Go言語(Golang)で楽しそうなWebアプリケーションを作っているんだなー」という優しい目で見ていただけると嬉しいです(笑)
作成しているアプリケーションのソースコードは、次回の記事の最後に案内予定です!
次回の記事はこちら
オススメのGo入門本
こちらの記事もオススメ!
第1回の記事はこちら
書いた人はこんな人

- 新潟生まれ新潟育ち本業はモバイルアプリエンジニア。
日々、猫(犬)エンジニアとして活躍中!
IT技術9月 20, 2023開発効率を少しだけ上げるGithubActionsの便利な使い方
IT技術4月 7, 2023【ISUCON部】ライトコードISUCON部 始動!
IT技術4月 18, 2022【Android】Webでよくみる入力Boxを手作り
IT技術1月 19, 2022【Android】SeekbarでスイッチなUIを作る