やった！動いた！！（当たり前だけど）

# 動くのは当たり前、だけど嬉しい
- [東京メトロ オープンデータ 開発者サイト](https://developer.tokyometroapp.jp/)からアカウントを昨日申し込んだ今日承認されログイン出来た
- ログイン後API用のアクセストークンを発行
- 昨日見た[@nayuneko:Go言語で東京メトロAPIを叩く](https://qiita.com/nayuneko/items/ca2651e3a613c8e3256a)に掲載されていたプログラムに先ほどのアクセストークンを入力

<details><summary>tokyometro.go</summary><div>

```
package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
    "time"
)

const (
    ENDPOINT     = "https://api.tokyometroapp.jp/api/v2/datapoints"
    CONSUMER_KEY = "取得したアクセストークン"
)

// レスポンスJSONデータ用構造体
type TrainInfomation struct {
    Context                string    `json:"@context"`
    Id                     string    `json:"@id"`
    Type                   string    `json:"@type"`
    Date                   time.Time `json:"dc:date"`
    Valid                  time.Time `json:"dct:valid"`
    Operator               string    `json:"odpt:operator"`
    TimeOfOrigin           time.Time `json:"odpt:timeOfOrigin"`
    Railway                string    `json:"odpt:railway"`
    TrainInformationStatus string    `json:"odpt:trainInformationStatus"`
    TrainInformationText   string    `json:"odpt:trainInformationText"`
}

// レスポンスJSONデータ配列
type TrainInformations []TrainInfomation

func main() {
  // URL生成
  q := map[string]string{
    "rdf:type": "odpt:TrainInformation", // TypeにTrainInformation(運行情報)を設定
    "acl:consumerKey": CONSUMER_KEY, // アクセストークン
  }
  url := fmt.Sprintf("%s?%s", ENDPOINT, buildQuery(q))
  // URLを叩いてデータを取得
  resp, err := http.Get(url)
  if err != nil {
    log.Fatal(err)
  }
  defer resp.Body.Close()
  body, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    log.Fatal(err)
  }
  // 取得したデータをJSONデコード
  var trains TrainInformations
  err = json.Unmarshal(body, &trains)
  if err != nil {
    log.Fatal(err)
  }
  // 取得したデータを整形して出力する
  for _, train := range trains {
    // 路線名
    railway := strings.Replace(train.Railway, "odpt.Railway:TokyoMetro.", "", -1)
    // 運行情報を組み立てる
    text := train.TrainInformationText
    if len(train.TrainInformationStatus) > 0 {
      text = fmt.Sprintf("%s (%s)", train.TrainInformationStatus, train.TrainInformationText)
    }
    fmt.Printf("%s: %s [%s]\n", railway, text, train.Date)
  }
}
func buildQuery(q map[string]string) string {
  queries := make([]string, 0)
  for k, v := range q {
    qq := fmt.Sprintf("%s=%s", k, v)
      queries = append(queries, qq)
  }
  return strings.Join(queries, "&")
}
```

</div></details>

- 以下の通り出力された。当たり前だけど動くとやっぱり嬉しい

```
$ go run tokyometro.go 
Ginza: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
Chiyoda: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
Fukutoshin: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
Tozai: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
Hanzomon: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
Marunouchi: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
Namboku: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
Yurakucho: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
Hibiya: 現在、平常どおり運転しています。 [2019-06-05 23:20:03 +0900 +0900]
```

- 今回のを参考に明日からまた再開！

# 今日の気持ち
- 初めてちゃんとAPI実行して動かしてみたけど、やっぱり凄い！そして便利！！
- あとは自分が動かしたいAPIがどうやって動いてるのか改めてよく調べる必要があるな