2009/06/13

第10回北海道開発オフ:@dabesaを改変

当初は単純なマルコフ連鎖、昨年からDBを使ったマルコフ連鎖で動いていた@dabesa。@dabesaの稼働場所を自宅サーバに移転したのを契機に、また単純マルコフ連鎖に戻した。TL.txtはfriend_timelineを別のスクリプトで取得している。3文字確認するだけの、本当に単純な仕組みなので、改善は今後検討する。


#! /usr/bin/ruby -Ku

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

require 'uri'
require 'net/http'

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

begin
lines = Array.new
post = Array.new
match = Array.new

l=0

open("TL.txt") do |file|
while line = file.gets
lines.push(line)
l = l+1
end
end

post = lines[rand(l)].split(//)

mess = post.first(2).to_s
word = post[1]

while word != nil do
post = Array.new
match = Array.new
list = Array.new
hash = Hash.new
l=0

lines.each do |line|
if /#{word}/ =~ line then
match.push(line)
l = l+1
end
end

i=0
post = match[rand(l)].split(//)
while i < post.length do
if /#{word}/ =~ post[i] then
hash = {"1"=>post[i+1],"2"=>post[i+2],"3"=>post[i+3]}
list.push(hash)
end
i=i+1
end

idx = rand(list.length)

if list[idx]["1"] != nil then
mess.concat(list[idx]["1"])
end
if list[idx]["2"] != nil then
mess.concat(list[idx]["2"])
end
if list[idx]["3"] != nil then
mess.concat(list[idx]["3"])
end
word = list[idx]["3"]

end

config = Pit.get("dabesa")
cl = Twitter::Client.new(config)
cl.status(:post,mess)

wmess = 'status=' + URI.escape(mess)
req = Net::HTTP::Post.new("/statuses/update.json?")
req.basic_auth(config["username"],config["password"])
Net::HTTP.start('api.wassr.jp',80) {|http|
response = http.request(req,wmess)
}

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