2012年9月10日

Python OAuth ライブラリ rauth で Twitter API v1.1 を利用する

概要

Twitter API v1.1 が公開されました。 全ての endpoint で OAuth 1.0a での認証が必須になっています。
Python のライブラリで OAuth 1.0aの認証が簡単にコーディングできる「rauth」から、Twitter API v1.1 を利用してみます。

rauth に関して

rauth」は OAuth 1.0/a, 2.0、Oflyの認証に対応した Python のライブラリです。
Python の HTTPライブラリである「requests」に依存しています。
requests」が非常にすぐれたライブラリで、その機能を有効に利用しているため、「rauth」はかなり簡単に OAuth 認証のコーディングが可能です。
ライセンスは MIT ライセンスです。残念ながら Python 3 には現在対応していない模様です。

インストール

pip でインストールします。

pip install rauth

rauth は「requests」に依存していますが、pip なら依存関係を解決してインストールされます。

Twitter API v1.1 にアクセスしてみる

「access_token」、「access_token_secret」は取得済みの状態とします。
以下は、「search/tweets」の「application/rate_limit_status」を取得するサンプルです。unittest として記述しています。

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

from rauth.service import OAuth1Service


class TestApi(unittest.TestCase):
    """Twitter API test"""

    def test_oauth(self):
        auth = OAuth1Service(
            name='twitter',
            consumer_key='consumer_key',
            consumer_secret='consumer_secret',
            request_token_url='https://api.twitter.com/oauth/request_token',
            access_token_url='https://api.twitter.com/oauth/access_token',
            authorize_url='https://api.twitter.com/oauth/authorize')
        self.assertIsNotNone(auth)
        response = auth.get(
            'https://api.twitter.com/1.1/application/rate_limit_status.json',
            access_token='access_token',
            access_token_secret='access_token_secret')
        content = response.content
        limit = content['resources']['search']['/search/tweets']['limit']
        self.assertEqual(180, limit)

if __name__ == '__main__':
    unittest.main()

つぶやいてみる

つぶやきを投稿するサンプルは以下になります。「application/rate_limit_status」の例を含めて多少汎用化してあります。Python 2.6、Python 2.7 で動作します。

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

import datetime

from rauth.service import OAuth1Service


class TestApi(unittest.TestCase):
    """Twitter API test"""
    def setUp(self):
        self.auth = OAuth1Service(
            name='twitter',
            consumer_key='consumer_key',
            consumer_secret='consumer_secret',
            request_token_url='https://api.twitter.com/oauth/request_token',
            access_token_url='https://api.twitter.com/oauth/access_token',
            authorize_url='https://api.twitter.com/oauth/authorize',
            header_auth=True)
        self.access_token = {
            'access_token': 'access_token',
            'access_token_secret': 'access_token_secret'}
        self.endpoint = 'https://api.twitter.com/1.1/{path}.json'

    def test_get_rate_limit_status(self):
        """application/rate_limit_status test"""
        response = self.auth.get(
            self.endpoint.format(path='application/rate_limit_status'),
            **self.access_token)
        content = response.content
        limit = content['resources']['search']['/search/tweets']['limit']
        self.assertEqual(180, limit)

    def test_post_statuses_update(self):
        """statuses/update test"""
        text = 'つぶやきテストです。{now}'.format(now=datetime.datetime.now())
        params = {'status': text}
        response = self.auth.post(
            self.endpoint.format(path='statuses/update'),
            params=params,
            **self.access_token)
        content = response.content
        self.assertEqual(text.decode('utf-8'), content['text'])

if __name__ == '__main__':
    unittest.main()

まとめ

rauth」で Twitter API v1.1 を利用して、情報の取得と投稿ができました。Twitter API v1.1 がかなり整理されたことで、簡単な処理なら Twitter に特化したライブラリを利用する必要はほとんどないかもしれません。
rauth」は Twitter だけでなく OAuth 認証全般で利用できますので、試してみると良いでしょう。

blog comments powered by Disqus