TwitterAPIを使ってTwitterに奪われる時間を減らす(ハイライト表示(っぽい)タイムラインを作る)


背景

Twitterとは:人類の貴重な時間を根こそぎ奪い取っていく悪魔の道具

Twitterに奪われる時間を少しでも少なくするために、ハイライト的なツイートだけまとめて表示してくれるものを作ろう!

やったこと

・Twitterのタイムラインからお気に入り件数の多いものだけを抽出して表示
・ニュースとかではなく友人の動向が知りたかったので、相互フォロワーのツイートのみ表示

Twitterのデータはどうやって取得するの?

Twitter APIというものを使います。

APIって何?

API : Application Programming Interface

ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様である。
簡単にいえば、アプリケーションをプログラムするにあたって、プログラムの手間を省くため、もっと簡潔にプログラムできるように設定されたインターフェースの事である。

出展:ウィキペディア「Application Programming Interface」

なるほど、APIを使えばごりごりコード書かなくてもいろいろできるってわけですね。
特にWebサービスのAPIはWebAPIと呼ばれ、Webサービスのデータを取得したりが可能になるそうです。(Twitter APIもこれ)

Twitter APIを使ってみよう!

Twitter APIを使うためにはディベロッパーサイトで自分のアカウントを登録する必要があります。
https://dev.twitter.com/

登録の仕方は検索するとたくさん出てきます。
http://qiita.com/hazigin/items/d9caf26c23c65bd89976
https://syncer.jp/twitter-api-matome
http://webnaut.jp/develop/633.html

ポイントを挙げるなら
・Twitterアカウントに電話番号を登録する必要がある
・作るWebサイトのURLを登録する必要がある(とりあえずローカルでもOK)
って感じです。

登録が完了すると、
・Consumer Key
・Consumer Secret
・Access Token
・Accesss Token Secert
の4つのキーが取得できます。これで準備完了です。

作ってみよう!

言語はPythonです。
PythonからTwitterにアクセスする方法はいくつかあるらしいのですが、今回はこのサイトを参考にしました。

top_fav_timeline.py
# -*- coding:utf-8 -*-
%matplotlib inline
from requests_oauthlib import OAuth1Session
import json
import datetime
import urllib, cStringIO
from PIL import Image
import matplotlib.pyplot as plt

# トークンの取得
CK = '******************'  # Consumer Key
CS = '******************'  # Consumer Secret
AT = '******************'  # Access Token
AS = '******************'  # Accesss Token Secert

# ツイート読み込み数、ファボ数の上限加減を設定可能
def top_fav_timeline(count=100, minlim=2, maxlim=30):
    """相互フォロワーかつファボ数が多いものを表示する

    引数
    count:
    timelineの取得件数(ノットイコール 表示件数)
    !フォロー情報取得の上限のためか、大きくしすぎると動かなくなる!

    minlim, maxlim:
    ファボ数の下限上限

    """

    # Key取得
    twitter = OAuth1Session(CK,CS,AT,AS)

    # タイムライン取得
    url_timeline = "https://api.twitter.com/1.1/statuses/home_timeline.json"

    # パラメータの設定、ここではtimelineの取得件数を指定
    params_timeline = {'count':count}

    # OAuthでtimelineをGET
    req_timeline = twitter.get(url_timeline, params = params_timeline)

    if req_timeline.status_code == 200:
        # レスポンスはJSON形式なので parse する
        timeline = json.loads(req_timeline.text)

        # timelineのuser_name取得
        test = []
        for i in range(len(timeline)):
            test.append(timeline[i]["user"]["screen_name"])
        test_s = ','.join(test)
        params_friend = {'screen_name':test_s}

        # timelineにいるユーザーと自分のフォロワーステータスを取得
        url_friend = "https://api.twitter.com/1.1/friendships/lookup.json"
        req_friend = twitter.get(url_friend, params = params_friend)
        friend_test = json.loads(req_friend.text)

        if req_friend.status_code == 200:
            # timelineで取得したツイートデータにそれぞれアクセス
            for tweet in timeline:

                # ツイートしたユーザーのフォロワーステータスを取得
                for i in range(len(friend_test)):
                    if friend_test[i]['screen_name'] == tweet["user"]["screen_name"]:
                        test_num = i

                # ツイートしたユーザーが相互フォロワーだった場合、timelineに表示する
                if u'followed_by' in friend_test[test_num]['connections']:
                    # favorite_countが閾値以上のものを表示
                    if tweet["favorite_count"] >= minlim and tweet["favorite_count"] <= maxlim:

                        # 画像の表示
                        file = cStringIO.StringIO(urllib.urlopen(tweet["user"]["profile_image_url_https"]).read())
                        img = Image.open(file)
                        # pltのオプションいろいろ設定
                        plt.figure(figsize=(0.5,0.5)) # サイズ
                        plt.axis('off') # メモリ線非表示
                        plt.imshow(img)
                        plt.show()

                        # ツイート時間をdatetime型に変換し、日本時間に
                        dst = datetime.datetime.strptime(tweet["created_at"],'%a %b %d %H:%M:%S +0000 %Y') + datetime.timedelta(hours=9)

                        # timelineに表示
                        print dst
                        print tweet["user"]["name"] + " / @" + tweet["user"]["screen_name"]
                        print tweet["text"]
                        print '★:' + str(tweet["favorite_count"])
                        print '-------'

    else:
        # タイムラインが取得できなかった場合
        print ("Error: %d" % req.status_code)

できました。forとifだらけで気持ち悪いです。
juyter notebookで書いたので%matplotlib inlineが冒頭に入ってます。

実行すると
・プロフィール画像
・ツイート時間
・idと表示名
・ツイート本文
・ファボ数
がprintされます。
何回もリクエストを行わないためにあらかじめtimelineからscreen_nameを取ってくるのと、プロフィール画像を表示させるために画像URLにアクセスしてオンラインから直接画像を引っ張ってきてjupyterに表示させるのが面倒でした。

終わりに

今回は相互フォローのツイートを選んで表示させましたが、条件を少し変えれば相互フォロー「じゃない」ツイートのみ表示させることもできるはずです。
よくファボられるニュースとか探すのに使えるかもしれませんね。

GET statuses/home_timelineでタイムラインにあるツイートの情報を取得できるのですが、ツイート本文をはじめ、プロフィール画像やらツイート時間やらツイートしたユーザのいろんな情報が取得できるので、いろんなことができるんじゃないかと思います。

レッツエンジョイツイッター!

参考にしたサイト

Twitter API TIPS
https://dev.twitter.com/rest/public

PythonでTwitterAPIにアクセス
http://qiita.com/yubais/items/dd143fe608ccad8e9f85

OAuthの鍵がたくさん登場するが各々の役割についてまとめてみた
http://d.hatena.ne.jp/mabots/20100615/1276583402

Python で文字列な日付を datetime に変換するには。
http://loumo.jp/wp/archive/20110408215311/