LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-01-25

ブログを更新しました。元の記事はコチラ


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

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

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

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

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

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

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

SnsController

class SnsController < ApplicationController


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

        created = Time.now.iso8601

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

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

        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

class SnsController < ApplicationController


    def hatena(user, pass, uri, tags)

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

        # WSSE authentication
        header = {
            "X-WSSE" => get_wsse(user, pass),
            "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, pass)

        created = Time.now.iso8601

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

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

        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は、はてなのアカウント名(本当はAPIキー推奨らしい)とパスワード、ブックマークしたいURL、tagsはコメントなんだけど、個人的にタグの方が好きなので、tagsとしました。

以上です。それではー。

http://workabroad.jp/posts/2040

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0