はてなブログ API 用の gem である "Hatenablog" を使ってみました

"Hatenablog" とは

"Hatenablog" とは、はてなブログ API 用の gem です。

github.com

使い方

使い方は、作者の方の記事を読めばほぼ分かるかと思います。

blog.kymmt.com

併せて README を読むとよいでしょう。

github.com

使い方詳細

実際に使ってみました。

1. gem をインストールする

まず gem をインストールします。$ gem install する方法と Gemfile を書いて $ bundle install する方法があるかと思いますが、後者を選択しました。

適当なディレクトリを作って移動

適当なディレクトリを作って移動します。

$ mkdir my_hatenablog
$ cd my_hatenablog
Gemfile を作る

その後、以下のような Gemfile を作ります。いきなりベタ書きでもいいですし、$ bundler init でひな形を作ってからそれを編集でもよいです。

source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'hatenablog'
bundle install を行う

Gemfile が書けたら、$ bundle install をして、gem をインストールします。

$ bundle install

2. Access token と Access token secret を取得する

利用するためには Access tokenAccess token secret を取得する必要があります。ドキュメントに書いてあるとおりですが、まず はてなのアプリケーション登録ページ をよく読んで OAuth Consumer KeyOAuth Consumer Secret を取得(作成)します*1

実際の取得ページ(確認ページ)は こちら です。

それらが取得できたら、本 gem のインストールにより併せてインストールされた get_hatena_oauth_access_token というコマンドを用いて Access tokenAccess token secret が取得できます。この部分は完全手動でやると面倒なのでありがたいです。

get_hatena_oauth_access_token コマンドを実行する

以下のようにコマンドを実行します。Gemfile 経由でインストールしたので、bundle exec を付与して実行しています。第一引数が OAuth Consumer Key で、第2引数が OAuth Consumer Secret です。

$ bundle exec get_hatena_oauth_access_token HogeHoge== FooBarFoobar=
「コード(PIN)」を取得する

正しい引数でコマンドが実行されると、以下のような URL が次の行に表示されます。この URL をコピペするなりして Webブラウザ で開きます。

Visit this website and get the PIN: https://www.hatena.com/oauth/authorize?oauth_token=XXXXXXXXXXXXXXXXXXXX

すると、以下のように承認画面が出てきます。

問題なければ承認して「コード(PIN)」を取得します。コピペ用に、コードはコピーしておきます。

コード(PIN)を貼り付けて、Access token と Access token secret を取得する

そしてターミナルに戻り、Enter the PIN: と表示されている後ろに、コードを貼り付けて Enter を押します。入力されたコードが正しければ、Access tokenAccess token secret が得られると思います。以下の画像のようになります*2

3. コードを書く

あとは Ruby のコードを書くだけです。ドキュメント を読むのがいいかと思いますが、簡単なサンプルを書いてみます。

require 'hatenablog' する

hatenablog の gem を利用するために、まずは require します。全てのコードにおいて必要な記述です。

require 'hatenablog'
client を定義する

はてなブログ へのアクセスの主体となる client を定義します。全てのコードにおいて必要な記述です。

client の設定情報は YAML に書いて分割する方が好ましいと思いますが、簡単なスクリプトを想定して、コードに直接埋め込む形を取ってみます。

client は次のコードで定義できます。これまでに取得した各種の値を設定します。user_id は「はてなのユーザ名」です(はてなにログインする際に入力するユーザ名)。

blog_id は「サブドメインを含めた、ブログのドメイン全体」です。id という接尾語があったため、最初はサブドメインだけを指すのかな、と思っててハマりました*3。この blog_id を変更することで、一人で複数のブログを作成している場合の使い分けができます。

client = Hatenablog::Client.new do |config|
  config.consumer_key         = 'YOUR_CONSUMER_KEY'
  config.consumer_secret      = 'YOUR_CONSUMER_SECRET'
  config.access_token         = 'YOUR_ACCESS_TOKEN'
  config.access_token_secret  = 'YOUR_ACCESS_TOKEN_SECRET'

  config.user_id = 'YOUR_USER_ID'
  config.blog_id = 'hogehoge.hatenablog.com'
end
ブログのタイトル と ブログの作成者名 を取得する

client が定義できたので、試しに「ブログのタイトル名」と「ブログの作成者名」を取得して動作確認をしてみます。以下のコードを書きます。

puts client.title
puts client.author_name

上記のコードにより「ブログのタイトル名」と「ブログの作成者名」が表示されれば client の設定はうまくいっています。

記事のタイトル一覧を取得する

client を定義して、記事のタイトル一覧を取得してみます。以下のコードを書きます。

client.entries.each do |entry|
  puts "#{entry.id}: #{entry.title}"
end

上記のコードにより、以下のような表示が得られます。

26006613500000010: こんにちは
26006613500000009: おはようございます
26006613500000008: こんばんは
26006613500000007: いただきます
26006613500000006: ごちそうさまでした
26006613500000005: おやすみなさい
26006613500000004: お元気ですか
26006613500000003: 体調はいかがですか?
26006613500000002: 今日は暑いですね
26006613500000001: おつかれさまでした

今回のコードでは、「対象としているのは公開記事であること」、「ブログの1ページ目に表示される量の記事数を取得していること」という点には注意が必要です。

記事を投稿してみる

client を定義して、記事を投稿してみます。以下のコードを書きます(ドキュメントのままです)。

entry = client.post_entry(
  'Example Title',                  # title
  'This is the **example** entry.', # content
  ['Ruby', 'Rails'],                # categories
  'yes'                             # draft
)

post_entry メソッドの第四引数が yes となっていますので、このコードを実行すると記事は「下書き」として保存されます*4

私がプチハマりしたところはカテゴリの指定の箇所です。「カテゴリを設定しない」場合には、空の配列([])を引数として与える必要があります。

nil を与えてみたり、'' を与えてみたりしても一向にうまくいかなくハマりました。「each メソッドがない」とのエラーメッセージが出ますので、空の配列を与えればよいということが分かります。エラーメッセージ大事*5

記事を更新する

client を定義して、記事を更新してみます。以下のコードを書きます(ほぼドキュメントのままです)。

client.update_entry(
  '26006613500000003',
  'Updated Title!!!!!',
  'This is the **example** entry.',
  [], # categories
  'no' # draft?
)

記事を更新をするためには記事の id が必要です。前述の entries メソッドを用いるなど、取得方法はいくつかあると思います。なお、id の指定は 文字列 でも 数値 でもどちらでも問題ないです。

他にもいろいろできる

その他、はてな側で用意してくれている操作がこの gem を通じて行えます。公式ドキュメント に詳しく書いてありますので、探してみましょう。

(補足)画像や動画を記事に貼り付けるには

画像や動画を記事に貼り付けるためにはいくつかの方法があると思います。私は Gyazo の gem を使って、Gyazo にファイルをアップロードし、その際に戻り値で得られる URL を本文に埋め込んで画像を貼り付けるという方法を用いています。

*1:そのために「アプリケーション」の作成が必要です

*2:一部マスクをしています

*3:そのほうが「ID」っぽいと思って

*4:下書きを公開状態に変更するには、後述の update_entry メソッドを用います

*5:まあそれ以前にソースコードにちゃんと書いてありますが

Powered by はてなブログ