はてなブックマークの登録スクリプト
はてなブックマークAtomAPIを利用してブックマークを登録します。
- WSSE認証のコードはtowardの日記 - Ruby はてなブックマーク Atom API WSSE認証を使わせて頂きました。
- HTTPリクエストを投げるところはHTTPリクエストユーティリティを使っています。
require 'http-requestor' require 'digest/sha1' require 'time' module Hatena # WSSE認証用のヘッダを作成する。 # @param hatena_id はてなのユーザーID # @param password ユーザーのパスワード # @return WSSE認証用のヘッダ def self.hatena_wsse_header(hatena_id, password) # Nonce : HTTPリクエスト毎に生成したセキュリティ・トークン # ランダムなバイト列 http://sheepman.parfait.ne.jp/20050104.html nonce = Array.new(10){ rand(0x100000000) }.pack('I*') nonce_base64 = [nonce].pack("m").chomp # Base64エンコード # Created : Nonceが作成された日時をISO-8601表記で記述したもの now = Time.now.utc.iso8601 # PasswordDigest : Nonce, Created, パスワードを文字列連結しSHA1アルゴリズムでダイジェスト化して生成された文字列を、Base64エンコードした文字列 digest = [Digest::SHA1.digest(nonce + now + password)].pack("m").chomp return sprintf( %Q<UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s">, hatena_id, digest, nonce_base64, now) end # ブックマーク操作クラス class Bookmark # コンストラクタ # @param hatena_id はてなのユーザーID # @param password ユーザーのパスワード def initialize( user_id, password ) @user_id = user_id @password = password @requestor = HttpRequestor.new( File.dirname(__FILE__) + "/request.yaml" ) end # ブックマークを登録する # @param url URL # @param summary ブックマークのコメント # @param タグの配列 def post( url, summary, tags ) tag_str = "" tag_str = "[" << tags.join("][") << "]"if tags != nil && tags.length > 0 summary = summary != nil ? summary: "" post_data=<<-POST <entry xmlns="http://purl.org/atom/ns#"> <title>dummy</title> <link rel="related" type="text/html" href="#{url}" /> <summary type="text/plain">#{tag_str} #{summary}</summary> </entry> POST response = @requestor.post() {|request| request["body"] = post_data request["headers"]["X-WSSE"] = Hatena.hatena_wsse_header(@user_id, @password) } if ( response.code != "201" ) fail response["status"] != nil ? response["status"] : response.code.to_s end end end end
request.yaml
--- conf: #proxy_host: #proxy_port: default: host: "b.hatena.ne.jp" port: 80 method: "post" requests: post: path: "/atom/post"
使う
require "hatena/bookmark" hb = Hatena::Bookmark.new <ユーザーID>, <パスワード> hb.post( <URL>, <説明>, [<タグ1>, タグ2>] )