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&ltmpl=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&ltmpl=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