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

笹川先生
(株)ライトコードの笹川(ささがわ)です!
そろそろレベルも上がり、Go言語(Golang)も 入門 とは言えなくなってきた感も否めません。
そこで、入門編はそろそろ終わりにしたいと考えています。
修了記念にGo言語(Golang)を使ってWebアプリを作ってみようと思います!
それでは、いってみましょう!
前回の記事はこちら
2019.12.04Go言語(Golang)入門~第13回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引...
どんなアプリ作るの?
修了に際して、どのようなアプリを作ろうか考えました。
色々悩んだのですが、過去の記事でTwitterAPIを利用したのを思い出し、TwitterAPIを使ったTwitterアプリケーションを作ってみようと思いました。
ツイートしたい内容の一部を、猫語(「にゃ」とか「にゃん」)に変えるという簡単なアプリです!
その制作過程を、今回と次回で書かせていただいて、Go言語(Golang)入門は一旦修了とさせていただきます!
どう進めていくのか?
- まずは、TwitterAPIの登録
- その後、Go言語(Golang)の実装
- 最後に、HTMLの実装
今回のメイン言語は、Go言語(Golang)となります。
そのため、画面の実装はFWなどを利用せずに進めます。
ちなみに、TwitterAPI の登録方法は、今回は割愛させていただきます。
それでは、作っていきましょー!
TwitterAPI の「ConsumerKey」と「ConsumerSecret」だけ今回は利用し、それらを JSON 形式でファイルに保存します。
| { "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回目の記事でやりましたね!
2019.10.17Go言語(Golang)入門~第6回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 先日、Twitte...
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インスタンス側への実装は、下記で完了です。
| 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エラー」が発生します。
その場合は、もう一度認証させるようにしましょう。
今回は、再認証のリダイレクトはフロント側でやります。
そのため、こちらでは成功とは異なるレスポンスをするようにします。
| curl --request POST --url http://localhost:3022/post --data input=テストツイート |
認証が正しくされていれば、これで『テストツイート』と、自分のタイムラインにツイートされているはずです。
ここの実装では、生成されたツイートのURLをレスポンスとしていますので、そちらにアクセスすると成否がわかるはずです。
これで、Go言語(Golang)での実装の半分は終わりました!
では、残りは次回にします!
さいごに
Go言語は、扱いやすく1つ1つの実装は簡単です。
しかし、組み合わせていくと、やはりちょっと難しくなってきますね!
習得していった手法を駆使して様々やっていますが、ちょっとオレオレコードになっている感も否めません…。
ソースコードの汚さは、一旦目をつぶっていただき、「Go言語(Golang)で楽しそうなWebアプリケーションを作っているんだなー」という優しい目で見ていただけると嬉しいです(笑)
作成しているアプリケーションのソースコードは、次回の記事の最後に案内予定です!
関連記事
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 ...
2019.10.17Go言語(Golang)入門~第6回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 先日、Twitte...
2019.10.23Go言語(Golang)入門~第7回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引き...
2019.10.30Go言語(Golang)入門~第8回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、Twitt...
2019.11.06Go言語(Golang)入門~第9回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、Goの環境...
2019.11.13Go言語(Golang)入門~第10回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引...
2019.11.20Go言語(Golang)入門~第11回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、Fire...
2019.11.27Go言語(Golang)入門~第12回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、データベ...
2019.12.04Go言語(Golang)入門~第13回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引...
ライトコードよりお知らせ

にゃんこ師匠

ミツオカ

にゃんこ師匠

ミツオカ

にゃんこ師匠

ミツオカ
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね! 一緒に働いてくれる仲間を募集しております!

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