Quando redes sociais não são só Facebook e Twitter

Posted on January 2, 2012

0


Alguns projetos demandam ferramentas já conhecidas e que usamos repetidas vezes em diversos projetos, já outros nos desafiam com novas ideias e solucoes.

Vou relatar um caso desses, em que criar algo novo foi necessário. Pra começar imagine uma aplicação web qualquer dessas que se utilizam de facebook/twitter connect. Você se loga com sua conta de um desses serviços pra adiantar bons passos de cadastro, evitar criar mais um senha, etc, caso do Agendatech por exemplo.

Agora imagine um ação digital que ocorreu principalmente no Orkut e fez com que alguns milhões de usuários interagissem com a marca. Você tem a opção de uma nova campanha inciando toda viralização novamente ou continuar com rodos esses usuários já ativados.

O problema aqui é que claramente o Orkut não oferece recursos de desenvolvimento tão avançados, e é sobre essa experiencia que quero descrever nesse post. Antes, queria lembrar a todos que, em tempos modernos que todos querem fazer aplicativos pra facebook/twitter, bons programadores querem resolver problemas de software.

Ei Orkut, me autoriza.
Eu nunca tinha visto nenhuma aplicação web que tenha um Orkut conect até então. E esse é o primeiro problema.
Muito desenvolvimento já foi feito prao Orkut na forma de aplicativos, aqueles que rodam dentro dá própria rede social,mas não me recordo e não encontrei nenhum que utilizasse na forma off-site.

Muitos dos links do Google nesse sentido estão quebrados ou desatualizados, encontrar alguma coisa em Ruby então, muito difícil.

Qualquer biblioteca de connect hoje utiliza OAuth. O processo todo costuma se encapsulado em alguma biblioteca pra facilitar as coisas.
Existe uma lib do Orkut chamada Orkut OS Client, escrita em Java. Após testar essa lib, da pra ver que ela consegue fazer o connect e acessar dados de perfil do Orkut, além de scraps e outras coisas.

Atravessando a ponte
Uma primeira solução aqui poderia ser um serviço intermediário. Esse serviço precisaria ser acessado pela app Rails, faria o connect utilizando a lib java e devolveria o resultado da requisição. Nada impossível de se fazerm utilizando Sinatra e JRuby, acessados via REST. Essa solução tem pontos positivos, como utilizar a própria lib do Google pra fazer as coisas, mas subir um serviço a mais gera mais possíveis pontos de falha, como tratamento mensagens entre os servers, falha no serviço, etc.

Portando
Se a lib Java faz, então da pra fazer em Ruby. A primeira idéia que vem na cabeça aqui normalmente é: “Abre lá a lib Java, ve as URL’s que ela chama e faz todos os parsers você mesmo em Ruby”.

Seria órimo se fosse assim. A lib Java utiliza uma forma bem peculiar pra prover as informações. Não temos aqui um webservices preparadinho pra atender e responder nossas necessidades.
O Orkut oferece as informações via RPC-JSON. Esse não é de longe o formato de comunicação mais da moda, mas é o que tem.
Basicamente esse formato espera apenas posts, mesmo que pra solicitar informações. Esses posts deve ser feitos pra um RPC Endpoint com uma mensagem formatada, adivinhe em que, JSON. Claro que essa mensagem deve seguir as convenções e parametros que o serviço entenda.
O retorno é outro JSON com a resposta da requisição.

Mas eu to na moda
Minha primeira opção pra resolver esse problema de connect e authorização pelo orkut em um sistema Rails, foi utilizar o Omniauth.
O Omniauth é uma gem bem reconhecida pra isso no meio Ruby e permite que você crie sua própria estratégia caso um provider nnao esteja pronto.
Fiz isso e criei a estratégia para o Orkut.
Um belo passo frente ao problema, agora era capaz de pedir ao orkut a conexão, autorizar o usuário, e receber um token de acesso.
Precisamos de um token pois qualquer solicitação ao serviço vai precisar dessa validação.

Aparentemente uma primeira etapa concluída, agora só falta consumir os dados como perfil e scraps. Porém aqui tudo vai por água abaixo.
O Orkut não aceita utilizar um token gerado por outras formas pra pedir os dados no serviço RPC-JSON. Ele responde com falha na autenticação e bloqueia tudo. Voltamos a estaca zero.

Faça-se a luz
Voltar pra solução do serviço intermediário utilizando a própria lib java do Orkut é uma opção. Mas pelos problemas citados acima vale mais um estudo. Conhecendo um pouco mais do processo interno da lib Java, e entendendo como é feito todo processo de requissição e autenticação, resolvi portar a lib pra uma versão Ruby. Essa alternativa tem o problema de ser um pouco mais trabalhosa e precisar de conhecimento de Ruby e Java,
e refazer processos como o de autenticação por captcha com oauth autorizado, entre outras partes,
porém elimina os problemas de ter um serviço a mais só pra executar essa tareefa. Tendo uma lib Ruby pra fazer tanto o connect quanto oas requisições pra serviços temos tudo na mesma linguagem e ambiente, faciltando muito as coisas.

A bliblioteca em questão foi chamada de orkut_os_client, tem um demo online e o código está no Github.
Tenho muitas dúvidas de como melhorá-la ou como testa, ou seja, se você estiver a fim de dar uma olhada, não exite em conversar comigo.

Essa biblioteca já passou por diversas requisições, e o código é utilizado em um sistema com um número pesado de acessos por minuto, ou seja, vem cumprindo bem sua função

Conclusão
O Phillip Calçado fez um post muito legal sobre a importância do conhecimento de tecnologias antigas, sua evolução, etc.
Se você é um programador, o problema a ser resolvido deveria ser aquilo que te motiva. Conhecimento de tecnologias antigas ajuda muito na criação de tecnologias novas.

Posted in: java, ruby