Дата: 2010-11-23 19:27:22
Комментариев: 1
HowtoJabber bot (Ruby XMPP4R)
Просмотров: 4786
Простенький Jabber бот на Ruby, который будет висеть в он-лайне и принимать файлы.
Для начала установил сам Ruby:
sudo apt-get install ruby-full build-essential

Затем установим RubyGems:
sudo apt-get install rubygems1.8
sudo gem install rubygems-update

И саму библиотеку XMPP4R, которая отвечает за весь функционал нашего бота:
sudo apt-get install libxmpp4r-ruby1.8

Ниже приведен код нашего jabber бота:
$cat jabberbot.rb
#!/usr/bin/env ruby
 
require 'rubygems'
require 'xmpp4r'
require 'xmpp4r/bytestreams'
 
 
if ARGV.size != 3
  puts "Usage: #{$0} <jid> <password> <incoming-directory>"
  exit
end
 
 
#Jabber::debug = true
 
cl = Jabber::Client.new(Jabber::JID.new(ARGV[0]))
puts "Connecting Jabber client..."
cl.connect
puts "Authenticating..."
cl.auth ARGV[1]
 
ft = Jabber::FileTransfer::Helper.new(cl)
ft.add_incoming_callback { |iq,file|
  puts "Incoming file transfer from #{iq.from}: #{file.fname} (#{file.size / 1024} KB)"
 
  filename = "#{ARGV[2]}/#{file.fname.split(/\//).last}"
  offset = nil
  if File::exist?(filename)
    puts "#{filename} already exists"
    if File::size(filename) < file.size and file.range
      offset = File::size(filename)
      puts "Peer supports <range/>, will retrieve #{file.fname} starting at #{offset}"
    else
      puts "#{file.fname} is already fully retrieved, declining file-transfer"
      ft.decline(iq)
      next
    end
  end
 
  Thread.new {
    begin
      puts "Accepting #{file.fname}"
      stream = ft.accept(iq, offset)
      #if stream.kind_of?(Jabber::Helpers::SOCKS5Bytestreams)
      if stream.kind_of?(Jabber::Bytestreams::SOCKS5Bytestreams)
        stream.connect_timeout = 5
        stream.add_streamhost_callback { |streamhost,state,e|
          case state
            when :connecting
              puts "Connecting to #{streamhost.jid} (#{streamhost.host}:#{streamhost.port})"
            when :success
              puts "Successfully using #{streamhost.jid} (#{streamhost.host}:#{streamhost.port})"
            when :failure
              puts "Error using #{streamhost.jid} (#{streamhost.host}:#{streamhost.port}): #{e}"
          end
        }
      end
 
      puts "Waiting for stream configuration"
      if stream.accept
        puts "Stream established"
        outfile = File.new(filename, (offset ? 'a' : 'w'))
          outfile.write(stream.read)
          $stdout.flush
        puts "Файл: #{file.fname} закачан"
        outfile.close
        stream.close
      else
        puts "Stream failed"
      end
    rescue Exception => e
      puts "#{e.class}: #{e}\n#{e.backtrace.join("\n")}"
    end
  }
}
 
cl.send(Jabber::Presence.new(:chat, 'Send me files!'))
 
puts "Waiting."
 
Thread.stop
 
cl.close
 

Запускать как:
$ jabberbot.rb "jid" "пароль от jid" /папка/куда/принимать/файлы/

Файлы:
jabberbot.rb.tar.gz
jabberbot.rb
теги: ruby, xmpp4r

1 комментарий

2012-01-04 17:40:36 Юрий

а Вы не пробовали сделать так, что бы бот из-за проксика выглядывал?

Оставить комментарий: