tumblr_clientを試す

ふと今年どのくらい記事を書いたのかなと考え、そういえば以前からTumblr APIをいじってみようと考えていたことも思い出したので、試しにちょっとやってみた。

まずはtumblr_client.gemをインストールする。

$ gem install tumblr_client
Fetching: multipart-post-2.0.0.gem (100%)
Successfully installed multipart-post-2.0.0
Fetching: faraday-0.9.2.gem (100%)
Successfully installed faraday-0.9.2
Fetching: faraday_middleware-0.9.2.gem (100%)
Successfully installed faraday_middleware-0.9.2
Fetching: simple_oauth-0.3.1.gem (100%)
Successfully installed simple_oauth-0.3.1
Fetching: oauth-0.5.1.gem (100%)
Successfully installed oauth-0.5.1
Fetching: tumblr_client-0.8.5.gem (100%)
Successfully installed tumblr_client-0.8.5
invalid options: -SHN
(invalid options are ignored)
Parsing documentation for multipart-post-2.0.0
Installing ri documentation for multipart-post-2.0.0
Parsing documentation for faraday-0.9.2
Installing ri documentation for faraday-0.9.2
Parsing documentation for faraday_middleware-0.9.2
Installing ri documentation for faraday_middleware-0.9.2
Parsing documentation for simple_oauth-0.3.1
Installing ri documentation for simple_oauth-0.3.1
Parsing documentation for oauth-0.5.1
Installing ri documentation for oauth-0.5.1
Parsing documentation for tumblr_client-0.8.5
Installing ri documentation for tumblr_client-0.8.5
Done installing documentation for multipart-post, faraday, faraday_middleware, simple_oauth, oauth, tumblr_client after 2 seconds
6 gems installed

簡単な動作を確認できるtumblrコマンドが用意されているので、おもむろに実行する。

$ tumblr  
Register an application at: http://www.tumblr.com/oauth/apps
OAuth Consumer key: $KEY
OAuth Consumer secret: $SECRET

APIの利用にはアプリケーションの登録が必要となる。

https://www.tumblr.com/oauth/registerで必要な情報を入力する。入力値は後から変更できるので適当でよい。ただし登録したアプリケーションの削除は今のところできないようなので、お試しの際にはお試しとわかるような値にしておくほうがよいと思う。

  • アプリケーション名: 適当に記入する。承認画面で表示される。
  • アプリケーションウェブサイト、App Store URL、Google Play Store URL: このうちのどれか一つは記入しなければならない。
  • アプリケーションの説明: 適当に記入する。
  • 管理用の連絡先メール: デフォルト値が入っているので、よければそれで。
  • デフォルトのコールバックURL: 記入が必要だが受け口が特にないのでlocalhostにリダイレクトさせておくことにした。

これでConsumer keyとConsumer secretを入手できる。tumblrコマンドからのプロンプトに対してそれぞれを入力する。

すると承認画面のURLが表示されるので、ブラウザでアクセスし、承認する。承認するとコールバックURLにリダイレクトされる。

リダイレクト先のURLにはQUERY文字列にoauth_verifierが含まれているので、その値を入力する。QUERY文字列は?oauth_token=$token&oauth_verifier=$verifier#_=_のような形式。入力するのは$verifierの部分。

http://www.tumblr.com/oauth/authorize?oauth_token=$token
Post-redirect, copy the oauth_verifier
OAuth Verifier: $verifier

するとロゴが表示されてirbのセッションが始まる。

        .                                 .o8       oooo
      .o8                                "888       `888
    .o888oo oooo  oooo  ooo. .oo.  .oo.   888oooo.   888  oooo d8b
      888   `888  `888  `888P"Y88bP"Y88b  d88' `88b  888  `888""8P
      888    888   888   888   888   888  888   888  888   888
      888 .  888   888   888   888   888  888   888  888   888    .o.
      "888"  `V88V"V8P' o888o o888o o888o `Y8bod8P' o888o d888b   Y8P

irb(main):001:0> c = Tumblr::Client.new
 => #<Tumblr::Client:0x007fe068958a30 @consumer_key="$KEY", @consumer_secret="$SECRET", @oauth_token="$oauth_token", @oauth_token_secret="$oauth_secret", @client=nil, @api_scheme=nil>

irb(main):005:0> c.blog_info('aylog')['blog']['total_posts']
=> 282    

tumblrコマンドで入力した認証情報は~/.tumblrに保存される。tumblrコマンドはこれを読み込んでいる。

同じように~/.tumblrを使ってTumblrにアクセスし、2016年に書いた記事をカウントしてみる。

require 'tumblr_client'
require 'pathname'
require 'yaml'
require 'time'
require 'pp'

# ~/.tumblrを読み込んで認証情報を設定する
config_path = Pathname.new('~/.tumblr').expand_path
config = YAML.load_file(config_path)

Tumblr.configure do |c|
  config.each do |key, val|
    next unless Tumblr::Config::VALID_OPTIONS_KEYS.include?(key.to_sym)
    c.public_send(:"#{key}=", val)
  end
end

# 記事数をカウントする
client = Tumblr::Client.new
blog_id = 'aylog'
info = Hash.new(0)
tags = []
offset = 0

catch do |tag|
  res = client.posts(blog_id, offset: offset)
  posts = res['posts']
  throw tag if posts.empty?

  posts.each do |post|
    throw tag unless Time.parse(post['date']).localtime.year == 2016
    info[post['type']] += 1
    tags |= post['tags']
  end

  offset += posts.size
  redo
end

# カウント結果の手抜き表示
pp info
p tags
p info.values.sum

実行結果によれば43個の記事を書いたらしい。ただし自分で書いたのは24個で、この記事はカウントされていない。

$ ruby tumblr_client_sample.rb
{"text"=>24, "link"=>12, "quote"=>4, "video"=>2, "photo"=>1}
["Ruby", "Chrome", "Homebrew", "コーヒー", "欲しい", "Rails", "Middleman", "pull request", "正規表現", "Unicode", "PC", "Debian", "ActiveRecrod", "OSS"]
43