Se você é brasileiro, provavelmente deve fazer parte do que foi chamado de “WTF Crazy Brazilian Invasion“, lá pelos idos de 2006/2007, ao site de relacionamentos Orkut. Quando assumimos a liderança no número de usuários do Orkut, logo um efeito colateral começou a se manifestar: o excesso de scams, spams e outras filhadaputices tão típicas de brasileiros e países do leste europeu.
Essa ploriferação do mal, fez com que o Google começasse a aprimorar a parte de segurança do site, tornando ele hoje um dos sub-sites do conglomerado mais difíceis de se acessar por vias “automatizadas”.
Mas que tipo de informação seria possível de obter do site?
Acessando o Orkut com Ruby
Uma das medidas adotadas pelo Google para evitar os bots que atazanavam a vida de todos, foi a adoção de chamadas via Ajax, muito mais difíceis de ser capturadas e entendidas. Passei um bom tempo tentando entender o fluxo de dados de login, através do firebug, mas sempre esbarrava em arquivos javascript como esse, obviamente ofuscados de propósito.
Antigamente, alguns já haviam conseguido quebrar o Orkut com Ruby e scraping, mas hoje os mesmos métodos não funcionam mais.
A solução encontrada para evitar as chamadas com Ajax foi acessar o “lado sem javascript” do site, no caso, a interface para dispositívos móveis do site.
De cara, me deparei com a tela de login comum nos serviços do Google – que inclusive já possui uma api para Ruby. Como o Orkut não faz parte dos serviços cobertos pela API oficial, tive que preencher o formulário de login usando o Mechanize.
require 'mechanize' require 'hpricot' agent = WWW::Mechanize.new page = @agent.get "https://www.google.com/accounts/ServiceLogin?service=orkut&hl=en-US&rm=false&continue=http%3A%2F%2Fm.orkut.com%2FRedirLogin%3Fmsg%3D0%26page%3Dhttp%253A%252F%252Fm.orkut.com%252FHome&cd=US&nui=5&btmpl=mobile<mpl=mobile&passive=true&skipvpage=true&sendvemail=false" form = page.forms.first form.Email = @email form.Passwd = @pass page = @agent.submit form
Não se assustem com a URL gigantesca. Ela é mostrada quando você tenta acessar algum serviço privado sem estar logado. Após o login, o site gerará uma URL intermediária de autenticação antes de redirecionar para a home do usuário propriamente dita. Esse fluxo é reproduzido da seguinte maneira:
#Call home page to get the temporary URL that google generates page = @agent.get "http://m.orkut.com/Home" #Try to access the temporary URL to pass the authentication token page = @agent.get page.meta[0].uri.to_s
Lendo os Scraps Recebidos Usando Ruby
Após os passos anteriores, conseguiremos acesso ao conteúdo da página. Depois, é só questão de mandar ver no scraping para obter as informações necessárias.
O código final é mostrado abaixo, e também pode ser acessado no gist. Sempre é bom lembrar que ele foi feito às pressas e está sujeito a erros e melhorias.
require 'mechanize'
require 'hpricot'
class Orkut
def initialize(email, pass)
@agent = WWW::Mechanize.new
@email = email
@pass = pass
end
def print_scraps
page = scrap_page
scraps = page.search "div[@class='mblock']/div"
scraps.each do |l|
parts = Hpricot(l).inner_html.split("\n")
puts "Name: #{parts[1]}"
puts "Date: #{parts[3]}"
puts "Message: "
parts[4..parts.size-2].each {|line| puts line}
puts "-" * 50
end
end
private
def scrap_page
log_in
#Call home page to get the temporary URL that google generates
page = @agent.get "http://m.orkut.com/Home"
#Try to access the temporary URL to pass the authentication token
page = @agent.get page.meta[0].uri.to_s
#Now, with authentication ready we can access the content
page = @agent.get "http://m.orkut.com/Scrapbook"
end
def log_in
page = @agent.get "https://www.google.com/accounts/ServiceLogin?service=orkut&hl=en-US&rm=false&continue=http%3A%2F%2Fm.orkut.com%2FRedirLogin%3Fmsg%3D0%26page%3Dhttp%253A%252F%252Fm.orkut.com%252FHome&cd=US&nui=5&btmpl=mobile<mpl=mobile&passive=true&skipvpage=true&sendvemail=false"
form = page.forms.first
form.Email = @email
form.Passwd = @pass
page = @agent.submit form
end
end
o = Orkut.new('your_email@gmail.com', 'your_pass')
o.print_scraps


Comentário(s) deste Post
Existem 6 comentários
Mar 12, 2009 - 5:35 am
Testei seu script, funcionou legal, e só faltou um require p/ o rubygems :)
Mar 12, 2009 - 6:27 am
Legal que funcionou, Felipe!
Na verdade o require para o rubygems deveria ser opcional mesmo :)
Apr 24, 2009 - 2:02 am
[...] Thiago Bueno também colocou em seu blog uma forma de acessar ao Orkut via Ruby. Inclusive, ele mostra como ler [...]
May 4, 2009 - 12:37 pm
Olá, muito legal
A uns dias atrás eu tentei conectar na receita para validar uma nota fiscal
não consegui conectar de forma alguma
era um caso atipico, o certificado estava do lado do cliente, enquanto no lado do servidor não possuia certificado, você passou por alguma experiência desse tipo??
Obrigado
May 4, 2009 - 4:53 pm
Oi Flávio.
Não sei se já passei por isso, mas nesse tipo de site é comum essas dificuldades, devido ao alto nível de segurança deles.
May 28, 2009 - 8:43 am
Legal seu script cara.
Tava pensando em fazer um script para exportar os recados para um XML e apos isso apagar para que se possa ter um controle privativo sobre os scraps.
Que achas ? Topas desenvolver comigo ?
Forte abraço ! Espero resposta !!