無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

はてなブックマークの登録スクリプト

はてなブックマークAtomAPIを利用してブックマークを登録します。

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>] )