TwitterはGoでゴー。

# 自己紹介

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の2回生です👍 (2016.11.4現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

# GoでTwitter

最近Goの勉強をしています。そこでTwitterもGoでやっときたいな〜と。

そういえば...

[Goでツイートしてみよう](http://qiita.com/konojunya/items/4d0ba8b73a8c3e14aef2)

こんなQiitaの投稿がありました。。

今回はもっとGoの言語的な部分の説明なども含めながら詳しく書いていきたいと思います。

Twitterのエンドポイントなどは[Reference Documentation](https://dev.twitter.com/rest/reference)を参考にしていきます。

今回は、フルスクラッチはする気ないのでライブラリとして[anaconda](https://github.com/ChimeraCoder/anaconda)を使いました。

`$ go get github.com/ChimeraCoder/anaconda`は各自お願いします。

## まずは4つのキーから

まずTwitterAPIを使うのにOAuth認証を通すため`コンシューマキー`,`コンシューマシークレットキー``アクセストークン`,`アクセストークンシークレット`を用意する必要があります。

プロジェクトフォルダに移動したら

```
$ mkdir keys
$ touch keys/keys.go
```

と、直下に`keys`フォルダと`keys.go`を作ってください。

```keys.go
package keys

import (
  "github.com/ChimeraCoder/anaconda"
  . "os"
)

func GetTwitterApi() *anaconda.TwitterApi {
  anaconda.SetConsumerKey(Getenv("TWITTER_CONSUMER_KEY"))
  anaconda.SetConsumerSecret(Getenv("TWITTER_CONSUMER_SECRET"))
  api := anaconda.NewTwitterApi(Getenv("TWITTER_ACCESS_TOKEN"), Getenv("TWITTER_ACCESS_TOKEN_SECRET"))
  return api
}
```

`Twitter_*`の部分は、適宜そのまま書いてしまうか、環境変数に書くかなんなり書き換えてください！

環境変数を使わない場合は、`import`にある`os`は消して大丈夫です。

`keys.go`では、`func GetTwitterApi`という関数を作りました。

この関数を、外部から呼ぶとanacondaでいい感じにしてくれた後ポインタが返されます。

そのポインタの型が`*anaconda.TwitterApi`です。

goには命名規則があり、**関数名を頭文字大文字で定義することでアクセス権が`public`になります。**

外部から呼ぶ関数なので絶対に頭文字を大文字にしておいてください。

`Getenv()`関数は`os`のメソッドで、環境変数を呼び出すことのできるものです。

本来は`os.Getenv()`なんですが、`os`は別につけなくてもいいように`import`部分で

```go
import (
  . "os"
)
```

と、`.`をつけています。

これでこの返却された`api`を使ってTwitterライフを楽しんでいきます！

## Hello worldつぶやこう

まずツイートする方からいきましょう。

```post.go
package main

import (
  . "./keys"
  . "fmt"
)

func main(){

  api := GetTwitterApi()

  text := "Hello world"
  tweet, err := api.PostTweet(text, nil)
  if err != nil {
    panic(err)
  }

  Print(tweet.Text)
}
```

textに`"Hello world"`を代入して、`api.PostTweet(text,nil)`を実行します。

その結果が`tweet,err`にかえってきます。

goは返り値を複数返すことができます。

そして、`try,catch`みたいなことはせず、エラーが起きたかどうかは返り値を見ることで確認できます。

今回の場合は`tweet`に自分がつぶやいたものが、`err`にエラーが入ります。

もしエラーがあった場合は`panic`という関数で処理をします。

panicはプログラムの継続的な実行が難しく、どうしよもなくなった時にプログラムを強制的に終了させるために発生するエラーです。

[Effective -> panic](https://golang.org/doc/effective_go.html#panic) ここにも

> ときおり、プログラムは全く継続できない事態に陥ることがあります。
こういったときのために、組み込み関数panicがあります。これは、実質的にプログラムを停止させるランタイムエラーを作成します。

と書いています。

エラーがなければ`nil`が関数から返されます。


## タイムラインを見てみよう。

では次は取得系をしていきたいと思います。

```get.go
package main

import (
  . "./keys"
  . "fmt"
  "net/url"
)

func main(){

  api := GetTwitterApi()

  v := url.Values{}
  v.Set("count","10")

  tweets, err := api.GetHomeTimeline(v)
  if err != nil {
    panic(err)
  }

  for _, tweet := range tweets {
    Println("tweet: ", tweet.Text)
  }

}
```

今回もそんなに変わらないですが、`url.Values`が新しく出てきました。

twitterのtimelineを取得する際に使うオプションの設定のために使います。

他の言語でやるときに使う`{count: 10}`とか見たいなやつです。

`v.Set(<key>,<value>)`の関係で書くことができます。

ではその`v`を使ってタイムラインの取得をしていきます。

`tweets, err := api.GetHomeTimeline(v)`

`tweets`にツイートが入っているので

```go
for _, tweet := range tweets {
  Println("tweet: ", tweet.Text)
}
```

`range`を使って一つずつ表示していきます。

ちなみにgoには`for`以外のループ文はないので、覚えておきましょう！


# 最後に

LINEのMessaging APIもGoでやったり、WebサイトのサーバもGoで書いてたりと最近よく触っているのでいい備忘録になるし、誰かの助けになれば幸いです！

初言語はTwitter APIから始めましょう！と言ってるだけあってTwitter大好きなのでぜひフォローしてください！

Twitter [@konojunya](https://twitter.com/konojunya)