PythonでTwitter API を利用していろいろ遊んでみる

# 概要

__TwitterAPI__を利用していろいろ遊んでみる！

ドキュメントは[コチラ](https://developer.twitter.com/en/docs)

以下の初心者向け記事も宜しければご覧ください♪
[【随時追記】今夜寿命を迎えても良いようにPythonの基礎学習内容をメモしとく。](https://qiita.com/bakira/items/03a5ad7e5365fc26bf31)

# 手順

## Twtterアプリケーションの作成

まずは__TwtterAPI__を利用するために、対象のアカウントにて、__アプリケーション登録__をして、

- __Consumer Key__
- __Consumer Secret__
- __Access Token__
- __Access Token Secret__

を__発行する必要__があります。

[コチラ](https://apps.twitter.com/)にアクセスし、__対象のアカウント__でログインしましょう。

ログインすると、__Create New Appボタン__が表示されるので__クリック__します。

<img width="700" alt="screencapture- 2018-01-07 19.04.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/d9bcec81-51dc-7099-2071-daf72c4a330a.png">

__必須情報__を~~適当~~に入力後に__同意__し、__Create your Twitter applicationボタン__を__クリック__します。

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/113654/ecd1d269-7af0-5495-7b29-14f051999541.png)

### Consumer情報の確認

__Consumer Key__と__Consumer Secret__は以下の画面から確認することが可能です。

<img width="978" alt="screencapture- 2018-01-07 19.16.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/325c49e6-9706-caa0-9aca-e85ee79a5fce.png">

### アクセス情報の生成及び確認

初期では、__Access Token__と__Access Token Secret__は__<font color="red">発行されていない</font>__ので、同ページ下部の__Create my access tokenボタン__を__クリック__して、生成する必要があります。

<img width="976" alt="screencapture- 2018-01-07 19.19.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/3dc60622-418e-fb55-51a2-5e070245bae4.png">

生成されると__以下__のように確認出来るようになります。

<img width="922" alt="screencapture- 2018-01-07 19.21.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/18085585-3387-0467-3212-56eeab6ac38d.png">

## ライブラリのインストール

### requestsとrequests-oauthlib

[__requests__](http://docs.python-requests.org/en/latest/):
Pythonで__Rest API操作__を__簡単__に行うためのライブラリ。
__直感的で分かりやすいです！__

[__requests-oauthlib__](http://docs.python-requests.org/en/latest/):
Pythonで__OAuth認証__を__簡単__に行うためのライブラリ。
__直感的で分かりやすいです！__

__以下のコマンド__でまとめてインストールします。

```shell:command
pip install requests requests-oauthlib
```

## ファイルの準備

### 階層

__ファイル構成__は以下のようになっています

```shell:tree
.
├── config.py #認証情報を管理
├── xxx.py #各スクリプト
└── ...
```

```py:config.py
CONSUMER_KEY = "**************"
CONSUMER_SECRET = "**************"
ACCESS_TOKEN = "**************"
ACCESS_TOKEN_SECRET = "**************"
```

### 試しにタイムラインを取得

まずは、pythonスクリプトから正常に__API通信__が出来ているかの確認を含めて__タイムラインを取得__してみましょう。

```py:getTimelines.py
import json, config #標準のjsonモジュールとconfig.pyの読み込み
from requests_oauthlib import OAuth1Session #OAuthのライブラリの読み込み

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS) #認証処理

url = "https://api.twitter.com/1.1/statuses/user_timeline.json" #タイムライン取得エンドポイント

params ={'count' : 5} #取得数
res = twitter.get(url, params = params)

if res.status_code == 200: #正常通信出来た場合
    timelines = json.loads(res.text) #レスポンスからタイムラインリストを取得
    for line in timelines: #タイムラインリストをループ処理
        print(line['user']['name']+'::'+line['text'])
        print(line['created_at'])
        print('*******************************************')
else: #正常通信出来なかった場合
    print("Failed: %d" % res.status_code)
```

これを実行すると認証情報が正しければ、タイムラインの情報が取得されます。

```shell:command
python getTimelines.py
```

こんな感じ

<img width="943" alt="screencapture- 2018-01-07 19.40.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/ee7d6074-4fb8-c869-f36f-02cd37a8ad0f.png">

しゅごい(小並感)

### ツイートをしてみよう！！

以下のファイルを作成します。

```py:postTweet.py
import json, config #標準のjsonモジュールとconfig.pyの読み込み
from requests_oauthlib import OAuth1Session #OAuthのライブラリの読み込み

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS) #認証処理

url = "https://api.twitter.com/1.1/statuses/update.json" #ツイートポストエンドポイント

print("内容を入力してください。")
tweet = input('>> ') #キーボード入力の取得
print('*******************************************')

params = {"status" : tweet}

res = twitter.post(url, params = params) #post送信

if res.status_code == 200: #正常投稿出来た場合
    print("Success.")
else: #正常投稿出来なかった場合
    print("Failed. : %d"% res.status_code)
```

実行！！

```shell:command
python postTweet.py
```

こんな感じ

<img width="320" alt="screencapture- 2018-01-07 19.47.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/13ffe9f7-182d-5590-1fd8-3945f7e92579.png">

<img width="611" alt="screencapture- 2018-01-07 19.47.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/18d792ac-c5da-bb6f-2c45-e58a519a5008.png">

__しゅごい(小並感)__


## 注意

__TwitterAPI__は、__ほぼすべての操作__をAPI操作出来ますが、ゆえに__<font color='red'>各エンドポイントごとにリクエスト制限</font>__を設けています。

この値は__レスポンスに含まれる__ので取得することが可能です。

```py:response.py
import config
from requests_oauthlib import OAuth1Session
import datetime, time

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS) #認証処理

url = "https://api.twitter.com/1.1/statuses/user_timeline.json" #タイムライン取得エンドポイント

res = twitter.get(url)

limit = res.headers['x-rate-limit-remaining'] #リクエスト可能残数の取得
reset = res.headers['x-rate-limit-reset'] #リクエスト叶残数リセットまでの時間(UTC)
sec = int(res.headers['X-Rate-Limit-Reset']) - time.mktime(datetime.datetime.now().timetuple()) #UTCを秒数に変換
           
print ("limit: " + limit)
print ("reset: " +  reset)
print ('reset sec:  %s' % sec)
```

こんな感じ

<img width="179" alt="screencapture- 2018-01-07 20.37.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/aa012438-2370-42e8-3697-ba31147955a5.png">

__なるほど。__

ちなみに__エンドポイントによって上限やリセット時間は異なる__らしいので気をつけましょう！
上限を超えてしまうと、__<font color="red">429エラー</font>__が返るようになってしまいます。

詳しくは[コチラ](https://developer.twitter.com/en/docs/basics/rate-limiting)か[コチラ(日本語訳)](http://westplain.sakuraweb.com/translate/twitter/Documentation/REST-APIs/Public-API/API-Rate-Limits.cgi)を参照下さい。

もちろん、__フォローを解除__するための__<font color="red">friendships/destroy</font>__とかいう、__地獄__のようなエンドポイントもあるので色々楽しそうですね。

__叩き尽くしてやりましょう！！！__