はてなのAPIをつかってみた / Rails4とWSSE認証
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。
これだ。この@の前の赤い部分。
無事APIキーでも動きました。
以上です。それではー。