• トップ
  • ブログ一覧
  • 【第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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background