【第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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
笹川(エンジニア)
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!
おすすめ記事
ライトコードの営業マンって何してるの?〜高橋さん編〜
広告メディア事業部
2024.05.08
日常
移転したライトコード大阪オフィスを調査せよ!
広告メディア事業部
2024.04.03
日常
【GCP】BIG QUERYを触り程度に理解してみる
かねまさ(エンジニア)
2024.04.02
IT技術
【Android】Github ActionsでFirebase Test Labの実行を分散する
笹川(エンジニア)
2024.04.02
IT技術
【Next.js】App Router で使用できるキャッシュまとめ
モーリー(エンジニア)
2024.03.29
IT技術