32nd Diary

トップ | 最新 | 過去の日記 | もっと過去の日記

2006年
2月
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
めーるあどれす
ruby -rbase64 -e'puts Base64.decode64 %q(dGFrYW5vMzJAZ21haWwuY29t)'



2006-02-13 (Monday) [長年日記]

[Ruby][WEB] はてなブックマークに自動で登録するスクリプト

日曜のちょっとした時間で書いてみた. この手のスクリプトの流儀がよくわからんので, 妙な部分がありそうだけど,公開してみる. ライセンスはGPLv2でよろすく.

ボクがMM/Memoをメインに使っている理由のひとつに データの二次加工がしやすそう,という点がある. 気が向いたら,このスクリプトと連携させて, MM/Memoからデータをバッチ的に吸い上げて はてなブックマークに登録していく,というものを書こうと思う. この手順ならはてなブックマークではない, 他の新しいソーシャルブックマークサービスが台頭しても それにデータを移すことが可能かな,と考えている.

参考: del.icio.usにブックマークすると、はてなブックマーク側でゴニョゴニョしてそれを自動的に取り込んでくれる機能とか無いかなぁ

以下,ソースコード

#! /usr/bin/env ruby
# Copyright (C) 2006, TAKANO Mitsuhiro <tak at no32.tk>
# You can redistribute it and/or modify it under GPL2.

require 'net/http'
require 'date'
require 'htree'
require 'nkf'

def encode(s)
	return NKF.nkf('-Ew', s)
end

def decode(s)
	return NKF.nkf('-Se', s)
end

module Hatena
end

class Hatena::Session
	REGEX_LOGIN_COOKIE = /rk=([^;]*);/
	def initialize(id, password)
		@id = id
		@password = password
		login
	end

	def login
		uri = URI.parse('http://www.hatena.ne.jp/login')
		Net::HTTP.start(uri.host) do |http|
			data = {
				'mode' => 'enter',
				'key' => @id,
				'password' => @password
			}
			data = data.map do |key, value|
				"#{key}=#{value}&"
			end
			res = http.post(uri.path, data.join)
			match = REGEX_LOGIN_COOKIE.match(res['set-cookie'])
			@session = match[1]
		end
	end

	def cookie
		return {'Cookie' => "rk=#{@session}"}
	end

	def logout
		#TODO: logout
		@session = nil
	end

	def login?
		return @session != nil
	end
end


class Hatena::Bookmark
	@@uri = URI.parse('http://b.hatena.ne.jp/add')
	def initialize(session)
		@session = session
	end

	def add(url, title, comment)
		res = nil
		Net::HTTP.start(@@uri.host) do |http|
			data = Hash.new
			data['url'] = url
			data['title'] = title
			data['mode'] = 'confirm'
			data['is_bm'] = '1'
			form = Hatena::Form.new(data)
			res = http.post(@@uri.path, form.query, @session.cookie)
		end
		forms = Hatena::Form.parse(res.body)
		unless forms[0] then
			raise RuntimeError.new('already bookmarked')
		end
		forms[0]['comment'] = encode(comment)
		add_commit(forms[0].query('commit'))
	end

	def add_commit(query)
		Net::HTTP.start(@@uri.host) do |http|
			res = http.post(@@uri.path, query, @session.cookie)
			unless res.class == Net::HTTPOK then
				raise RuntimeError.new("Can't commit add bookmark")
			end
		end
	end
end


class Hatena::Form
	def self.parse(src)
		doc = HTree.parse(src).to_rexml
		r = Array.new
		forms = doc.get_elements('//form')
		forms.each do |form|
			r << parse_form(form)
		end
		return r
	end

	def self.parse_form(src)
		data = Array.new
		form = Hatena::Form.new
		src.get_elements('//input').each do |input|
			form.add_input(input.attributes)
		end
		return form
	end

	def initialize(data = [])
		@data = []
		data.each do |name, value|
			self[name] = value
		end
	end

	def add_input(input)
		@data << input
	end

	def []=(name, value)
		@data.each do |input|
			if input['name'] == name then
				return input['value'] = value
			end
		end
		@data << {
			'name' => name,
			'value' => value
		}
	end

	def query(submit = nil)
		r = @data.map do |input|
			if input['type'] != 'submit' or input['name'] == submit then
				"#{input['name']}=#{input['value']}&"
			end
		end
		return r.join.gsub(/&$/, '')
	end
end

if $0 == __FILE__ then
	session = Hatena::Session.new('hatenaid', 'password')
	bookmark = Hatena::Bookmark.new(session)
	bookmark.add('http://hoge.example.com/', 'たいとるだお',
					 'これはコメントですお')
end

[Java] JDK 1.6 Mustang の GTKサポート

via OSNews.com

JDK 1.6(コードネームはMustang)がSwingで ネイティブにGTKをサポートすることになっていたのですが, そのスクリーンショットが公開されています.

自分でインストールして試したい猛者は Java SE 6: Mustang Snapshot Releasesから開発中のスナップショットをダウンロードできます.

ってか,今気づいたけど,2006年の秋にはMustangがリリースされるのね. ついこの間,Tigerがリリースされたばかりのような感覚があるのですが... ボクももうおじさんか?

本日のツッコミ(全3件) [ツッコミを入れる]
otsune (2006-02-15 (Wednesday) 07:53)

いろいろと検索したり、コメントで教えられたツールのソースを見ると<br>はてなダイアリー - はてなブックマークAtomAPIとは<br>http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AFAtomAPI<br>で解説されているAtomAPIを使っているものがいくつか有るみたいですね。

otsune (2006-02-15 (Wednesday) 07:58)

検索したらありました<br>Nowhere Near - はてなブックマークAtomAPI バインディング for Ruby<br>http://d.hatena.ne.jp/drawnboy/20050816/1124192505

32 (2006-02-15 (Wednesday) 13:07)

ガビーン,ガタガタ車輪を再発明していたとはー..<br>AtomAPIを使った方が(Web 2.0っぽくて)きれいに書けそうですねぇ.参考になりました.ありがとうございます.<br>でも,今回のFormクラスはよく書けた気がするので,また何か作ってみたいです...

本日のPingbacks(全0件)