programing

2010年02月17日

twtrはrubyのgemを使ってインストール出来ます。

$ sudo apt-get install ruby rubygems ruby-dev
$ gem install twtr

これで、自分のホーム下の以下のディレクトリにインストールされます。

~/.gem/ruby/1.8/gems/twtr-0.1.4/

シェルのパスが通っていなければ、.bashrcに以下を追加して、再読み込みします。

export PATH=$PATH:~/.gem/ruby/1.8/bin

$ source ~/.bashrc

使い方は、上記twtrにあるとおりですが。 最初に、IDとPWと必要であればproxyを設定します。

$ twtr setting

以下のファイルに、設定が記録されます。

~/.twtr/twtr.yml

フォローしている人のタイムラインを表示します。

$ twtr ft | less

自分へのリプライを表示します。

$ twtr rp | less

tweetsを投稿します。

$ twtr up -m "ここにつぶやく"

シンプルでよくできています。
URLがあった場合そこをクリックすれば、ubuntuのterminal画面ならOSの機能でブラウザが開きます。

ただ、tweet毎の区切りがわかりにくいので、ぼくはtweet毎に空行を入れるようにしました。
以下のファイルを編集します。

$ vi ~/.gem/ruby/1.8/gems/twtr-0.1.4/lib/twtr/screen.rb

line 19(break文)と20(end文)の間に、put文を追加します。

          break if((count+=1) >= @display_count)
          puts ""    # <- additional statement
        end

これで、tweetの境がはっきりしました。

ftの機能だけなら、ぼくも前にrubyで自作したのですが・・・。 といっても、参照サイトのコードですが・・・。



sylphide_ffr31mr at 22:17コメント(0)トラックバック(0) 

2010年01月21日

twitterって、syslogdみたいなものだな、とふと思った。
いろいろ自動的にloggingするのに使えるので、最低限の投稿とタイムライン表示を、プログラムで使えるようにしたい。

そこで、twitterを、rubyスクリプトでいじってみよう!と思ったのだが、先人がいらっしゃったので、その知恵を借りることにした。
マイペースなプログラミング日記から、[Ruby]Twitter APIを使って投稿してみる の記事のスクリプトを利用させていただく。

usernameとpassword変数を、自分のものに書き換えて実行する。
このままだと、自分のタイムラインを20 tweet 表示する。
また、下ほうにある"# post tweet"の次の行の#を外すと、tweetの投稿になる。投稿内容を書き換えて実験してみてほしい。

twitter.rb
require 'net/http'
require 'rexml/document'
require 'uri'

username = 'aaaaa'
password = 'xxxxxxxx'

class User
    attr_reader :id
    attr_reader :name
    attr_reader :screen_name
    attr_reader :description
    attr_reader :url
    attr_reader :followers_count
    attr_reader :friends_count
    attr_reader :statuses_count
    attr_reader :location
    attr_reader :profile_image_url

    def initialize(element)
        @id = element.elements['id'].text()
        @name = element.elements['name'].text()
        @screen_name = element.elements['screen_name'].text()
        @description = element.elements['description'].text()
        @url = element.elements['url'].text()
        @followes_count = element.elements['followers_count'].text()
        @friends_count = element.elements['friends_count'].text()
        @statuses_count = element.elements['statuses_count'].text()
        @location = element.elements['location'].text()
        @profile_image_url = element.elements['profile_image_url'].text()
    end
end

class Status
    attr_reader :id
    attr_reader :text
    attr_reader :user

    def initialize(element)
        @id = element.elements['id'].text()
        @text = element.elements['text'].text()
        @user = User.new(element.elements['user'])
    end
end

class Twitter
    TwitterServer = 'twitter.com'

    def initialize(username, password)
        @username = username
        @password = password
    end

    def verify_credentials()
        request = Net::HTTP::Get.new('/account/verify_credentials.xml')
        request.basic_auth(@username, @password)
        http = Net::HTTP.start(TwitterServer)

        response = http.request(request)
        doc = REXML::Document.new(response.body)
        user = User.new(doc.elements['/user'])

        return user
    end

    def friends_timeline
        request = Net::HTTP::Get.new("/statuses/friends_timeline/#{@username}.xml")
        request.basic_auth(@username, @password)
        http = Net::HTTP.start(TwitterServer)
        response = http.request(request)
        doc = REXML::Document.new(response.body)

        statuses = Array.new

        doc.get_elements('/statuses/status').each{|element|
            status = Status.new(element)
            statuses << status
        }

        return statuses
    end

    def update(status)
        request = Net::HTTP::Post.new('/statuses/update.xml')
        submit = URI.escape(status)

        request.basic_auth(@username, @password)
        http = Net::HTTP.start(TwitterServer)
        response = http.request(request, "status=#{submit}&source=test")

        doc = REXML::Document.new(response.body)
        status = Status.new(doc.elements['/status'])

        return status
    end
end

twitter = Twitter.new(username, password)

# post tweet
# status = twitter.update('日本語もでます')

# display timeline
 status = twitter.friends_timeline
for item in status do
    printf("%s:%s\n%s\n\n", item.user.name, item.user.screen_name, item.text)
end


sylphide_ffr31mr at 00:11コメント(0)トラックバック(0) 

2009年12月01日

FirewallやNAT装置が途中経路にある場合、そこをどのポート番号が通過できるかを知りたいことがある。
TCPやICMPは、比較的簡単にテストできるが、UDPは簡単な試験ツールがない。探せばきっとあるのだろうが、探し方が悪いのか、意外とみつからない。
なければ作ろうということで、rubyで作った。

受信用プログラム udprecv.rb
#!/usr/bin/ruby

require "socket"

usocket = UDPSocket.open()
usocket.bind("0.0.0.0", ARGV[0].to_i)
recvstr,inet_addr=usocket.recvfrom(100)
p inet_addr
printf("%s\n", recvstr)
usocket.close()

送信用プログラム udpsend.rb
#!/usr/bin/ruby

require "socket"

usocket = UDPSocket.open()
printf("host:%s port:%s\n",ARGV[0],ARGV[1])
address = Socket.pack_sockaddr_in(ARGV[1].to_i,ARGV[0].to_s)
usocket.send("Connect", 0, address)
usocket.close()

使い方

(1)受信用プログラムを受信側サイトで起動。
引数に、UDPの待ち受けポート番号を指定する。
(2)送信用プログラムを起動。
引数に、宛先IPアドレスと宛先ポート番号を順に指定する。

注意点
●受信用プログラムで、well known port(1023番以下)を指定する場合は、root権限が必要です。
●受信プログラムは、パケットをひとつ受けとると終了します。
●テストで送信されるパケットは一つだけです。パケット紛失率の高いネットワークでは使い物になりません。(何度も送信してやってください)





sylphide_ffr31mr at 17:45コメント(0)トラックバック(0) 

2009年10月07日

googleのAPIを使って、rubyでweb検索をするプログラムを作ってみた。
rubyの勉強を兼ねているので、けして美しいコードではないが、(自分にとっての)わかりやすさを心がけている。
基本的な考え方は、以下のGoogle AJAX Search APIのデベロッパーガイド「Flash やその他 JavaScript を使用しない環境」にしたがっている。
AJAX Search APIを使う際は、AJAX API KEYをここから取得して、http headerに埋め込まないといけない。
javascriptからの呼び出しでも、埋め込むことが推奨されているが、
省略してもいいようだ。今回は埋め込んでいない。

AJAX APIにHTTPで検索queryを出すと、JSON形式で検索結果のテキストデータが返されてくる。
そこで、JSON形式のデータを簡単に扱えるように、JSON parse libraryとしてsimple-json.rbを使わせてもらった。

googlesearch.rb
require 'simple-json.rb'
require 'kconv'
require 'open-uri'

# 検索URLの作成
search_word = ARGV[0].to_s
for i in 1..ARGV.length-1 do
search_word = search_word + "%20" + ARGV[i]
end
targetUrl="http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q="+search_word

# 検索結果の取得
response=open(targetUrl)
src=response.read
src = NKF.nkf('-wxm0', src)

# 検索結果の解析
result = JsonParser.new
j=result.parse(src)

# タイトルとURLの表示
loop=j["responseData"]["results"].length
printf("Top %d results\n",loop)
printf("-----\n")
for i in 0..loop-1 do
printf("Title: %s\n",j["responseData"]["results"][i]["titleNoFormatting"] )
printf("URL: %s\n",j["responseData"]["results"][i]["url"] )
printf("- - - -\n")
end

# 検索結果件数の表示
printf("estimatedResultCount:%s\n", j["responseData"]["cursor"]["estimatedResultCount"])

使い方は、このプログラムを起動するときに、引数に検索したい文字列を指定する。(複数可)
引数のbase64 encodeなどの考慮をしていないので、2 byteコードは検索ワードに指定できない。

% ruby googlesearch.rb keyword1 keyword2

JSONをparseした際、ハッシュと配列が組み合わさった形でruby objectに収納されるので、ハッシュにハッシュが入っているものにどうやってアクセスするのか、記述方法がわからずに苦労してしまった。
[ ]でくくった添字をつなげていけばいいのだった。
わかってみれば、なんてことない。
出力結果は、以下のとおり。検索ワードにCanonとEOSを指定している。

% ruby googles.rb canon eos
Top 4 results
-----
Title: Canon EOS SLR
URL: http://www.canoneos.com/
- - - -
Title: EOS (SLR) Camera Systems - EOS Digit
al SLR Cameras - EOS 35mm SLR ...
URL: http://www.usa.canon.com/consumer/controller%3Fact%3DModelInfoAct%26fcategoryid%3D139%26modelid%3D10464
- - - -
Title: EOS DIGITAL
URL: http://www.canon.com/eos-d/
- - - -
Title: Canon EOS Beginners' FAQ
URL: http://photonotes.org/articles/beginner-faq/
- - - -
estimatedResultCount:64900000

最後に出るestimatedResultCountは、おおよその検索結果件数であるはずなのだが、webで普通に検索したときの数とは大きな開きがある。
クラスリファレンスの「google.search.Search-プロパティ」に、この値の説明があるが、まぁ、そういうものらしい。
上記と同じ検索ワードcanon eosで、googleのホームページから検索すると、68,300,000件とでる。この程度の差なら問題ないが、webの値に比べてAPIの値が1割ほどの時もあった。
この違いは、なんなんでしょうねぇ。


sylphide_ffr31mr at 20:25コメント(0)トラックバック(0) 

2009年09月02日

これまで準備をすすめてきた、楽天ブログからlivedoorブログへの引っ越しが完了したので、まとめとして、以下に手順を記しておく。

これらは、ubuntu上での作業となる。
詳しい動作環境については、こちら

1.楽天ブログのバックアップ
(1)backup_raku.rbのスクリプトを、作業マシンにコピペする。

(2)ここの説明をみて、backup_raku.rbに最初のURLや画像保存用ディレクトリなどについて設定する。このとき、画像リンクを修正するにしたほうが後が楽。

(3)backup_raku.rbの実行
% ruby ./backup_raku.rb > mtfile

(4)mtfileに、ブログ本文、コメント、トラックバック等のテキスト情報が保存される。 また、(2)で指定した画像ディレクトリに、全ての画像ファイルが楽天ブログにおけるファイル名で保存される。

(5)改行コードをCRLFからLFに修正。やりかたはこちら

2.画像をlivedoorブログへアップロード
(1)atomupload.rbのスクリプトを、作業マシンへコピペする。

(2)ここの説明をみて、atomupload.rbを設定する。画像ディレクトリは、1-(2)で設定したものを入れる。

(3)atomupload.rbを実行。
% ruby atomupload.rb > imglinks

(4)imglinksに、画像のファイル名とlivedoorでの画像URLの対応表ができあがる。

3.ブログ本文の画像リンクの修正 (★公開用スクリプトが未完成なので、後日アップします)
(1)rewritelink.rbのスクリプトを、作業マシンにコピペする。

(2)ここの説明をみて、rewritelink.rbを設定する。

(3)rewritelink.rbの実行。
% ruby ./rewriteklink.rb > mtfile.livedoor

(4)漢字コードをUTF-8からEUCに変更。
% nkf -e mtfile.livedoor > mtfile.euc

4.MTファイルのインポート
livedoorブログの「ブログ設定」のページの下部に、引越しという機能があるので、そこをクリックすると、mtファイルのインポートができる。
最終的にできあがったmtfile.eucを指定して、読み込みが終わったら完了。

5.補足
画像ファイルのuploadは、けっこう時間がかかります。
また、原因不明ですが正常にアップロードできない画像がありました。
テキストencodeした文字列で、何か誤認識するケースがあるのかもしれません。
それらのファイルは、画像管理画面でみると、正常にサムネイルが作成されていないので、どれが失敗したかわかります。
手動でアップロードし直して、リンクを書き換えてください。
(ぼくのブログでは、失敗画像が放置されていますが・・・)


sylphide_ffr31mr at 23:08コメント(0)トラックバック(0) 

rubyのハッシュ配列を使って、全表示しようと思ったら、どうもおかしい。

 hash=Hash.new
 hash["a"]="A"
 hash["b"]="B"
 hash.each do |i|
     printf("%s:%s\n",i,hash[i])
 end

awkっぽくeachで配列要素を取り出せると思ったら。


 $ ruby hash.rb
 aA:
 bB:

と、こうなる。 正しくは、each_keyメソッドを使うのだ。

 hash=Hash.new
 hash["a"]="A"
 hash["b"]="B"
 hash.each_key do |i|
     printf("%s:%s\n",i,hash[i])
 end

$ ruby hash.rb
 a:A
 b:B


sylphide_ffr31mr at 00:35コメント(0)トラックバック(0) 

2009年08月27日


#!/bin/ruby
#
# Image File Uploader for Livedoor blog
# 2008-08-27 Yasuki
#
require 'net/http'
require 'time'
require 'digest/sha1'
require 'uri'
require 'kconv'

#
# 初期設定
username="aaaaaaaaaa"
password="xxxxxxxxxx"
blogId="9999999"

targetDirectory="images"
fileSerfix="jpeg"

#------------------------------------
endPoint="http://cms.blog.livedoor.com/atom/blog_id="+blogId+"/svc=upload"
ep=URI.parse(endPoint)

# WSSE認証ヘッダの作成
nonce = ''
while nonce.size < 20
nonce << rand(256)
end
created = Time.new.utc.iso8601.to_s
digest = [Digest::SHA1.digest(nonce+created+password)].pack('m').gsub("\n",'')

wsse = [
%!UsernameToken Username="#{username}", !,
%!PasswordDigest="#{digest}", !,
%!Nonce=#{[nonce].pack('m').gsub("\n",'')}, !,
%!Created="#{created}"!].join('')

# 投稿する画像ファイルの数だけループ
Dir::glob(targetDirectory+"/*."+fileSerfix).each do |filename|
f = open(filename,"rb")
# 画像ファイルをBase64エンコード
base64_text = [f.read].pack('m')
f.close

# HTTPコネクションを作成
Net::HTTP.start(ep.host, ep.port) do |http|

#リクエストインスタンス生成
request = Net::HTTP::Post.new(ep.path)

#HTTPヘッダー作成
request["X-WSSE"] = wsse

#HTTPボディの作成
xmlBody=""
xmlBody.concat("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
xmlBody.concat("<entry xmlns=\"http://purl.org/atom/ns#\">")
xmlBody.concat("<title xmlns=\"http://purl.org/atom/ns#\">")
xmlBody.concat(filename)
xmlBody.concat("</title>")
xmlBody.concat("<content xmlns=\"http://purl.org/atom/ns#\" mode=\"base64\" type=\"image/jpeg\">")
xmlBody.concat(base64_text)
xmlBody.concat("</content></entry>")
request.body=xmlBody

# 送信
response = ''
response = http.request(request)

# レスポンスの表示
printf("Response:%s\n",Kconv.kconv(response.body,Kconv::UTF8))
end
end




sylphide_ffr31mr at 20:54コメント(0)トラックバック(0) 
Livedoorブログに、Atomを使って、指定ディレクトリ内の全画像ファイルを投稿するrubyでのアップローダーを作りました。
ソースはこちらです。

初期設定の項に、以下の項目を指定してください。
  • Livedoor ID
  • パスワード
  • Blog ID
  • アップロードする画像があるディレクトリ
  • 拡張子(jpegもしくはjpg)

画像タイトルが元のファイル名になります。
レスポンスは標準出力にそのまま出ますので、それを加工することで、元ファイルとアップロード後のURLを関連付けることができます。

WSSE認証のヘッダ作成は、以下のサイトのソースを使わせていただきました。
WebOS Goodies

また、Net::HTTPの使い方は、以下のサイトがとても参考になりました。
 備忘録

ありがとうございます。


sylphide_ffr31mr at 20:49コメント(0)トラックバック(0) 

2009年08月26日

backup_raku.rbの実行結果として、MT形式のブログエントリが生成されます。
その出力例を以下に示します。
行末に^Mがついているのが、なんともカッコワルイですが、直し方わかんないんです・・・。

--------
TITLE: 『どちらかが彼女を殺した』 東野 圭吾/講談社文庫
STATUS: Publish
CONVERT BREAKS: 0
ALLOW COMMENTS: 1
ALLOW PINGS: 1
AUTHOR: yasuki
PRIMARY CATEGORY: 本
CATEGORY: 本
DATE: 06/06/2005 00:00:00
-----
BODY:
主人公「和泉康正」の妹「園子」が殺された。容疑者は二人。妹の親友の「弓場佳世子」
と恋人の「佃潤一」である。
^M
康正は、復讐のため警察の「加賀刑事」と競うように捜査を進めるが、どうしてもふたり
の容疑者から犯人の特定ができない。
^M

^M
さて、この小説は最後まで読んでも犯人が作者によって読者にしめされないという、めず
らしいミステリだ。
^M
読み終わった後、自分では回答を持っていたのだが、ふと世の中のHPを調べてみた。解説
のページがいっぱいある。
^M
そして、自分の考えが誤っていたことに、読後1年以上もたって、気づかされたのである

^M

^M
幸い(?)なことに、この続編ともいえる『私が彼を殺した』を読んでいない。
^M
こんどこそ、とチャレンジしてみることにする。
^M
『どちらか〜』よりも容疑者が1人増えて、むずかしいらしが、大丈夫か!?
^M

^M
『どちらかが彼女を殺した』 東野 圭吾
-----
EXTENDED BODY:

-----
EXCERPT:

-----
KEYWORDS:

-----
COMMENT:
AUTHOR: ぎゅーぎゅーちゃんさん
EMAIL:
IP:
URL:
DATE: 06/07/2005 00:00:00
SECRET: 0
PASS:
BODY:
これ読んだ!
私はさっぱりどっちかわかりませんでした。そしてどっちなんだろう?と悶々としていま
す。。。半年ぶりに最近読んでみて、やっぱりわかんない・・・。教えてください。。。
(June 7, 2005 00:32:37)

-----
PING:
TITLE: 『どちらかが彼女を殺した』ふたたび
URL:
IP:
BLOG NAME: どらちゃんのしっぽ
DATE: 06/11/2005 00:00:00
BODY:
こういうパズルがあります。--------------------------------------------------------------------セールスマ
ンが、ある家をたずねました。玄関でその家の奥さんに、お子さんの人数を聞きました。
「娘が三人います」そこで、セールスマンは、娘達の年齢を聞きだそうとします。「娘さ
んの年齢は、...(June 11, 2005 23:28:34)
--------



sylphide_ffr31mr at 22:43コメント(0)トラックバック(0) 
#!/usr/bin/ruby
######################################
#
# Backup of Rakuten Blog
#
# 2009/08/19 Yasuki
#
######################################

# targetUrlは、本プログラムが最初に取得するブログエントリ
# です。このURLを起点として、「次へ>>」というリンクをたどり、
# 最後までブログエントリを自動で取得します。
targetUrl="http://plaza.rakuten.co.jp/ffr31mr/diary/200506060000/"

# blogの作者名を入れてください。
blogAuthor="yasuki"

# 画像を保存するローカル側のディレクトリ名を入れてください
imageDir="images"

# 画像へのリンクをローカルに保存したファイルに変更するかしない
# かを選択します。
# 0-->変更しない
# 1-->変更する
imageLinkUpdate=0

# ダウンロードするファイルが重複していたときの動作をきめます。
# 0-->ファイル重複があったら上書き
# 1-->ファイル重複があったら停止
imageFileDuplicateCheck=0

###################################################
# 以下は、変更しないでください。
###################################################
require 'kconv'
require 'hpricot'
require 'open-uri'
require 'date'

# 本文、コメント、トラックバックに共通にもっている
# 項目をクラス定義
class BlogItem
def initialize()
@date=nil
@body=nil
end
def setDate( str_date )
@date=Date.strptime(str_date, "%B %d, %Y")
end
def setBody( body )
# body=body.gsub("---","===")
@body=body
end
def getDate
printf("DATE: %s\n",@date.strftime("%m/%d/%Y %H:%M:%S"))
end
def getBody
printf("BODY:\n%s\n",@body)
end
end

# トラックバックのクラス定義
class Trackback < BlogItem
def initialize()
@pingtitle=nil
@pingurl=nil
@pingblogname=nil
end

def setPingTitle( str_title )
@pingtitle=str_title
end
def setPingUrl( str_url )
@pingurl=str_url
end
def setPingBlogName( str_name )
@pingblogname=str_name
end
def getPingTitle()
printf("TITLE: %s\n",@pingtitle)
end
def getPingUrl()
printf("URL: %s\n",@pingurl)
end
def getPingBlogName()
printf("BLOG NAME: %s\n",@pingblogname)
end
def getAll()
printf("-----\n")
printf("PING:\n")
getPingTitle()
getPingUrl()
printf("IP:\n")
getPingBlogName()
getDate()
getBody()
end
end

# コメントのクラス定義
class Comment < BlogItem
def initialize()
@commauthor=nil
end
def setCommAuthor( str_author )
@commauthor=str_author
end
def getCommAuthor
printf("AUTHOR: %s\n",@commauthor)
end
def getAll()
printf("-----\n")
printf("COMMENT:\n")

getCommAuthor()
printf("EMAIL:\n")
printf("IP:\n")
printf("URL:\n")
getDate()
printf("SECRET: 0\n")
printf("PASS:\n")
getBody()
end
end

# ブログエントリのクラス定義
class Entry < BlogItem
def initialize()
@title=nil
@author=nil
@category=nil
end
def setTitle( str_title )
@title=str_title
end
def getTitle
printf("TITLE: %s\n",@title)
end
def setAuthor( str_author )
@author=str_author
end
def getAuthor
printf("AUTHOR: %s\n",@author)
end
def setCategory( str_category )
@category=str_category
end
def getCategory
printf("PRIMARY CATEGORY: %s\n",@category)
printf("CATEGORY: %s\n",@category)
end
def getAll()
printf("--------\n")
getTitle()
printf("STATUS: Publish\n")
printf("CONVERT BREAKS: 0\n")
printf("ALLOW COMMENTS: 1\n")
printf("ALLOW PINGS: 1\n")
getAuthor()
getCategory()
getDate()
printf("-----\n")
getBody()
printf("-----\n")
printf("EXTENDED BODY:\n")
printf("\n")
printf("-----\n")
printf("EXCERPT:\n")
printf("\n")
printf("-----\n")
printf("KEYWORDS:\n")
printf("\n")
end
end

# Arrayクラスに複数要素取得のメソッドを追加定義
class Array
def every(&block)
arity = block.arity
return self.each(&block) if arity <= 0

i = 0
while i < self.size
yield(*self[i, arity])
i += arity
end
self
end
end

# hpricotの検索で、大文字小文字を区別しない
# by http://d.hatena.ne.jp/tech-kazuhisa/20090618/1245337521
class Hpricot::Elem
def attributes
if raw_attributes
raw_attributes.inject({}) do |hsh, (k, v)|
hsh[k.downcase] = Hpricot.uxs(v) #hashのkeyを小文字に変換
hsh
end
end
end
end

# targetUrlを要素に分割
targetArray=targetUrl.split("/")
targetHost=targetArray[2]
targetId=targetArray[3]
targetEntry=targetArray[4]+"/"+targetArray[5]

# imagesを保存するディレクトリの有無確認
if !FileTest.exist?(imageDir) then
Dir::mkdir(imageDir)
end

# エントリの取得ループ開始
e=Entry.new
loop {
nextUrl=nil
doc = Hpricot( open(targetUrl).read ) # Get Blog Entry
#
# Get Next Link
#
(doc/:a).each do |link|
if ( "#{link.inner_html}".index(">>") ) then
nextUrl="http://" + targetHost + "#{link[:href]}"
targetUrl=nextUrl
end
end
#
# Author is constant
#
e.setAuthor(blogAuthor)
#
# Get Title
#
(doc/:meta).each do |meta|
if ("#{meta[:content]}" != "text/html; charset=EUC-JP" ) then
e.setTitle(Kconv.kconv("#{meta[:content]}",Kconv::UTF8))
end
end
#
# Get Date of Blog Entry
#
blogdate=doc.search("b").first
blogdate=blogdate.to_s[3..((blogdate.to_s).length-5)]
e.setDate(blogdate)
#
# Get Categoly
#
cate=doc.search("div.cate_list").inner_html
cate=Kconv.kconv(cate,Kconv::UTF8)
cate=cate[2..cate.index("]").to_i-2]
e.setCategory(cate)
#
# Get Blog Body
#
body=doc.search("div.lo")[0].inner_html
body=Kconv.kconv(body,Kconv::UTF8)
end_body=body.index("<div align=\"right\">").to_i
body = body[2..end_body-1]
#
# Get Image Files
#
body=Hpricot(body)
imagefile=""
filename=""
body.search("img").each do |im|
imagefile=im.attributes["src"]
if imagefile.index("image.space.rakuten.co.jp") then
ifn=imagefile.split("/")
filename=imageDir + "/" + ifn[ifn.length-1].to_s
if (filename[filename.length-4..filename.length]=="jpeg" or filename[filename.length-3..filename.length]=="jpg") then
open(imagefile) do |jp|
#
# image fileの上書きを禁止する
if imageFileDuplicateCheck==1 then
if FileTest.exist?(filename) then
printf("image file exist.(%s)\n",im)
exit
end
end
File.open(filename, "wb") do |fp|
fp.write(jp.read)
end
end
#
# 画像リンクをダウンロードしたローカルファイルに指定しなおす
if imageLinkUpdate==1 then
b=body.to_html
b[b.index(imagefile),imagefile.length]=filename
body=Hpricot(b)
end
end
end
end
#
# 最終的な本文をオブジェクトに保存
#
e.setBody(body.to_html)
#
# Get Comments
#
ci=0
commArray=Array.new
cbody=doc.search("/html/body").inner_html.to_s
cbody=Kconv.kconv(cbody,Kconv::UTF8)

while (cbody.include?("<!-- bbs -->")) do
c=Comment.new
startComment=cbody.index("<!-- bbs -->")
endComment=cbody.index("<!-- /bbs -->")
comm=Hpricot(cbody[startComment..endComment+13])

commTitle=comm.search("/table/tr/td")[0].inner_text.strip
commAuthor=comm.search("/table/tr/td")[1].inner_text.strip
c.setCommAuthor(commAuthor)

comm.search("div.lo").each do |commBody|
commBody=commBody.inner_html
end_body=commBody.index("<div align=\"right\">").to_i
commBody=commBody[0..end_body-1].strip

dateStart=commBody.rindex("(")
dateEnd=commBody.rindex(")<br />")
commDate=commBody[dateStart+1..dateEnd-1]

c.setDate(commDate)
c.setBody(commTitle+"\n"+commBody)
end
commArray[ci]=c

cbody=cbody[endComment+14..cbody.length]
ci += 1
end
#
# Get Trackback
#
pingArray=Array.new
pbody=doc.search("/html/body").inner_html.to_s
pbody=Kconv.kconv(pbody,Kconv::UTF8)

pi1=0
if (pbody.include?("<a name=\"trackback\">")) then
startTrackback=pbody.index("<a name=\"trackback\">")
endTrackback=pbody.rindex("<!-- \/Center Column -->")

ping=Hpricot(pbody[startTrackback..endTrackback-13])

ping.search("/table/tr/td").every do |pingTitle,pingBlogName|
p=Trackback.new
pT=Hpricot(pingTitle.to_s)
pBN=Hpricot(pingBlogName.to_s)
p.setPingTitle(pT.search("a").inner_text)
p.setPingBlogName(pBN.search("a").inner_text)
p.setPingUrl(pT.search("a.href"))
pingArray[pi1]=p
pi1 += 1
end

pi2=0
ping.search("div.lo").each do |pingBody|
pingBody=pingBody.inner_html
pingArray[pi2].setBody(pingBody)

dateStart=pingBody.rindex("(")
dateEnd=pingBody.rindex(")")
pingDate=pingBody[dateStart+1..dateEnd-1]
pingArray[pi2].setDate(pingDate)

pi2 += 1
end


pbody=pbody[endTrackback+14..pbody.length]
end

# Output Blog Entry of MT Format
e.getAll()

#
# If the entry have comments?
# then output comments
if ( ci>0 ) then
commArray.each do |i|
i.getAll()
end
end

#
# If the entry have trackback?
# then output trackbacks
if ( pi1>0 ) then
pingArray.each do |i|
i.getAll()
end
end

#
# Is a final entry?
if (nextUrl==nil) then
break
end
}


sylphide_ffr31mr at 22:39コメント(5)トラックバック(0) 
記事検索
最新コメント
プロフィール

やすき

月別アーカイブ
  • ライブドアブログ