はてなのAPIをつかってみた / Rails4とWSSE認証

Shunsuke Sawada

API使ってどうのこうのという分野に経験が浅いので、頑張ってみた。慣れるといろんなことできて楽しい。HTTPリクエストの投げ方とか、勉強になりました。今回ははてなブックマークでやってみました。

はてなで指定されたURIに、指定されたフォーマットでリクエストを投げる。
ていうと簡単だけど、指定されている状態をどうつくるのか悩んだ。。

認証にはOAuthとWSSEがあって、WSSEは非推奨でセキュリティもよろしくないという話だけど、シンプルなのでWSSE認証ででやりました。

基本はここに載っている。
はてなブックマークAtomAPI

WSSE認証についてはここにありますが、
下のようなものをヘッダにつけろということです。

1
X-WSSE: UsernameToken Username="hatena", PasswordDigest="ZCNaK2jrXr4+zsCaYK/YLUxImZU=", Nonce="Uh95NQlviNpJQR1MmML+zq6pFxE=", Created="2005-01-18T03:20:15Z"

これをつくる関数はprivateにしてあります。

SnsController

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class SnsController < ApplicationController


    private
    # WSSE認証をHTTPヘッダにつける準備です
    # Get WSSE authentication format
    def get_wsse(user, api_key)

        created = Time.now.iso8601

        nonce = ''
        20.times do 
            nonce << rand(256).chr
        end

        passdigest = Digest::SHA1.digest(nonce + created + api_key)

        return "UsernameToken Username=\"#{user}\", " +
        "PasswordDigest=\"#{Base64.encode64(passdigest).chomp}\", " + 
        "Nonce=\"#{Base64.encode64(nonce).chomp}\", " +
        "Created=\"#{created}\""
    end

end

  

で、リクエストを送るにはNet::HTTPクラスを使うということで。
startはすぐに通信開始してブロックの最後まで行ったら終わるとな。へぇー。
実際のPOSTリクエストはhttp.post(api, xml, header)でできました。

XMLははてなのフォーマットに合わせてあります。

SnsController

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class SnsController < ApplicationController


    def hatena(user, api_key, uri, tags)

        # Hatena API
        api = URI.parse('http://b.hatena.ne.jp/atom/post')

        # WSSE authentication
        header = {
            "X-WSSE" => get_wsse(user, api_key),
            "Accept" => "application/x.atom+xml, application/xml, text/xml, */*"
        }

        # Hatena XML Format
        xml = "<entry xmlns=\"http://purl.org/atom/ns#\"><title>dummy</title><link rel=\"related\" type=\"text/html\" href=\"#{uri}\" /><summary type=\"text/plain\">#{tags}</summary></entry>"

        # Post Hatena bookmark
        response = Net::HTTP.start(api.hostname, api.port) do |http|
            http.post(api, xml, header)
        end

        xml = Nokogiri::XML(response.body)

    end


    private
    # WSSE認証をHTTPヘッダにつける準備です
    # Get WSSE authentication format
    def get_wsse(user, api_key)

        created = Time.now.iso8601

        nonce = ''
        20.times do 
            nonce << rand(256).chr
        end

        passdigest = Digest::SHA1.digest(nonce + created + api_key)

        return "UsernameToken Username=\"#{user}\", " +
        "PasswordDigest=\"#{Base64.encode64(passdigest).chomp}\", " + 
        "Nonce=\"#{Base64.encode64(nonce).chomp}\", " +
        "Created=\"#{created}\""
    end

end

response.bodyにはXMLが入っているんだけど、Nokogiriでパースして、
xml = Nokogiri::XML(response.body) その後ごにょごにょするという流れ。

引数のuser, pass, uri, tagsは、はてなのアカウント名とパスワード or APIキー、ブックマークしたいURL、tagsはコメントなんだけど、個人的にタグの方が好きなので、tagsとしました。

追記

ご指摘いただきましてpassをapi_keyとしました。
はてなのパスワードでもいけますが、2014年3月5日以降は使えないようです。

はてなブログとかもやってないのでAPIキーがどこにあるかわからなかったんだけど、ここにあった。
http://b.hatena.ne.jp/your_hatena_id/config#tabmenu-config_table_function
your_hatena_idは自分のはてなID。
これだ。この@の前の赤い部分。

workabroad

無事APIキーでも動きました。

以上です。それではー。

121
Shunsuke Sawada

おすすめの記事

acts-as-taggable-on タグを表示させる順番を決めたい
Railsを4.2にバージョンアップしたら、Vagrantのローカル開発環境にアクセスできなくなった問題
Railsのバリデーションエラー後にレイアウトが崩れるとき