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


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

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

APIって?

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

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

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

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

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

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

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

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

目標

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

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

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

環境

  • Python3
  • Jupyter Notebook

準備

まず、Twitterへのアクセスには、OAuth認証を必要とする。
わかりやすい説明はこちらをどうぞ。

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

$ sudo pip3 install requests-oauthlib

と打つとできる。

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

  • Consumer Key
  • Consumer Secret
  • Access Token
  • Access Token Secret

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

これら4つの取得方法はこちらを参考に。

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

config.ipynb
consumer_key = '********'
consumer_secret = '********'
access_token = '********'
access_token_secret = '********'

これで準備はOK!

tweetをポストする

以下のコードを走らせれば、notebook上にキーボード入力が現れる。コマンドラインから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)

それでは上記のコードについて少し説明する。
第1段落はただのインポート。
第2段落は、config.ipynbから4つのkeyを取り出している。その上で、OAuth認証を行っている。
第3段落は、tweetをpostするためのエンドポイントを指定している。これはtwitterのDeveloper用サイトに記載されてある。実際にtweetをポストするためのエンドポイントが記載されているページに飛んでみよう。そこにはエンドポイントURLだけではなく、Resource InformationやParameters(required, optional)の情報が記載されているはずだ。

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

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

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

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

内容は?
>> 腹減った
Posted

できたね。腹減ったね。

タイムラインを取得する

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

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) 

ホームのタイムラインを取得するためのエンドポイントはここにある。
また、パラメータについては、今回「count」および「exclude_replies」を指定した。「count」は引っ張ってくるレコード数であり、最大が200、デフォルトは20となっている。一方、「exclude_replies」はそのままの意味で、リプライをのぞいて表示するためのパラメータである。
その他制約については各自で確認してほしい。

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

早速結果を見てみよう。

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

終わりに

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

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