TwitterAPIを使ってみるテスト3(TwitterAPI Version1.1)

前回のエントリで、ライブラリTweepyを使ってTwitterAPIを使ってみました。
TwitterAPIを使ってみるテスト2(OAuth) « Walk on apps.

ただ、TweepyではAPI Version1.0にアクセスしているようでした。今年の3月に、Version1.0は使えなくなります。
そのため今回は、TweepyでAPI Version1.1を使ってみるテスト、をやってみることにします。

使っている環境:
Python2.5.4
Tweepy 1.12
Windows7(64bit)


2/20追記
14日頃にTweepyが、アップデートされたようです。
Version2では、「Twitter API 1.1 support.」とのことなので、こちらをお勧めします。


(1)TwitterAPIの仕様確認

とりあえずTwitterAPI Version1.0と1.1の違いを確認します。
例として、Twitterトレンド情報取得のURIを見てみます。マニュアルはこちら。
GET trends/:woeid | Twitter Developers
GET trends/place | Twitter Developers

日本のトレンドを取得する場合、
v1.0では、http://api.twitter.com/1/trends/23424856.json
v1.1では、https://api.twitter.com/1.1/trends/place.json?id=23424856
となる。

バージョン名と、「trends/*****」のところが変わります。


(2)ライブラリTweepyのどこをなおせばいいか

まずは、URIに含まれるバージョン名の部分について。
ライブラリTweepyの中に、api.pyというファイルがあり、この中を見てみると、class APIの中で初期値「api_root=’/1’」が設定されていました。

class API(object):
    """Twitter API"""

    def __init__(self, auth_handler=None,
            host='api.twitter.com', search_host='search.twitter.com',
             cache=None, secure=False, api_root='/1', search_root='',
            retry_count=0, retry_delay=0, retry_errors=None,
            parser=None):

そのため、アプリ作成時にTweepyを使うときにapi_root=’/1.1′ を指定することにします。以下のような形でコーディングすることになります。

        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
        api = tweepy.API(auth)
            ↓     ↓
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
        api = tweepy.API(auth_handler=auth, api_root='/1.1')

次に「trends/*****」の修正について。
さっきとおなじapi.pyファイルを見てみると、

    """ trends/location """
    trends_location = bind_api(
        path = '/trends/{woeid}.json',
        payload_type = 'json',
        allowed_param = ['woeid']
    )

となっているため、この書き方にならって、api.pyファイルのAPIクラスに、メソッドを追加してみます。(メソッド名をapi1_1_trends_placeにしてみました。)

# API1.1
    """ trends/place """
    api1_1_trends_place = bind_api(
        path = '/trends/place.json',
        payload_type = 'json',
        allowed_param = ['id']
    )

これで、Tweepyを使うときにapi.api1_1_trends_place(id=’23424856′)として呼び出せば、トレンド情報を取得できるようになります。コーディングのイメージは以下のような形になります。

        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
        api = tweepy.API(auth_handler=auth, api_root='/1.1')

        # trend情報取得
        trends_available=api.api1_1_trends_available()
        trends_place=api.api1_1_trends_place(id='23424856')

(3)最終的なコーディングまとめ

ライブラリTweepyの、api.pyファイルに、メソッド3つ追記しました
次の3つの機能について追記しています。
・トレンド情報でのWoeid一覧取得
・トレンド情報取得
・ツイートする

追記内容は以下になります。

# API1.1
    """ trends/available """
    api1_1_trends_available = bind_api(
        path = '/trends/available.json',
        payload_type = 'json',
        allowed_param = ['lat', 'long']
    )

# API1.1
    """ trends/place """
    api1_1_trends_place = bind_api(
        path = '/trends/place.json',
        payload_type = 'json',
        allowed_param = ['id']
    )

# API1.1
    """ statuses/update """
    api1_1_statuses_update = bind_api(
        path = '/statuses/update.json',
        method = 'POST',
        payload_type = 'status',
        allowed_param = ['status', 'in_reply_to_status_id', 'lat', 'long', 'place_id', 'display_coordinates', 'trim_user'],
        require_auth = True
    )

そして、実際に作成したアプリのソースを、以下に貼っておきます。

consumer_key
consumer_secret
access_token
access_token_secret
は自分のもので置き換えてください。

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

import sys
import os
import logging
import urllib2
import time
import datetime
import locale 

try:
    import json
except ImportError:
    import simplejson as json

import tweepy

########################################
consumer_key="**********"
consumer_secret="********************"
access_token="********************"
access_token_secret="********************"

def get_OAuth():
    try:
        logging.info('get_OAuth start')

        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
        api = tweepy.API(auth_handler=auth, api_root='/1.1')

        # trend情報取得
        trends_available=api.api1_1_trends_available()
        trends_place=api.api1_1_trends_place(id='23424856')

        # 結果の表示 ---------------------
        print "username=" + api.me().name

        # trends_availableの表示 ---------
        print '-' * 30
        HeaderText='%s,%s,%s,%s,%s' % ( 'name', 'placeType', 'country', 'woeid', 'countryCode')
        print HeaderText.encode('utf-8')

        results=trends_available
        for result in results:
            line='%s,%s,%s,%s,%s' % ( result['name'], result['placeType']['name'], result['country'], result['woeid'], result['countryCode'])
            print line.encode('utf-8')

        time.sleep(1)

        # trends_placeの表示 -------------
        print '-' * 30
        results=trends_place
        HeaderText='LocationName=%s,woeid=%s,created_at=%s' % ( results[0]['locations'][0]['name'], results[0]['locations'][0]['woeid'], results[0]['created_at'] )
        print HeaderText.encode('utf-8')

        for trend in results[0]['trends']:
            line='%s' % ( trend['name'])
            print line.encode('utf-8')

        time.sleep(1)

        # statuses_updateの実行 ----------
        d = datetime.datetime.today()
        locale.setlocale(locale.LC_ALL, 'ja')

        message='Updating using OAuth authentication via Tweepy! ' + d.strftime("%Y-%m-%d %H:%M:%S")
        api.api1_1_statuses_update(message)

        return
    except:
        logging.error('get_OAuth ERROR %s', sys.exc_info())
        raise

if __name__ == "__main__":
    try:
#        logging.getLogger().setLevel(logging.ERROR)
        logging.getLogger().setLevel(logging.DEBUG)

        get_OAuth()
        time.sleep(1)

        logging.info('main end')
    except:
        print sys.exc_info()

実行すると、以下のような形で、csv形式で情報表示します。

INFO:root:get_OAuth start
username=********
------------------------------
name,placeType,country,woeid,countryCode
世界中,Supername,,1,None
ウィニペグ,Town,カナダ,2972,CA
オタワ,Town,カナダ,3369,CA
ケベック州,Town,カナダ,3444,CA
モントリオール,Town,カナダ,3534,CA
トロント,Town,カナダ,4118,CA
エドモントン,Town,カナダ,8676,CA
カルガリー,Town,カナダ,8775,CA
バンクーバー,Town,カナダ,9807,CA
バーミンガム,Town,イギリス,12723,GB

   :   :
   (中略)

------------------------------
LocationName=日本,woeid=23424856,created_at=2013-01-05T12:04:29Z
そのものですね
#フォロワーさんで十二支揃うのかどうか
バリタ
おにぎりせんべい
#ダブルフェイス
チロルチョコ
アニスパ
#anispa
アラスカ
岡村さん
INFO:root:main end

(4)問題点

とりあえずいろいろやってみたものの、自分で使うぶんには、これでもいいんだけど、人に使ってもらえるようなアプリを作るときはどうなんだろ。
ユーザにaccess_tokenを入力してもらう必要ないはずなんだけど、Tweepyをつかって、そういった形のアプリ作成できるんだろうか・・・。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s