素人が今更Twitter APIで遊ぶ　〜その１〜

初めましての方は初めまして。そうでない方はこんにちは。
今回はタイトルの通り、twitterのAPIを用いて、Python上でtwitter遊びをする。

今回は導入編ということで大したことしないが、今後の応用に向けてちょっと肩慣らししよう。

#APIって？
「◯◯がAPIを公開！やったね！」みたいな情報を耳にしたとき、情弱マンである私の頭の中には「？」が天文学的数個並ぶ。

FinTechやビッグデータ解析という今流行りのワードを理解・活用するためには、APIそのものがなんなのか、そしてそれを用いると何ができるのかを理解することは必要不可欠であろう。

偉そうに述べたが、私にもよくわからない。ただざっくりとした説明を以下で試みる。

APIとはApplication Programming Interfaceの略。
アプリケーションから、プラットフォームの機能を呼び出して使用するためのインターフェイスのことである。
例えば、今回の場合においては、自作のtwitterアプリケーションでAPIを用いることで、twitterというプラットフォームの機能を呼び出し、アレコレできるというわけである。

企業側の視点に立つと、APIを公開することで自社システムが持つデータ等を外部の第三者に晒していることになる。
では、なぜ企業はAPIを公開するのだろうか。APIを公開することで得られるメリットは大きく２つある。

+ 自社システムの持つデータ等を有料で提供すれば、既存システムを新たな収益源と変換させることができる。
+ 自社システムの持つデータ等を活用した新サービスの開発を外部に奨励できる。つまり、オープンイノベーション効果を促すことができる。

後者について追記しよう。
近年世界においてもっとも収益を上げている企業の大半は「プラットフォーム企業」である。ここでいう「プラットフォーム企業」とは、GAFAMやツイッター・エアビー・ウーバー・イーベイ・ティンダー等の、プラットフォームを提供している企業を指している。
これらは互いのニーズをマッチングさせるようなプラットフォームを提供、そして適切にUI/UXを設計したことで成功をおさめてきた。例えばAppleが提供しているiOSでは、世界中の開発者とiOSユーザをマッチングさせるために、AppStoreというプラットフォームを提供している。
このように「プラットフォーム企業」は人と人との間のコネクションを作り出す、そしてそこから生まれる価値を最大化することに力を注いでいる。そしてその手段の一つがAPIの公開であるというわけだ。

なんとなく理解していただけたであろうか。まあわからなかったら、APIに関する記事がたくさん出ているのでそちらを参考にしていただきたい。私よりはるかに説明がうまい。

#目標
そもそもなぜ今回このようにTwitter APIで今更遊んでみようと思ったのかという経緯を、目標に沿って簡単に説明する。

私は無類の鳥好きである。これは親譲りである。坊ちゃん（人生で初めて嫌々読まされた本、ごめんなさい）である。
鳥好きゆえに、「人間本位な行動によって苦しむ鳥たちを救う」という長期目標を持っている。
この長期目標を達成するために、「迷子になっている飼い鳥の情報をTwitter上で取得し、飼い主に情報発信をする」という中期目標を掲げた。
それゆえ、Twitter APIを使い慣れる必要があり、今回の投稿に至った。

今回は手始めに、タイムラインの取得とツイートのポストを試みたいと思う。

#環境

* Python3
* Jupyter Notebook

#準備
まず、Twitterへのアクセスには、OAuth認証を必要とする。
わかりやすい説明は[こちら](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)をどうぞ。

PythonでOAuth認証をするために、Requests-OAuthlibというライブラリを用いる。
インストールはコマンドライン上で

```Requests-OAuthlibのインストール
$ sudo pip3 install requests-oauthlib
```
と打つとできる。

このライブラリのOAuth1Sessionを用いるのだが、これには以下４つのインプットを必要とする。

* Consumer Key
* Consumer Secret
* Access Token
* Access Token Secret

上２つはアプリケーション登録により付与されるIDとpasswordみたいなもの。下２つはそのアプリケーション登録者それぞれに付与されるIDとpasswordみたいなもの。

これら４つの取得方法は[こちら](https://qiita.com/konojunya/items/59a68d35e44db8b87186)を参考に。

取得した後、config.ipynbとして保管しておくとあとあと楽かな。

```python3:config.ipynb
consumer_key = '********'
consumer_secret = '********'
access_token = '********'
access_token_secret = '********'
```

これで準備はOK!

#tweetをポストする
以下のコードを走らせれば、notebook上にキーボード入力が現れる。コマンドラインからpythonを走らせる場合は、コマンドライン上からキーボード入力できるようになる。

```python:post_tweet.ipynb
import config
import json
from requests_oauthlib import OAuth1Session

ck = config.consumer_key
cs = config.consumer_secret
at = config.access_token
ats = config.access_token_secret
twitter = OAuth1Session(ck, cs, at, ats)  #OAuth認証

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

print("内容は？")
tweet = input('>> ')

param = {"status" : tweet}

res = twitter.post(url, params = param)  #post

if res.status_code == 200:
    print("Posted")
else:
    print("Failed : %d"% res.status_code)
```

それでは上記のコードについて少し説明する。
第１段落はただのインポート。
第２段落は、config.ipynbから4つのkeyを取り出している。その上で、OAuth認証を行っている。
第３段落は、tweetをpostするためのエンドポイントを指定している。これはtwitterの[Developer用サイト](https://developer.twitter.com/)に記載されてある。実際にtweetをポストするためのエンドポイントが記載されている[ページ](https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-update)に飛んでみよう。そこにはエンドポイントURLだけではなく、Resource InformationやParameters(required, optional)の情報が記載されているはずだ。
![スクリーンショット 2018-06-15 12.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/253596/8699f83e-d16a-e8c7-1b1c-df1712c85218.png)

Resource Informationの部分は上図の通り。Responceのフォーマットはjsonである。今回はResponceの内容にアレコレしないのでjsonを読み込むことはしていない。また他にも、authenticationが必要とされていることや、postに時間的制限が設けられていることがわかる。

![スクリーンショット 2018-06-15 12.23.18.png](https://qiita-image-store.s3.amazonaws.com/0/253596/4be9628a-3217-0937-7a2f-9c095eafa07e.png)

上図はParametersの一部を切り取ったものである。それぞれカラム名を見てくれればわかるが、ここにはパラメータの名前、必須か否か、Description、デフォルト、使用例が記載されている。例えば１番上の「status」について見てみよう。requiredなので必須のパラメータであり、tweet内容がこれに当たる。他にもたくさんのoptionalなパラメータが存在するので、自分の目的に沿った使い方をしよう。

さて、コードの説明に戻る。
第４、5段落はキーボード入力をするための記述と、使用するパラメータの記述である。今回は必須パラメータの「status」のみを使用する。
第６段落はtweetのポストである。ここで用いるインプットは、エンドポイントURLとパラメータ群である。さらにresponceをresで受け取っている。
最終段落では、tweetが正常にポストされたかを表示するための記述である。先ほどのresのなかに「status_code」というものがあり、これが200だと正常にポストされたことを意味する。

以上がコードに関する説明である。実際にポストしてみたので、正常にポストされた様子を載せる。

```
内容は？
>> 腹減った
Posted
```
![写真 2018-06-15 12 05 55.jpg](https://qiita-image-store.s3.amazonaws.com/0/253596/36689295-9d3a-8ab9-cb7c-9f596bd60369.jpeg)

できたね。腹減ったね。

#タイムラインを取得する
tweetをポストできるようになったので、次にホームのタイムラインを取得してみよう。

```python:get_home_timeline.ipynb
import json,config
from requests_oauthlib import OAuth1Session

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/home_timeline.json'  #エンドポイント指定

params = {'count' : 5, 'exclude_replies': True}

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) 

```

ホームのタイムラインを取得するためのエンドポイントは[ここ](https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-home_timeline.html)にある。
また、パラメータについては、今回「count」および「exclude_replies」を指定した。「count」は引っ張ってくるレコード数であり、最大が200、デフォルトは20となっている。一方、「exclude_replies」はそのままの意味で、リプライをのぞいて表示するためのパラメータである。
その他制約については各自で確認してほしい。

if文以降については、resのなかのtextを読み込み、それを表示させる記述となっている。

早速結果を見てみよう。

![スクリーンショット 2018-06-15 14.17.01.png](https://qiita-image-store.s3.amazonaws.com/0/253596/f9050b7c-d0bb-56a0-4540-dcc2002aad0a.png)

プライバシーだなんだ言われるのが嫌なので、名前とかURLの部分は隠しておいた。
このようにして、タイムラインを取得することができた。

#終わりに
Developer用のページを見てると、APIを用いればもっとたくさんのことができそうだ。
今回は初歩オブ初歩みたいな内容だったが、今後もっと発展的な内容を取り扱っていきたい。

ありがとうございました。