2009/02/07

FM NORTH WAVEのプレイ曲をTwitterに投稿する@825fmを作った

僕の大好きな北海道のFM局「FM NORTH WAVE」のWebサイトでは、ラジオでプレイした曲が確認できる仕組みがあるので、最新のプレイ曲をTwitterに投稿するBotを作って見ました.

@825fm

2008/02/18 Update:当初は30分に1回Cronで回してたんだけど、投稿時に再生時間を別ファイルに保存して、3分に1回Cronで回して、前回投稿時より再生時間が新しい場合だけ投稿するように改造。投稿量が増えるだろうけど、大体再生した曲を全てTwitterに流せると思う。

2009/02/21 Update:North Waveでは29時に日を切り替えているので、29時までは前日のURLからデータを取得するように改造。

以下ソース。

#! /usr/bin/ruby

require 'time'
require 'rubygems'
gem 'twitter4r'
require 'twitter'
require 'pit'

require 'open-uri'
require 'kconv'

# Twitter4Rバグ回避
require 'cgi'
class Hash
def to_http_str
self.map{|key,value| "#{key}=#{CGI.escape(value.to_s)}"}.join("&")
end
end

begin
# 前回の最新投稿の楽曲再生時間を取得
btime = nil
tfile = open("825.txt",'r')
tfile.each do |time| btime = time.chomp end
tfile.close

# NorthWaveでは29:00で日時変更される
if DateTime.now.hour > 4 then
# 今日の日付を取得
nday = Date.today.to_s
else
# 昨日の日付を取得
tday = Date.today.to_s.split("-")
day = Date.new(tday[0].to_i,tday[1].to_i,tday[2].to_i)
day = day - 1
nday = day.to_s
end

# 曲再生リストURLを取得
open("http://www.fmnorth.co.jp/search/itiran.asp?YMD=nday") do |http|
response = http.read
nplay=""
ary = response.split("\n")
ary.each do |line|
if /.*<\/tr>/ =~ line then
mary = line.chomp.split("")
nplay=Kconv.kconv(mary.pop,Kconv::UTF8)
end
end
nplay.gsub!(/<\/font>/,",")
nplay.gsub!(/<[^>]*?>/,"")
nary = nplay.split(",")

ntime = nary[0].gsub(/:/,"")
# 前回投稿した曲再生時間より新しいデータがあったら
if ntime > btime then
# 投稿用メッセージを作成
mess = "[FM North Wave] " + nary[0] + " PLAYING!=> " + nary[2] + ":[" + nary[1] + "]"

# 投稿
config = Pit.get("825fm")
cl = Twitter::Client.new(config)
cl.status(:post,mess)

# 最新の曲再生時間をファイルに書き込む
tfile = open("825.txt",'w')
tfile.puts ntime
tfile.close
end
end

rescue
print "RuntimeError: ", $!, "\n";
end