 笹川(エンジニア)
笹川(エンジニア)【第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入門本
こちらの記事もオススメ!
第1回の記事はこちら
 2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ

新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!
















