Twitter APIを初めて触ってみる(ツイートを取得)

   

# この記事の内容

APIの勉強のために, Twitter apiを用いてユーザのツイート取得を行ったので, 簡単に流れをまとめました.

以下が内容です.
1. Twitter developerでのAPI申請
2. APIを用いてのツイート取得をcurlコマンドで行う.

この記事のゴールとしては, swiftでapiを用いてツイートを取得するアプリの作成までの流れをまとめることなので順次内容は更新していく予定です.



## 注意点
- twitter apiでのツイート取得の流れを簡単に把握したい方のための記事です.
- 詳しく知りたい方は[公式のドキュメント](https://developer.twitter.com/en/docs)見た方が100倍良いと思います.


# 1. Twitter developerでのAPI申請

APIを使用するためには, Twitter developerでのAPI申請が必要です.
すでに色々な方が申請までの手順を分かりやすく共有してくれていますので, そこまで詳しくは書きません.

##1-1. Twitter developerのページにアクセスしてログイン
開発者用のページ (https://developer.twitter.com/ja?lang=browser) にアクセスします. 
アクセスしたら右上のログインボタンを押して, 自分のTwitter アカウントでログインをしてください.
ログインできたら, 右上に自分のプロフィールのアイコンが出ると思います.
![HP画像(ログイン後)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/7fd9808d-b048-cde2-cbc7-3de789c1f12e.png)

##1-2. Twitter API申請(開発者登録)

1. 右上の[Apply]をクリック
2. 次ページの[Apply for a developer account]をクリック
3. What is your primary reason for using Twitter developer tools? APIを利用する目的を聞かれるので, 一番近いものを選択して右下の[Next]をクリック

4. ここまで来ると, 以下のような画面になるかと思います.
![スクリーンショット 2020-03-24 18.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/693983c9-fbf8-5885-490d-027490fe9472.png)
電話番号を追加していない場合, [Add a valid phone number]というボタンが出ているはずなのでそれをクリックして追加してください. 
表示がなければすでに追加されているはずなので問題ないです.
その後, 下にスクロールして住んでいる国, 呼び名の設定を行って右下の[Next]をクリック
5. 次ページではAPIの使用用途の入力を行います.

(1) Twitter data/apiをどのように用いるのか (必須) [200文字以上]
![スクリーンショット 2020-03-24 18.10.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/a96a025b-eed5-4dce-5830-4832f84f3d33.png)
(2) Twitter dataをどのように分析・活用するのか (選択) [100文字以上]
![スクリーンショット 2020-03-24 18.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/7124a8ce-4eca-ca44-85c9-818ca2c76815.png)
(3) ツイート, リツイート等を行うのか, その機能の使用用途 (選択) [100文字以上]
![スクリーンショット 2020-03-24 18.17.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/f62f1c76-0bfc-a042-d9ec-64c01e08078a.png)
(4) Twitterデータを外部に公開する場合, どこに公開するのか, どのように活用するのか (選択) [100文字以上]
![スクリーンショット 2020-03-24 18.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/8b4b14d8-6675-66ac-e5c2-efcdc5345e45.png)
(5) 作った製品や分析結果が政府機関で利用される場合, その機関をリストアップ (選択)![スクリーンショット 2020-03-24 18.19.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/effdde9f-7dba-6f57-79a6-5b66476582a8.png)
記入が終わったら[Next]をクリック
6. 入力事項が表示され, 問題なければ[Looks good!]をクリック
7. 利用規約が出るので, 同意する
8. You did it!!と表示されれば申請完了.
9. アカウントと紐づけているメールアドレスに登録用のメールが届く.
<img width="697" alt="スクリーンショット 2020-03-24 18.53.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/e1153104-9be1-fd9d-56ec-1252d958a711.png">
[Confirm your email]をクリックして登録を完了させる

##1-3. APIキーを取得
登録が完了したら, [Apps]をクリック
(上の写真とアイコンが変わってますが気にしない方向で...)
![スクリーンショット 2020-03-24 19.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/72e544b4-c707-4437-d58d-04f689caccf6.png)

[create an App]をクリックし,必須事項を入力する.
- App name (アプリの名前)
- Application description (アプリの説明)
- Website URL (アプリを利用するWBEサイトのURLを入力, 自分は個人用なので適当にtwitterのプロフィールのURLを入力しました)
- Tell us how this app will be used (アプリの使い道, 自分はアプリの説明とほぼ同じで少し補足を加えました)


入力がおわったら[create]をクリック.
作成ができていれば, Appsメニューに作成したアプリが入っているはずです.
[Details]をクリック.
![スクリーンショット 2020-03-24 19.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/3e27a14f-13cd-59db-a621-c9c7bb2eb20e.png)

以下のConsumer API keysが今回使用するAPIキーになります.
![スクリーンショット 2020-03-24 19.40.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391712/eef2d7a6-a2dc-5a15-e1c2-79fd362b2790.png)



**参考にした記事**
- [Twitter’s standard APIでツイートを取得する手順](https://toconakis.tech/twitters-standard-api/)
- [Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)

# 2. APIを用いてツイート取得

Twitter APIの認証にはOAuth 1.0とOAuth 2.0が存在しますが, 今回はツイートを取得するだけなのでOAtuth 2.0 の Bearer Tokenを使用する方法を用います.
詳しいことは公式のドキュメントを見てください.
https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0

auth1とauth2についても詳しくは以下を参照ください.
- [OAuth 2.0でWebサービスの利用方法はどう変わるか](https://www.atmarkit.co.jp/fsmart/articles/oauth2/01.html)
- [OAuth 1.0 と OAuth 2.0 の仕組み](https://murashun.jp/blog/20150920-01.html#chapter-3)

**追記**

- OAuth 1.0: ユーザの同意のもとでユーザの代わりに特定機能を実行する(Tweetする)APIを利用できます.鍵垢のTweetも取得できるでしょう.
- OAuth 2.0: 機能が限定されており, クライアントの権限で利用できるAPIは使えますがユーザの同意を得てユーザの代わりに特定機能を実行することを想定するAPIは利用できません。

OAuth 1.0はOAuth 2.0に比べて権限が広く, ツイートやいいねなども行うことができます.
その分, 取得の手続きも複雑になりますが。。

コメントで説明の補足に関するご指摘をいただいたので追加します.
ありがとうございます.



## 2-1. Bearer Tokenの取得
取得方法はとてもシンプルです.
先ほど入手したConsumer API keysをPOSTすることでBearer Tokenが返ってきます.
Consumer keyとConsumer secretを[base64](https://ja.wikipedia.org/wiki/Base64)エンコードする必要があります.
Consumer keyとConsumer secretを`:`でつないだ文字列をエンコードしてください.
以下は公式で用いられている例です.

| Consumer key | xvz1evFS4wEEPTGEFPHBog |
|---|---|---|
| Consumer secret | L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg |
| Bearer Token credentials | xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg |
| Base64 encoded Bearer Token credentials | eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw== |

オンラインでエンコードする場合はこちら
https://www.convertstring.com/ja/EncodeDecode/Base64Encode

curlコマンドを用いてPOSTメソッドを行います.
リクエスト例 (公式ドキュメント引用)

```
POST /oauth2/token HTTP/1.1
Host: api.twitter.com
User-Agent: My Twitter App v1.0.23
Authorization: Basic eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJn
                     NmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 29
Accept-Encoding: gzip

grant_type=client_credentials
```
これをcurlを用いて行うと以下のようになります.

```
$ curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
 -H "Authorization: Basic eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==" 
-d "grant_type=client_credentials" https://api.twitter.com/oauth2/token
```
成功すると以下のようなjsonが返ってきます.

```
{"token_type":"bearer",
"access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAAAAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}
```

access_tokenというのがツイートを取得するために使うBearer Tokenです.

## 2-2. Bearer Tokenを用いてツイート取得
いよいよツイート取得を行います.

ツイートを取得するにはGETメソッドを用います.
リクエスト例 (公式ドキュメント引用)

```
GET /1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi HTTP/1.1
Host: api.twitter.com
User-Agent: My Twitter App v1.0.23
Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAA
                      AAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Accept-Encoding: gzip
```

`/1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi`
count, screen_nameはそれぞれ
・ 取得するツイート数
・ 取得するアカウントのユーザネーム
を指します.
ちなみに, 鍵垢のツイート取得はこの方法ではできません.

上記のGETメソッドをcurlで行うと以下のようになります.

```
$ curl -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAA
AAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" 
'https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=twitterapi&count=100'
```

</br>
</br>
試しに自分のBearer Tokenを使って自分のtwitterアカウントのツイートを取得してみます.
GETメソッドを行う際に, jqコマンドを使っています.
jsonを見やすいように整形してくれてとても便利です. ([jqコマンドでjsonを扱う](https://qiita.com/tomitz/items/f48a6bfae1123cadc69a))

```
$ curl -H "Authorization: Bearer (Bearer Token)" 
'https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=sakapan_ydn&count=2' | jq .
```

こんな感じでツイートを取得することができます.

```
[
  {
    "created_at": "Sun Mar 29 02:07:26 +0000 2020",
    "id": 1244083717502431200,
    "id_str": "1244083717502431234",
    "text": "雪すごい！",
    "truncated": false,
    "entities": {
      "hashtags": [],
      "symbols": [],
      "user_mentions": [],
      "urls": []
    },
(以下省略)
.
.
.
```

**参考にした記事**
- [Twitter’s standard APIでツイートを取得する手順](https://toconakis.tech/twitters-standard-api/)
- [公式ドキュメント: Authentication](https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0/application-only)
- [Twitter APIのOAuthToken取得方法](https://qiita.com/takashi9314/items/6bae2ae7770854b33de1)

<br/>
### 最後に
swiftでapiを用いて, ツイートを取得するアプリの作成する流れまでを載せたいと書きましたが, 長くなってしまったのでまた新しい記事として出そうと思います.
以下がその記事となってます.
[Twitter APIで取得したツイートをiOSアプリ上で表示](https://qiita.com/masa_unofficial/items/70fb47d26623f227fb6b)