フォト蔵とワッサーの連携をさせてみたくなったので、あちこち見ながら~Rubyでチョコチョコ。
- Twitterのアカウントを取った(2) - ただのにっき(2007-07-10)
- Wassr に画像付き POST - A More Beautiful day
- 備忘録 [Ruby]net/httpでPOST
フォト蔵からtwitterには、画像が登録されたらPostしてくれるのだけど、URLだけというのはさみしい。ワッサーに対しては 何もしてくれない。ので、通知して、画像も送って、タグが付いていれば関連するチャンネルへ投稿先を切り替えるようにしてみた。
ライセンスをどうこう言うほどのものではないけど、なければないで利用しづらいので、BSDライセンスということで。
#!/usr/bin/ruby
#
# Net net-rc: Please install net-netrc from rubygems
require 'rubygems'
require 'open-uri'
require 'rexml/document'
require 'net/http'
require 'base64'
require 'net/netrc'
require 'pp'
Net::HTTP.version_1_2
$KCODE = 'UTF8'
HOST = 'api.wassr.jp'
AGENT = 'photozou2wassr.rb/ruby/#{RUBY_VERSION}'
CHANNEL = {"photo_tag" => "channel",
"ねこ" => "neko", "ロールケーキ" => "sweets"
#"ねこ" => "TEST", "ロールケーキ" => "TEST"
}
begin
netrc = Net::Netrc.locate(HOST)
LOGIN = netrc.login
PASSWORD = netrc.password
rescue
$stderr.puts "#$0: no entry in .netrc for #{HOST}."
exit( -1 )
end
def postWassr(msg, image, tag)
begin
img = open(image,"User-Agent" => AGENT) {|f|
f.read
}
rescue
return $false
end
/.*\/(.*)\.(.*)$/ =~ image
filename = $1
ext = $2
body = ""
body.concat("--boundary\r\n");
body.concat("Content-Disposition: form-data; name=\"source\";\r\n")
body.concat("\r\n")
body.concat(AGENT)
body.concat("\r\n")
body.concat("--boundary\r\n");
body.concat("Content-Disposition: form-data; name=\"image\"; filename=\"#{filename}\"\r\n")
body.concat("Content-Type: image/#{ext}\r\n")
body.concat("\r\n")
begin
open(image) {|f|
body.concat(f.read + "\r\n")
}
rescue
return $false
end
body.concat(img)
body.concat("\r\n")
body.concat("--boundary\r\n");
if CHANNEL[tag].nil?
begin
req = Net::HTTP::Post.new('/statues/update.json')
req.basic_auth(LOGIN,PASSWORD)
req["user-agent"] = AGENT
req["content-type"] = 'multipart/form-data; boundary=boundary'
body.concat("Content-Disposition: form-data; name=\"status\";\r\n")
body.concat("\r\n")
body.concat(msg)
body.concat("\r\n")
body.concat("--boundary--\r\n")
req.body = body
Net::HTTP.start(HOST, 80) {|http|
response = http.request(req)
}
end
else
begin
req = Net::HTTP::Post.new('/channel_message/update.json')
req.basic_auth(LOGIN,PASSWORD)
req["user-agent"] = AGENT
req["content-type"] = 'multipart/form-data; boundary=boundary'
body.concat("Content-Disposition: form-data; name=\"body\";\r\n")
body.concat("\r\n")
body.concat(msg)
body.concat("\r\n")
body.concat("--boundary\r\n")
body.concat("Content-Disposition: form-data; name=\"name_en\";\r\n")
body.concat("\r\n")
body.concat(CHANNEL[tag])
body.concat("\r\n")
body.concat("--boundary--\r\n")
req.body = body
Net::HTTP.start(HOST, 80) {|http|
response = http.request(req)
}
end
end
end #end of def
def readPhotozou
begin
src = open("http://photozou.jp/feed/photo_list/XXXXX/all.xml",
"User-Agent" => AGENT) {|f|
f.read
}
rescue
return $false
end
doc = REXML::Document::new(src).root
if doc.nil?
return $false
end
doc.elements.to_a('//item').reverse.each {|item|
if (item.nil? || item.elements['link'].nil? || item.elements['link'].text.nil?)
next
end
if (item.elements['pubDate'].nil? || item.elements['pubDate'].text.nil?)
next
end
if Time.now - Time.rfc2822(item.elements['pubDate'].text) > 3600.0 * 1
next
end
if /.*\/(.*)$/ =~ item.elements['link'].text
id = $1
begin
photo_src = open("http://api.photozou.jp/rest/photo_info?photo_id=#{id}") {|f|
f.read
}
rescue
return $false
end
photo = REXML::Document::new(photo_src).root
if photo.nil?
return $false
end
mes = photo.elements.to_a('//photo_title')[0].text
link = photo.elements.to_a('//url')[0].text
image_url = photo.elements.to_a('//thumbnail_image_url')[0].text
photo.elements.to_a('//tag').reverse.each {|info|
postWassr(mes+"\r\n"+link, photo.elements.to_a('//thumbnail_image_url')[0].text,info.text)
}
end
} # end of each
end # end of def
if !readPhotozou
puts "error"
end