June 14, 2009 | In: Ruby

Acessando o Twitter via Interactive Ruby Shell (irb)

Estava procurando por uma solução simples em Ruby para fazer o update de mensagens via irb.
Achei as seguintes opções de classes Ruby:

  • Twitter -> John Nunemaker ( essa é a mais completa )
  • Twittery – uma classe bem simplista que faz upload de fotos pela TwitPic’s API. Esse projeto é administrado por Chris Ledet

Eu tomei como base para aprendizado, a classe do projeto Twittery, pois queria uma solução rápida e simples. Apesar dela não ter a segurança do protocolo de autenticação oAuth que já consta no projeto de John Nuremaker.

A idéia foi a seguinte: colocar o código Ruby para ser pré-carregado no arquivo .irbrc toda vez que o irb for acionado via shell.

Depois de vários teste o código final você pode ver abaixo:


# twitting by irb
require 'net/http'

class Object
  def twitter_config(username, password)
    @username = username
    @password = password
  end

# the message must be between 1 and 160 characters
  def twitter(status = nil, format = 'json')
     if status.empty? or status.length > 160
        puts "twitter 'message with spaces'             (IRB)"
        puts "Obs. (The message must been less than 160 characters and cannot be empty)"
     else
        api_url = 'http://twitter.com/statuses/update.' + format
        url = URI.parse(api_url)
        req = Net::HTTP::Post.new(url.path)
        req.basic_auth(@username, @password)
        req.set_form_data({ 'status'=> status }, ';')
        res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
        puts res
     end
 end
alias :twit :twitter
end

twitter_config('username', 'password')

Os dados de usário e senha já são pré-carregados na inicialização do irb. A vantagem é que esses dados ficam ocultos no arquivo .irbrc, dando um pouquinho de privacidade, caso tenha alguém do lado. ;)

Para “twittar” é só usar o seguinte comando, a qualquer momento, dentro do irb:


irb> twitter "mensagem via irb"

ou ainda

irb> twit "outra mensagem via irb"

Obs.: Esse exemplo usa a forma de autenticação mais simples, via HTTP. O twitter está em processo de mudança da autenticação para usar oAuth. A tendência é que a autenticação básica via HTTP deixe de ser usada, mas isso ainda vai demorar um pouco. Enquanto isso não acontece, vou continuar “twittando” por esse script via irb. ;)

Fico por aqui.

Até a próxima.

3 Responses to Acessando o Twitter via Interactive Ruby Shell (irb)

Avatar

Mauricio

July 3rd, 2009 at 12:01 am

Ao invés de colocar os métodos dentro da classe Object, é melhor definir eles fora da classe… pq dessa forma, vc permite coisas malucas tipo

“”.twit “Uma Mensagem”
1.twit “Outra mensagem”

Avatar

Valério Farias

July 3rd, 2009 at 11:36 am

Beleza Maurício, Valeu pela dica! Vou testar aqui.

Avatar

Valério Farias

July 3rd, 2009 at 1:08 pm

Mauricio. Eu fiz os testes aqui e detectei que tanto faz o meu jeito ou o seu.
O resultado é o mesmo. (se você tiver outro exemplo de código pode mandar :) )

Digite os seguintes comandos no irb:
# Object.class.superclass # => Module
# Object.class.superclass.superclass # => Object -> Topo da hierarquia

Já deu pra perceber que a hierarquia de classes no ruby segue o padrão:
Object -> Module -> Class

Isso indica que tudo herda a configuração da classe Object.

Se você digita self.class no irb aparece:

self.class
=> Object

Isso quer dizer que tanto faz eu digitar no irb somente os métodos:

def say
 "hello"
end

Ou incluir o método literalmente na classe object:


class Object
	def say
		"hello"
	end
end

Nos dois exemplos acima o método say estará incluído na classe Object e qualquer outra classe herdará esse método, já que tudo herda de Object.

O Problema do meu exemplo inicial é que o método twitter_config utiliza variáveis de instância e eu inicializo no arquivo .irbrc como uma instância da classe Object

twitter_config('username', 'password')

Para usar 1.twit como você sugere, no meu exemplo eu tenho que iniciar uma instância da classe inteiro:

1.twitter_config('username', 'password')

Mas tenho outra sugestão para deixar o código do jeito que você quer. É só mudar as variáveis de instância para variáveis de classe. Pois, apesar dos valores do usuário e senha serem armazenados inicialmente na classe Object, qualquer instância de qualquer classe poderá ter acesso a esses valores: string, integer, etc.

O código final utilizando variáveis de classe é o seguinte

def twitter_config(username, password)
     @@username = username
     @@password = password
end

No método twitter é só modificar a linha 19 para:

req.basic_auth(@@username, @@password) # só acrescentei outro arroba para usar variáveis de classe ao invés de instância.

Agora é só brincar!

Mauricio, pode enviar mais sugestões. Só aprendi tudo isso hoje graças ao seu exemplo. O propósito aqui é experimentar, trocar idéias e aprender cada vez mais em conjunto.

Um grande abraço.

Comment Form