Skip to content

Instantly share code, notes, and snippets.

@tomohiro
Created October 26, 2009 13:11
Show Gist options
  • Select an option

  • Save tomohiro/218629 to your computer and use it in GitHub Desktop.

Select an option

Save tomohiro/218629 to your computer and use it in GitHub Desktop.
IRC チャンネルに JOIN して mixi ボイスの閲覧・投稿・返信・削除を行う Bot
#!/usr/bin/env ruby
$LOAD_PATH << 'lib'
$LOAD_PATH << '../lib'
require 'rubygems'
require 'net/irc'
require 'uri'
require 'mechanize'
require 'nokogiri'
class MixiVoiceBot < Net::IRC::Client
def initialize
@irc_host = 'your_irc_host'
@irc_port = '6667'
@channel = '#MixiVoice'
@nickname = 'MixiVoice'
super(@irc_host, @irc_port, {
:nick => @nickname,
:user => @nickname,
:real => @nickname,
:channel => @channel,
})
@agent = WWW::Mechanize.new
if ENV['http_proxy']
proxy = URI.parse(ENV['http_proxy'])
@agent.set_proxy(proxy.host, proxy.port)
end
@email = 'your_mixi_account@example.com'
@password = 'your_mixi_password'
end
def start
mixi_login
@socket = TCPSocket.open(@host, @port)
@socket.gets
post(PASS, (@opts.pass if @opts.pass))
post(NICK, @opts.nick)
post(USER, @opts.user, '0', '*', @opts.real)
post(JOIN, @opts.channel)
post_thread = Thread.new do
while line = @socket.gets
message = Message.parse(line)
name = "on_#{(COMMANDS[message.command.upcase] || message.command).downcase}"
send(name, message) if respond_to? name
end
end
get_thread = Thread.new do
recent_voice = nil
while true
voice = get_voice
unless recent_voice == voice
recent_voice = voice
post(NOTICE, @opts.channel, voice)
end
sleep 60
end
end
post_thread.join
get_thread.join
rescue IOError => e
@logger.error 'IOError' + e.to_s
ensure
finish
end
def on_privmsg(message)
post_voice message[1]
end
def mixi_login
@agent.get 'http://mixi.jp' do |login_page|
login_page.form_with(:name => 'login_form') do |form|
form.email = @email
form.password = @password
end.submit
end
end
def post_voice(voice)
@agent.get 'http://mixi.jp/recent_echo.pl' do |post_page|
post_page.form_with(:action => 'add_echo.pl') do |form|
form.body = voice
end.submit
end
end
def get_voice
recent_page = @agent.get 'http://mixi.jp/recent_echo.pl'
(Nokogiri::HTML(recent_page.body)/'td.comment').each do |comment|
nickname = comment.at('div.echo_nickname').text
reply = (comment.at('a').text if comment.at('a').text =~ />/) || nil
comment = comment.at('div.echo_body').text
return "#{nickname}: #{reply} #{comment}"
end
end
end
MixiVoiceBot.new.start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment