東南アジアウェブエンジニアスクール ~API編①~

ここで出てくるAPIは全てRest APIのことです。GraphQLとかは触ったことがないので分かりません。

# APIとはなにか

> アプリケーションプログラミングインタフェース（API、英: Application Programming Interface）とは、広義の意味ではソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様である。
[アプリケーションプログラミングインタフェース - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)

自分の中でのAPIの定義は
> 決められたURLに決められた方法で決められたパラメータを乗せてリクエストすると、決められた処理を行い、決められたレスポンスを返すURL

です。これわかりやすいかな？笑

## 実際にAPIで遊んでみる

身近なものを使ったほうが面白いのでTwitter APIを使ってみる。

### Twitterアプリを登録

ここで登録
https://developer.twitter.com/en/apps

作成完了すると、以下の画面に遷移する
<img width="1126" alt="Screen_Shot_2019-09-25_at_12_21_37_AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/ccc09923-2566-b3a4-18be-41c99ff425a1.png">


### アクセストークン等取得
Keys and tokensタブに移動
<img width="810" alt="Screen_Shot_2019-09-25_at_12_23_17_AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/4e1132ef-5d3c-b1ce-3345-1e023336cbaa.png">

API key、secret keyはすでにできているので、以下の、Createボタンよりaccess tokenを作成する
<img width="384" alt="Screen Shot 2019-09-25 at 12.27.09 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/cbfee191-12c5-f588-7f3b-3ed4dbedb217.png">

以下４つはこれから使えるのですぐにコピペできるようにしておいてください。

* API key
* API secret key
* Access token
* Access token secret

## Node.jsスクリプト作成

まずは適当にディレクトリを作りyarnが使えるようにしておく

```bash
$ mkdir twitter && cd twitter
$ yarn init -y
```

Twitterライブラリをインストール

```bash
$ yarn add twitter
```
VSCodeでファイルを開く

```bash
$ code ./index.js
```


### Tweetしてみる

#### このAPIの"決められていること"を見てみる
[APIドキュメント](https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-update)

* レスポンスはJsonで返ってくる
* statusというパラメータは必須（その他パラメータはオプショナル）
* `Post`でリクエストしてね
* 行うこと：Tweetをする

```javascript:index.js

const Twitter = require('twitter')

const client = new Twitter({
  consumer_key: 'APIキー',
  consumer_secret: 'APIシークレットキー',
  access_token_key: 'アクセストークン',
  access_token_secret: 'アクセストークンシークレット'
})

const tweetText = 'カオサンに住むことにしました'

client.post('statuses/update', { status: tweetText })
  .then(response => {
    console.log(response)
  })

```

成功すると、ターミナル上では大きいオブジェクトが表示されるはずです。

```javascript
{
  created_at: 'Wed Sep 25 07:44:14 +0000 2019',
  id: 0000000000,
  id_str: '0000000000',
  text: 'カオサンに住むことにしました',
  truncated: false,
  entities: { hashtags: [], symbols: [], user_mentions: [], urls: [] },
　・
　・
```
<img width="395" alt="Screen Shot 2019-09-25 at 12.44.28 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/e6026206-cd6e-f3dd-baa0-2038d72efffe.png">


このAPIを使うことでTwitterのDBに新規Tweet情報書き込みをすることができました。
そういう意味では[crud](https://www.weblio.jp/content/CRUD)のCreateですね。もちろんRead、Update、Deleteなど様々な役割のAPIがこの世界にはたくさん存在します。

# APIでTweetできるのはわかったけど、これ手動でスマホアプリでもできるじゃん？
APIを考えるときに重要なのは、APIで実行できるイコールプログラムに組み込められるということです。
プログラムに組み込められるということは、何かをした後に、自動でTweetさせる、といった自動化ができたりします。
例えば、`毎日朝7時に天気情報を取得してその結果を自動でTweetする`というようなことができます。
もしくは、ブログをパブリッシュしたと同時に`ブログを書きました URLはこちら！`といったTweetを自動で行うなど。まさにQiitaみたいな
<img width="633" alt="Screen Shot 2019-09-25 at 1.00.54 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/0650096c-dccc-f36c-f3f3-c81c9c63eb91.png">

まぁ使いみちは無限大ですね。