2013年4月22日

Tumblr API v2 を利用する

概要

TumblrのAPIを突然利用したくなったので、利用方法をメモする。

OAuth Key の取得

API を利用するには Twitter 等と同様 アプリケーションを登録して OAuth Keyを取得する必要がある。
プリの登録は、「http://www.tumblr.com/oauth/apps」で行なう。

Tumblr Register application

「Register application」ボタンで登録。

Tumblr reg app name

「Application name」、「Administrative contact email」、「Default callback URL」が必須なので入力する。
登録内容は後でも変更できる。callback URL はとりあえず自分のサイト等にしておけば良い。

登録が完了すると、「OAuth Consumer Key」、「Secret Key」が取れる。

クライアントアプリケーション作成

クライアントアプリケーショを作成する。
Python で rauth を利用して認証と表示までしたサンプルが以下。実際に利用する場合は「OAuth Consumer Key」、「Secret Key」を自分の物に変更する。
rauth は OAuth を簡単に処理する外部ライブラリでかなり便利。「pip install rauth」などであらかじめインストールしておくこと。

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

import os
import re
import webbrowser
from ConfigParser import SafeConfigParser

from rauth import OAuth1Service


class TumblrClientTest(unittest.TestCase):
    """
    Tumblr クライアントサンプルテスト
    """

    def test_sample(self):
        """
        テスト
        """
        client = TumblrClient()

        # sessin の取得
        session = client.get_session()

        # user/info 取得
        response = session.get('user/info').json()
        self.assertEqual(response['meta']['status'], 200)
        self.assertEqual(response['meta']['msg'], 'OK')

        # blog/info 取得
        path = 'blog/scipsy.tumblr.com/info?api_key={api_key}'
        response = session.get(path.format(
            api_key=client.get_api_key())).json()
        self.assertEqual(response['meta']['status'], 200)
        self.assertEqual(response['meta']['msg'], 'OK')
        self.assertEqual(response['response']['blog']['name'], 'scipsy')


class TumblrClient(object):
    """
    Tumblr クライアントサンプル
    """
    def get_api_key(self):
        """
        API key = OAuth Consumer Key
        """
        return 'OAuth Consumer Key'

    def get_consumer_secret(self):
        """
        Secret Key
        """
        return 'Secret Key'

    def get_session(self):
        """
        session の取得
        """
        # 設定ファイルのパス
        config_file = os.path.abspath(os.path.join(
            os.path.dirname(__file__), 'tumblr.cfg'))

        tumblr = OAuth1Service(
            name='tumblr',
            consumer_key=self.get_api_key(),
            consumer_secret=self.get_consumer_secret(),
            request_token_url='https://www.tumblr.com/oauth/request_token',
            access_token_url='https://www.tumblr.com/oauth/access_token',
            authorize_url='https://www.tumblr.com/oauth/authorize',
            base_url='https://api.tumblr.com/v2/')

        if os.path.exists(config_file):
            # 設定ファイルが存在する場合、設定ファイル読み込み
            config = SafeConfigParser()
            config.read(config_file)

            access_token = config.get('account', 'access_token')
            access_token_secret = config.get('account', 'access_token_secret')

            session = tumblr.get_session((access_token, access_token_secret))
        else:
            # 設定ファイルが存在しない場合、初回認証
            session = self.auth(tumblr)

            # 設定ファイル出力
            config = SafeConfigParser()
            sec_name = 'account'
            config.add_section(sec_name)
            config.set(sec_name, 'access_token', session.access_token)
            config.set(sec_name, 'access_token_secret',
                       session.access_token_secret)
            with open(config_file, 'wb') as configfile:
                config.write(configfile)

        return session

    def auth(self, tumblr):
        """
        ブラウザでの初回認証
        """
        request_token, request_token_secret = tumblr.get_request_token()
        authorize_url = tumblr.get_authorize_url(request_token)
        print '表示されたURLをブラウザで開きます: ' + authorize_url
        webbrowser.open(authorize_url)

        authed_url = raw_input('ブラウザアドレスバーのURLをペースとしてください: ')
        verifier = re.search(r'\oauth_verifier=([^#]*)', authed_url).group(1)

        # session 取得
        session = tumblr.get_auth_session(
            request_token,
            request_token_secret,
            method='POST',
            data={'oauth_verifier': verifier})

        return session

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

正しく認証されていると、設定画面の「Apps」に登録したアプリが表示される。

Tumblr apps

API のドキュメント

公式 APIドキュメントが「http://www.tumblr.com/docs/en/api/v2」に存在するので、あとは必要な物を利用するだけ。

2013年4月2日

matplotlib 1.2.1 コンパイル時に Tk 8.5 must be compiled with tcl.h from Tcl 8.5 のエラー

現象

「Tk 8.5 must be compiled with tcl.h from Tcl 8.5」のエラーは Tcl 8.4 と 8.5 が同居している場合に発生する。
Mac OS X の場合、MacPorts や Homebrew、ActiveTck なんかをインストールしている環境で発生しやすい。
Linux 系の場合、パスの設定が変になっている可能性がある。

対処

Mac OS X の場合は、tkagg を利用しないのが一番簡単だと思う。
setup.cfg に以下のように設定してコンパイルすれば良い。

[gui_support]
tkagg = False

本来は根源的に解決すべきだが、とりあえずはこれでも大体の場合は困らない。
ただ tkagg を必要とする場合は、別途考える必要があるかも。