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