Twitterのツイートをwordcloudで可視化したい【前編】

まえまえから思っていたんですが、まったく手をつけられていませんでした。ただ、年末という非常にツイートデータが大量に手に入る時期なのでやるのは今だと思ってやります。ただいろいろやっている人もいるので、大した違いはないかなと思います。

Twitterアプリの作成

【注意】もしすでに作成済みのアプリがあるようであれば、そちらを使ったほうが時間がかなり短縮できるのでオススメです。

以前にもTwitterアプリを作成したのでそれが参考になるかなと思います。

【参考】 uepon.hatenadiary.com

ただ、UIがちょっと変わっているかなと思いますので久しぶりに作成してみます。

Twitterにログインしている状態で以下のURLへいくと新規アプリ作成(アプリ一覧)ページに遷移します。 過去エントリの参考のURLからでも行けるようになっていますが、URLは今後変わるので新しいものを記載しています。

https://developer.twitter.com/en/apps

ページにはこれまでに作成したTwitterアプリの一覧が表示されます。

f:id:ueponx:20181230121049p:plain

画面右上にある【Create an app】ボタンをクリックすると

f:id:ueponx:20181230122030p:plain

確認のダイアログが表示されるので【Apply】ボタンをクリックします。

f:id:ueponx:20181230122147p:plain

以前はアカウントに携帯電話番号の登録することなくアプリの作成ができましたが、現在ではできないようなので以下の画面が出た場合には登録する必要があります。 【Add a valid phone number】ボタンをクリックして登録を行います。

f:id:ueponx:20181230122746p:plain

クリックするとダイアログが表示されるので【Country/region】と【Phone/number】のプルダウンご自身の設定値を適切に入力して【Next】ボタンをクリックします。

f:id:ueponx:20181230123419p:plain

確認用コードの送信ダイアログになります。この時点で携帯電話のSMS経由で確認用コードが送信されるので、そこで表示された数字列を【Verification code】の入力ボックスに 入力して【Verify】ボタンをクリックします。

f:id:ueponx:20181230123432p:plain

確認が成功すると以下のような通知が表示されます。

f:id:ueponx:20181230123355p:plain

携帯での本人確認が終了したら画面表示がもとに戻るので【Continue】ボタンをクリックして作業を続けます。 ここからアプリの設定になります。

f:id:ueponx:20181230124619p:plain

Who are you requesting access for?の質問には【I am requesting access for my own personal use】のラジオボタンにチェックし、 残りの項目へ入力していきます。

f:id:ueponx:20181230124945p:plain

f:id:ueponx:20181230125726p:plain

f:id:ueponx:20181230125816p:plain

設定が完了したら、画面下の方にある【Continue】ボタンをクリックします。

f:id:ueponx:20181230125947p:plain

続くページでも作成の理由などを詳細に書く必要があります。 特に自由記述の文面を各部分もありハードルは上がっています。

f:id:ueponx:20181230130619p:plain

f:id:ueponx:20181230130739p:plain

設定が終わったら【Continue】ボタンをクリックします。

f:id:ueponx:20181230130908p:plain

画面が利用許諾のページになるので、文面を確認してチェックボックスにチェックを入れます。 ※許諾の文面をスクロールさせてすべて閲覧しないとチェックボックスが押せないので注意です。

f:id:ueponx:20181230131008p:plain

チェックができると【Submit application】ボタンがアクティブになるので、クリックします。

f:id:ueponx:20181230131218p:plain

これで設定が終わったので、確認用のメールが送信されるので【Confirm your email】をクリックしてください。

f:id:ueponx:20181230131520p:plain

ここからレビューして作成が可能になるとのことです。

f:id:ueponx:20181230131836p:plain

アプリ作成で手順がかなり増えたような… これでメールが返送されてきたらアプリの作成作業に入ります。

以下のURLをクリックして https://developer.twitter.com/en/apps

アプリ一覧の画面に遷移して画面上の方にある【Create an app】ボタンをクリックします。

f:id:ueponx:20181230180343p:plain

アプリ名などを入力する詳細設定の画面に遷移するのでデータを入力していきます。

f:id:ueponx:20181230181059p:plain

f:id:ueponx:20181230181305p:plain

必要な項目に入力をしたら、画面下方にある【Create】ボタンをクリックします。

f:id:ueponx:20181230181428p:plain

クリックするとダイアログが表示されるかもしれませんが、内容に問題がなければ【Create】ボタンをクリックします。

f:id:ueponx:20181230181544p:plain

うまく処理が行われるとブラウザに通知が行われます。

f:id:ueponx:20181230181714p:plain

アプリができたら

以下のURLからアプリ一覧を選択して

https://developer.twitter.com/en/apps

該当のアプリの【Details】ボタンをクリックします。

f:id:ueponx:20181230182024p:plain

するとアプリの詳細設定画面に移るので【Keys and tokens】をクリックします。

f:id:ueponx:20181230182521p:plain

f:id:ueponx:20181230182219p:plain

すると、APIのアクセスに必要な

4つのキーを表示する画面になります。Access tokenAccess token secretの値が表示されていない場合には【Create】ボタンをクリックして生成をおこなってください。

f:id:ueponx:20181230142708p:plain

この4つの値がコーディングに必要になるのでこれをメモしておきます。

コーディング

ようやくコーディングになります。長かった…

ツイッターでキーワードサーチをしてデータを収集するプログラムを作成します。

これまではTweepyを使用していましたが、今回は新しい取り組みとしてrequests_oauthlibを使用してみます。(Tweepyでも処理はあんまり変わらないのですが新しいものを使ってみたかったのでこちらにしています。)詳細は以下のページを御覧ください。

TweepyではTwitterに特化した処理ですが、requests_oauthlibは他のOAuth認証を使った処理でも使用可能なので、これを使えるほうがいいことがありそうです。

【参考】 pypi.org

というかもう結構まとまっている記事がありましたので、そちらを参考にしてコードを組みました。

【参考】 qiita.com

先程メモしておいた - API key - API secret key - Access token - Access token secret の値に関しては*で伏せています。

下準備

パッケージのインストール

$ pip install requests_oauthlib
$ pip install pytz
$ pip install python-dateutil

サンプルのコーディング

このサンプルではハッシュタグ#nhkリツイートではないものを最大20件取得するものを作っています。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import json
from requests_oauthlib import OAuth1Session
from pytz import timezone
from dateutil import parser

CONSUMER_KEY = '****************'
CONSUMER_SECRET = '****************'
ACCESS_TOKEN = '****************'
ACCESS_TOKEN_SECRET = '****************'

twitter = OAuth1Session(CONSUMER_KEY,
                        CONSUMER_SECRET,
                        ACCESS_TOKEN,
                        ACCESS_TOKEN_SECRET)

url = "https://api.twitter.com/1.1/search/tweets.json"
query = '#nhk exclude:retweets'
params = {
    'q': query,
    'count': 20
}

print('----------------------------------------------------')

req = twitter.get(url, params = params)

if req.status_code == 200:
    search_timeline = json.loads(req.text)
    for tweet in search_timeline['statuses']:
        print('name::\n' + tweet['user']['name'])
        print('text::\n' + tweet['text'])
        jst_time = parser.parse(tweet['created_at']).astimezone(timezone('Asia/Tokyo'))
        print('date::')
        print(jst_time)
        print('----------------------------------------------------')
else:
    print("ERROR: %d" % req.status_code)

このコードはそんなに難しくないのですが、返されるJSONに含まれる値のcreate_at(ツイートがされた時刻)がタイムゾーンUTCで扱われているので、 ローカルタイムゾーンに合わせるためpytzdateutilのパッケージを使用しています。

終わりに

2018年の年末まで1日しかありませんが、出来上がるのでしょうか。 すくなくともデータの取得までは完成させてwordcloudへの出力が遅れるのもやむなしかなと思ってがんばります。