Twitter - Usando a API do Twitter 


Hoje vou falar um pouco sobre a API do Twitter e de como podemos usá-la em nossas aplicações. As informações foram obtidas em http://apiwiki.twitter.com/API-Overview.

Nota: Existem outras APIs que permitem efetuar a comunicação com o Twitter. Ex: TweetSharp para C#.(Que abordarei em outro artigo)

Antes de falar sobre a API creio que você sabe que o Twitter é um microblogging muito popular criado no ano de 2006 por Jack Dorsey para ser usado em dispositivos móveis.

A API do Twitter consiste de 3 partes:

Outro ponto importante a considerar quando utilizar a API, é que existe um limite para você efetuar chamadas, requisições, atualizações ou enviar mensagens diretas.  A utilização da API neste quesito é restritiva, e, para saber mais sobre este quesito leia o documento: API Twitter - limitações

A utilização da API é bem simples:

  1. O usuário é autenticado; (existem métodos que não necessitam autenticação)
  2. Uma requisição é enviada;
  3. O retorno é um arquivo XML (ou outro formato especificado) com os dados da requisição ou mensagem de erro;

Obs: Resumindo podemos dizer que a API é REST e devolve dados no formato XML, JSON, RSS e ATOM.

REST - Representantion State Transfer - Atualmente pode ser entendido como um conjunto de regras usadas para descrever uma interface web que utiliza HTTP e XML (JSON,ATOM). Os sistemas que seguem os princípios REST são conhecidos como RESTfull.
O padrão REST se baseia nas requisições HTTP: POST , PUT , GET e DELETE.

A documentação completa pode ser acessada no link: http://apiwiki.twitter.com/Twitter-API-Documentation mas de forma geral todas as requisições envidas a API do Twitter seguem o seguinte  formato:

http://[URL]/[Função].[Formato]?[Parâmetros]

onde :

Nota: Você pode obter diversos tutoriais, dicas e truques neste link : http://www.newwebplatform.com/tips-and-tutorials/Twitter

Como exemplo vejamos o método statuses public_timeline da API Rest do Twitter:

statuses/public_timeline - retorna os 20 mais recentes estados a partir de usuários não protegidos que definiram um ícone de usuário personalizado;

 

URL:  http://api.twitter.com/1/statuses/public_timeline.format

Formats:  xml, json, rss, atom 

HTTP Method(s): GET

Requires Authentication: false

API rate limitedtrue

 

O retorno será um arquivo no formato especificado.

 

Em outro exemplo, para enviar um novo post para o twitter usando a API podemos fazer assim:

 

http://twitter.com/statuses/update.xml?status=Macoratti esta usando a API do Twitter!

 

Abaixo temos a requisição no navegador FireFox e a solicitação de autenticação:

Para mais detalhes consulte a documentação.

Vejamos agora um exemplo prático de como usar a API do Twitter em uma aplicação da plataforma .NET usando a linguagem VB .NET.

Vamos pensar...

Quais os parâmetros que eu preciso passar para fazer uma requisição no Twitter ?

  • Método usado :  GET , POST, DELETE, PUT;
  • Credenciais do usuário : nome e senha;
  • URL: URL da API usada;

Vamos então usar a classe HttpWebRequest que fornece uma implementação HTTP da classe WebRequest para poder implementar um função que faça as requisições a API do Twitter em nossa aplicação.

A classe HttpWebRequest fornece suporte para as propriedades e métodos definidos no WebRequest e para outras propriedades e métodos que permitem que o usuário interaja diretamente com servidores usando HTTP.

É disso que precisamos e vamos usar...

- Vamos usar o método WebRequest.Create para inicializar os objetos HttpWebRequest, o retorno será um objeto HttpWebRequest;

- O método GetResponse realiza uma solicitação assíncrona para o recurso especificado na propriedade RequestUri e retorna um HttpWebResponse contendo a resposta da requisição;

- Para enviar dados podemos usar o método GetRequestStream que retorna um objeto Stream a ser usado para enviar os dados;

- Vamos usar também a propriedade method  para definir o método que iremos solicitar na requisição;

Podemos criar um método que utilize estes conceitos e obtenha o retorno na forma de um DataSet usando o seguinte código:

  Public Shared Function FazRequisicaoTwitter(ByVal metodo As String, ByVal usuario As String, ByVal senha As String, ByVal url As String) As DataSet
        Dim requisicao As HttpWebRequest
        Dim resposta As WebResponse
        Dim rd As StreamReader = Nothing
        Dim ds As New DataSet()
        Try
            'monta a requisicao
            requisicao = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
            requisicao.Method = metodo
            'verifica a autenticacao
            requisicao.Credentials = New NetworkCredential(usuario, senha)
            'obtem a resposta
            resposta = requisicao.GetResponse()
            rd = New StreamReader(resposta.GetResponseStream())
            'le o xml e gera o dataset
            ds.ReadXml(rd)
            rd.Close()
            'retorna o dataset
            Return ds
        Catch ex As Exception
            throw ex
            Return Nothing
        End Try
    End Function

Podemos usar esta classe para fazer a requisição que desejamos passando os parâmetros e tratando o retorno, no caso um DataSet da forma que desejarmos.

Podemos também criar outro método sobrecarregado onde os parâmetros usados são o método usado (GET,POST,PUT,DELETE) e a URL (função da API do Twitter) retornando um arquivo texto XML. Neste método as credenciais do usuário são obtidas a partir do arquivo de configuração:

  Private Shared Function FazRequisicaoTwitter(ByVal metodo As String, ByVal url As String) As String
        'obtem as credenciais do usuário no arquivo de configuração
        Dim usuario As String = ConfigurationManager.AppSettings("usuario")
        Dim senha As String = ConfigurationManager.AppSettings("senha")
        'monta a requisição
        Try
            Dim requisicao As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
            requisicao.Method = metodo
            'verifica a autenticação
            requisicao.Credentials = New NetworkCredential(usuario, senha)
            'obtem a resposta
            Dim resposta As WebResponse = requisicao.GetResponse()
            Dim rd As New StreamReader(resposta.GetResponseStream())
            Dim responseString As String = rd.ReadToEnd()
            rd.Close()
            'retorna o xml
            Return responseString
       Catch ex As Exception
            throw ex
            Return Nothing
        End Try
    End Function

Dessa forma temos dois métodos que podemos usar onde um retorna o DataSet e o outro um arquivo XML que deverá ser tratado.

Vejamos dois  exemplos de utilização da nossa rotina:

1-) Método : statuses/user_timeline - Usado para retornar os 20 post mais recentes postados pelo usuário autenticado:

URL : http://twitter.com/statuses/user_timeline.xml

Para montar a nossa requisição fazemos assim:

FazRequisicaoTwitter("GET", "seu login", "sua senha", "http://twitter.com/statuses/user_timeline.xml")

2-)  Método : statuses/friends_timeline -  Usado para retornar os 20 posts mais recentes efetuados pelo usuário autenticado e pelos seus seguidores. (Retweets não serão obtidos)

URL :  "http://twitter.com/statuses/friends_timeline.xml"

Para montar a nossa requisição fazemos assim:

FazRequisicaoTwitter("POST", "seu login", "sua senha", "http://twitter.com/statuses/friends_timeline.xml")

Muito simples, não é mesmo ???

Para ver a 'coisa' funcionando eu vou criar uma aplicação Windows Forms (poderia ser qualquer outro tipo de aplicação) usando o Visual Basic 2008 Express Edition;

Abra o VB 2008 Express Edition e crie um novo projeto do tipo Windows Forms Application com o nome apiTwitter;

A seguir no menu Project selecione Add Class e informe o nome Comunica.vb;

Agora inclua no código da classe  Comunica os métodos que já criamos:

Imports System.Net
Imports System.IO
Imports System.Configuration
Public Class Comunica
    Public Shared Function FazRequisicaoTwitter(ByVal metodo As String, ByVal usuario As String, ByVal senha As String, ByVal url As String) _ 
As DataSet
        Dim requisicao As HttpWebRequest
        Dim resposta As WebResponse
        Dim rd As StreamReader = Nothing
        Dim ds As New DataSet()
        Try
            'monta a requisicao
            requisicao = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
            requisicao.Method = metodo
            'verifica a autenticacao
            requisicao.Credentials = New NetworkCredential(usuario, senha)
            'obtem a resposta
            resposta = requisicao.GetResponse()
            rd = New StreamReader(resposta.GetResponseStream())
            'le o xml e gera o dataset
            ds.ReadXml(rd)
            rd.Close()
            'retorna o dataset
            Return ds
          Catch ex As Exception
            throw ex
            Return Nothing
        End Try
    End Function
    Private Shared Function FazRequisicaoTwitter(ByVal metodo As String, ByVal url As String) As String
        'obtem as credenciais do usuário no arquivo de configuração
        Dim usuario As String = ConfigurationManager.AppSettings("usuario")
        Dim senha As String = ConfigurationManager.AppSettings("senha")
        'monta a requisição
        Try
            Dim requisicao As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
            requisicao.Method = metodo
            requisicao.Credentials = New NetworkCredential(usuario, senha)
            'obtem a resposta
            Dim resposta As WebResponse = requisicao.GetResponse()
            Dim rd As New StreamReader(resposta.GetResponseStream())
            Dim responseString As String = rd.ReadToEnd()
            rd.Close()
            'retorna o xml
            Return responseString
        Catch ex As Exception
            throw ex
            Return Nothing
        End Try
    End Function
End Class

No formulário padrão form1.vb vamos incluir uma controle DataGridView , dois controles Buttons e um controle TextBox conforme o leiaute abaixo:

No evento Click do botão para enviar o post ao twitter inclua o seguinte código:

Private Sub btnPostar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPostar.Click
   Try
        Dim texto As String = txtMensagemTwitter.Text
        Dim url As String = String.Format("http://twitter.com/statuses/update.xml?status={0}", texto)
        Comunica.FazRequisicaoTwitter("POST", "seu login", "sua senha", url)
        MsgBox("Mensagem postada com sucesso")
    Catch ex As Exception
        MessageBox.Show("Ocorreu um erro durante a conexÆo como Twitter : " & ex.Message)
    End Try
End Sub

E no evento Click do botão para obter os posts recentes inclua o código a seguir:

Private Sub btnPostsRecentes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPostsRecentes.Click
Try
        Dim dstwitter As New DataSet
        dstwitter = Comunica.FazRequisicaoTwitter("GET", "seu login", "sua senha", "http://twitter.com/statuses/user_timeline.xml")
        DataGridView1.DataSource = dstwitter.Tables("status")
Catch ex As Exception
    MessageBox.Show("Ocorreu um erro durante a conexÆo como Twitter : " & ex.Message)
End Try
End Sub

Nota: É obvio que você deve usar as suas credencias para efetuar o logon.

Agora vamos executar o projeto, realizar um post e depois obter os posts mais recentes que serão exibidos no controle DataGridView,. Veja o resultado na figura abaixo:

Observe que a mensagem que eu postei aparece nos posts mais recentes, e, para não haver dúvidas consultando o meu twitter constatamos que a mensagem realmente foi postada:

Reconheço que a interface deixa a desejar mas meu objetivo foi mostrar como usar a API do Twitter usando o VB .NET, deixo a criação de um interface mais caprichada para o  tratamento dos resultados como um exercício.

Eu sei é apenas VB .NET e Twitter  mas eu gosto...

Referências:


José Carlos Macoratti