#!/usr/bin/env ruby # 以下のスクリプトを元に作成しています # SBM - コメントを取得 | Diaspar Journal # http://diaspar.jp/node/145 require 'net/http' require 'open-uri' require 'rubygems' require 'json/pure' require 'digest/md5' require 'rexml/document' require 'time' require 'cgi' Net::HTTP.version_1_2 site_url = 'http://bmky.net/' api_url = "http://www.enjoyxstudy.com/urls/get.cgi?url=" + CGI.escape( site_url ) Save_dir = "" post_reg = /^http:\/\/bmky\.net\/diary\/log\/(\d+)\.html/ def get_hatena_comments( url ) posts = [] host = 'b.hatena.ne.jp' path = '/entry/json/' + url body = Net::HTTP.start( host, 80 ).get( path ).body unless body =~ /^\(null\)/ json = JSON.parse( body.sub!( %r!^\((.*)\)$! ) { $1 } ) json['bookmarks'].each do |item| if item['comment'] != '' post = { :date => item['timestamp'][0..9].gsub( %r!/!, '-' ), :user => item['user'], :cmnt => item['comment'], :site => "hatena" } posts.push( post ) end end end return posts end def get_delicious_comments( url ) posts = [] host = 'feeds.delicious.com' path = '/rss/url/' + Digest::MD5.hexdigest( url ) body = Net::HTTP.start( host, 80 ).get( path ).body xml = REXML::Document.new( body ) xml.elements.each('rdf:RDF/item') do |item| if item.elements['description'].text post = { :date => item.elements['dc:date'].text[0..9], :user => item.elements['dc:creator'].text, :cmnt => item.elements['description'].text, :site => "del.icio.us" } posts.push( post ) end end return posts end def create_comments_html( posts, id ) return if posts.empty? comments = [] html = [] html << '
' posts.each { |item| if item[:site] == "hatena" icon = '' user = '' + item[:user] + '' else icon = '' user = '' + item[:user] + '' end html << '
' + icon + " " + user + "
" unless comments.include?( item[:cmnt] ) html << '
' + CGI.escapeHTML( item[:cmnt] ) + "
" comments << item[:cmnt] end } html << "
" File.open( Save_dir + id + ".html", "w" ) do |f| f.puts html.join( "\n" ) end end # コメントファイルを全て削除 # (Wordpressからファイルの有無で条件分岐させているため) #Dir.foreach( Save_dir ) do |file| # File.unlink( Save_dir + file ) if file =~ /\.html/ #end # Get Urls urls = open( api_url ) { |r| r.read.gsub( /\r/, "" ) } urls.gsub( post_reg ) do posts = [] url = $& id = $1 posts += get_hatena_comments( url ) posts += get_delicious_comments( url ) posts.sort! do |a,b| Time.parse( a[:date] ) <=> Time.parse( b[:date] ) end posts.reverse! create_comments_html( posts, id ) sleep 1 end