PythonとOAuthを使ってTumblrに投稿する方法

先日、ブログをTumblrからWordpressに移動したのですが、そういう場合は前のブログをどうするかっていう問題があるかと思います。自分の場合、前のTumblrのブログの各ページに、新しいブログへのリンクを貼ることに決めました。ただし、その更新作業を手でやるのはあまりに時間がかかるので、TumblrのAPIを使ってできないかを調べてみました。

この記事ではPythonのOAuthライブラリを使って、Tumblrに投稿するサンプルを載せています。この記事と、以前書いたTumblr APIで投稿を取得する方法を参考にすれば、Tumblrの過去の投稿すべてに新しいブログへのリンクを貼ることもできると思います。

なお、この記事は2011年12月26日時点のものであり、今後APIの仕様が変更された場合は使えない場合があるのでご注意ください。また、以下の手順はMacを使ったものですが、他のOSでも流れは変わらないと思います。

目次

  1. python-oauth2のモジュールの追加
  2. アプリケーションの登録
  3. リクエストトークンの取得
  4. 権限の委譲
  5. アクセストークンの取得
  6. Pythonで投稿するサンプル
  7. おまけ

python-oauth2モジュールの追加

Pythonを使ってTumblrに投稿するにはOAuth認証する必要があります。Pythonには、python-oauth2というモジュールがあったので、今回はこれを使います。

python-oauth2のインストール

```
sudo easy_install-2.7 oauth2
```

これでPythonを使ってOAuth認証が簡単にできるようになります。

↑ 目次に戻る

アプリケーションの登録

TumblrでOAuth認証を行うには、予めアプリケーションを登録して、Consumer KeyとConsumer Secretを発行しておく必要があります。まず、Tumblrにログインした状態でアプリケーションの管理画面を開き、「+アプリケーションを登録する」ボタンをクリックします。そうすると、登録用の画面に遷移するので、ここで以下の情報を入力します。

  • Application name:
  • Administrative contact email:
  • Default callback URL:

「Application name:」には適当な名前を入力しておきます。「Administrative contact email:」には、元々Tumblrアカウントのメールアドレスが入力されていると思いますのでそのままにしておきます。「Default callback URL:」は、今回はサーバサイドで動かすわけではないので適当にを入力しておきます。例えば「http://localhost:8080」とか入力しておけばいいと思います。入力したら「Register」をクリックしてアプリケーションを登録します。

これでアプリケーションの登録が終わりました。画面には、自分が登録したアプリケーションが表示されていると思います。ここで、次のステップで必要な「OAuth Consumer Key」と「Secret Key」を控えておきましょう。なお、「Secret Key」は「Show secret key」リンクをクリックすると表示されます。

OAuth Consumer KeyとSecret Key

↑ 目次に戻る

リクエストトークンの取得

アプリケーションの登録を済ませたら、先ほど控えたConsumer KeyとConsumer Secretを使ってリクエストトークンを取得します。Pythonで以下のように取得することができます。※ 下記プログラムの[Consumer Key]と[Consumer Secret]は、アプリケーションを登録した際に控えた文字を使ってください。

```
#! /opt/local/bin/python
#coding: utf-8

import oauth2
import urlparse

REQUEST_TOKEN_URL = 'http://www.tumblr.com/oauth/request_token'

CONSUMER_KEY = '[Consumer Key]'
CONSUMER_SECRET = '[Consumer Secret]'

def main():
consumer = oauth2.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
client = oauth2.Client(consumer)
resp, content = client.request(REQUEST_TOKEN_URL, 'GET')
request_token = dict(urlparse.parse_qsl(content))
print 'Request Token: %s' % request_token['oauth_token']
print 'Request Token Secret: %s' % request_token['oauth_token_secret']

if __name__ == '__main__':
main()
```

```
--- 実行結果 ---

Request Token: ...
Request Token Secret: ...
```

↑ 目次に戻る

権限の委譲

リクエストトークンを取得したら、それを使ってアプリケーション認可用のURLを組み立てます。※ [Request Token]は、先ほど実行したPythonプログラムで表示された値を使います。

```
http://www.tumblr.com/oauth/authorize?oauth_token=[Request Token]
```

上記URLにブラウザでアクセスすると、「拒否」と「許可」というボタンが表示されていますので、「許可」をクリックします。これで、先ほど作成したアプリケーションに投稿などをする権限が委譲されました。

権限の委譲

「許可」を押したら、アプリケーション登録時に指定した「callback URL」にリダイレクトされますが、存在しないアドレスを入力しておいたので、ブラウザがエラー画面を表示します。ここですぐに画面を閉じずに、ブラウザのアドレス欄から「oauth_verifier」を控えておきます。この「oauth_verifier」は、次のアクセストークンを取得するステップで使用します。

oauth_verifier

↑ 目次に戻る

アクセストークンの取得

アプリケーションに権限を与えたら、次はアクセストークンを取得します。これにはアプリケーション登録時の「Consumer Key」と「Consumer Secret」、権限の委譲で取得した「Request Token」と「Request Token Secret」、「oauth_verifier」が必要になります。以下プログラムの[]で括られた箇所を書き換えて実行することで、API呼び出しの際に付与するアクセストークンを取得することができます。

```
#! /opt/local/bin/python
#coding: utf-8

import oauth2
import urlparse

ACCESS_TOKEN_URL = 'http://www.tumblr.com/oauth/access_token'

CONSUMER_KEY = '[Consumer Key]'
CONSUMER_SECRET = '[Consumer Secret]'
REQUEST_TOKEN = '[Request Token]'
REQUEST_TOKEN_SECRET = '[Request Token Secret]'
OAUTH_VERIFIER = '[oauth_verifier]'

def main():
consumer = oauth2.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
token = oauth2.Token(REQUEST_TOKEN, REQUEST_TOKEN_SECRET)
token.set_verifier(OAUTH_VERIFIER)
client = oauth2.Client(consumer, token)
resp, content = client.request(ACCESS_TOKEN_URL, 'POST')
access_token = dict(urlparse.parse_qsl(content))
print 'Access Token: %s' % access_token['oauth_token']
print 'Access Token Secret: %s' % access_token['oauth_token_secret']

if __name__ == '__main__':
main()
```

```
--- 実行結果 ---

Access Token: ...
Access Token Secret: ...
```

↑ 目次に戻る

Pythonで投稿するサンプル

アクセストークンを取得したら、それをパラメータに加えてAPIを叩けるようになります。以下、Tumblrに下書きとして新規投稿するサンプルになります。なお、下記サンプルの[Base Hostname]という箇所は、自分のTumblrのホスト名を入力してください。例えば、私の場合は「yusukemurayama.tumblr.com」になりますので「BASE_HOSTNAME='yusukemurayama.tumblr.com'」となります。

```
#!/opt/local/bin/python
#coding: utf-8

import oauth2
from urllib import urlencode

CONSUMER_KEY = '[Consumer Key]'
CONSUMER_SECRET = '[Consumer Secret]'
ACCESS_TOKEN = '[Access Token]'
ACCESS_TOKEN_SECRET = '[Access Token Secret]'
BASE_HOSTNAME = '[Base Hostname]'

def main():
url = 'http://api.tumblr.com/v2/blog/%s/post' % BASE_HOSTNAME
post_title = 'テスト投稿'
post_body = 'これはテスト投稿です。'
token = oauth2.Token(key=ACCESS_TOKEN, secret=ACCESS_TOKEN_SECRET)
consumer = oauth2.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
params = {
'type': 'text',
'state': 'draft',
'title': post_title,
'body': post_body,
}
client = oauth2.Client(consumer, token)
resp, content = client.request(url, method='POST', body=urlencode(params))

if __name__ == '__main__':
main()
```

これで、Pythonを使ってTumblrに投稿できるようになりました。

↑ 目次に戻る

おまけ

最後におまけとして、コマンドプロンプトからTumblrへ投稿するサンプルプログラムを載せておきます。特に新しいことはやっておらず、上記手順をひとまとめにしたものになります。試しに走らせる場合、[Consumer Key]、[Consumer Secret]、[Base Hostname]を入力してお使いください。

```
#! /opt/local/bin/python
#coding: utf-8

import oauth2
import urlparse
from urllib import urlencode

REQUEST_TOKEN_URL = 'http://www.tumblr.com/oauth/request_token'
AUTHORIZE_URL = 'http://www.tumblr.com/oauth/authorize'
ACCESS_TOKEN_URL = 'http://www.tumblr.com/oauth/access_token'

CONSUMER_KEY = '[Consumer Key]'
CONSUMER_SECRET = '[Consumer Secret]'
BASE_HOSTNAME = '[Base Hostname]'

def main():
consumer = oauth2.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
request_token = get_request_token(consumer)
oauth_verifier = get_verifier(request_token)
access_token = get_access_token(consumer, request_token, oauth_verifier)
post_draft(consumer, access_token)

def get_request_token(consumer):
client = oauth2.Client(consumer)
resp, content = client.request(REQUEST_TOKEN_URL, 'GET')
return dict(urlparse.parse_qsl(content))

def get_verifier(request_token):
print 'ブラウザで以下のURLを開いてください。'
print '%s?oauth_token=%s' % (AUTHORIZE_URL, request_token['oauth_token'])
oauth_verifier = raw_input('oauth_verifierを入力してください:')
return oauth_verifier

def get_access_token(consumer, request_token, oauth_verifier):
token = oauth2.Token(request_token['oauth_token'],
request_token['oauth_token_secret'])
token.set_verifier(oauth_verifier)
client = oauth2.Client(consumer, token)
resp, content = client.request(ACCESS_TOKEN_URL, 'POST')
return dict(urlparse.parse_qsl(content))

def post_draft(consumer, access_token):
url = 'http://api.tumblr.com/v2/blog/%s/post' % BASE_HOSTNAME
post_title = raw_input('タイトルを入力してください:')
post_body = raw_input('テキストを入力してください:')
token = oauth2.Token(key=access_token['oauth_token'],
secret=access_token['oauth_token_secret'])
params = {
'type': 'text',
'state': 'draft',
'title': post_title,
'body': post_body,
}
client = oauth2.Client(consumer, token)
resp, content = client.request(url, method='POST', body=urlencode(params))

if __name__ == '__main__':
main()
```

↑ 目次に戻る

この記事が役に立った場合、シェアしていただけると励みになります!!