• トップ
  • ブログ一覧
  • 【第14回】Go言語(Golang)入門~Twitterアプリ作成編~
  • 【第14回】Go言語(Golang)入門~Twitterアプリ作成編~

    笹川(エンジニア)笹川(エンジニア)
    2019.12.12

    IT技術

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

    笹川笹川先生

    (株)ライトコードの笹川(ささがわ)です!

    そろそろレベルも上がり、Go言語(Golang)も 入門 とは言えなくなってきた感も否めません。

    そこで、入門編はそろそろ終わりにしたいと考えています。

    修了記念にGo言語(Golang)を使ってWebアプリを作ってみようと思います!

    それでは、いってみましょう!

    前回の記事はこちら

    featureImg2019.12.04【第13回】Go言語(Golang)入門~MySQL利用編~第13回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!今回は、前回に引き続き My...

    どんなアプリ作るの?

    修了に際して、どのようなアプリを作ろうか考えました。

    色々悩んだのですが、過去の記事でTwitterAPIを利用したのを思い出し、TwitterAPIを使ったTwitterアプリケーションを作ってみようと思いました。

    ツイートしたい内容の一部を、猫語(「にゃ」とか「にゃん」)に変えるという簡単なアプリです!

    その制作過程を、今回と次回で書かせていただいて、Go言語(Golang)入門は一旦修了とさせていただきます!

    どう進めていくのか?

    1. まずは、TwitterAPIの登録
    2. その後、Go言語(Golang)の実装
    3. 最後に、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回目の記事でやりましたね!

    featureImg2019.10.17【第6回】Go言語(Golang)入門~Twitter API利用編~第6回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!先日、Twitterでアンケー...

    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アプリケーションを作っているんだなー」という優しい目で見ていただけると嬉しいです(笑)

    作成しているアプリケーションのソースコードは、次回の記事の最後に案内予定です!

    次回の記事はこちら

    featureImg2019.12.18【最終回】Go言語(Golang)入門~Twitterアプリ作成完了編~最終回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!引き続き、ツイートを猫語に変換...

    オススメのGo入門本

    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る

     

    こちらの記事もオススメ!

    featureImg2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    第1回の記事はこちら

    featureImg2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事