sexta-feira, 18 de junho de 2010

Enviando Tweets via Lazarus + Synapse

Primeiro de tudo você vai precisar da biblioteca Synapse. O legal é que ela não é um componente pra se instalar, então não precisa reconstruir (rebuild) seu Lazarus.

Muitos sites e blogs oferecem uma cópia da biblioteca synapse hospedada no proprio site, sem indicar ou colocar o link para o site original do autor.

O site do outor do synapse é esse: http://www.ararat.cz/synapse/doku.php

Lá você pode baixar a biblioteca original e atualizada dando créditos ao seu autor.

De posse dela, você vai precisar criar um método POST, já que a classe de HTTP da biblioteca não fornece um, mas fornece os meios para que você faça isso. (ela tem get, mas não post, então você terá de fazer o post no dedo, mas é facil).

Coloque dois edits, dois memos e um botão em uma form.


function TForm1.HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try

     //para autenticação http simples, usuario
    HTTP.UserName := txtLogin.Text;

    //senha
    HTTP.Password := txtPassword.Text;

    //mando escrever os dados do tweet no documento
    //Pointer(URLData)^ é o conteúdo (pelo menos o primeiro caracter) para onde o ponteiro da string aponta (toda string no lazarus é um ponteiro, igual no Delphi)
    HTTP.Document.Write(Pointer(URLData)^, Length(URLData));
    //digo o mimetype
    HTTP.MimeType := 'application/x-www-form-urlencoded';
    //mando executar o método post com os dados que eu já setei
    Result := HTTP.HTTPMethod('POST', URL);
    //vou para o começo do documento (o documento é um stream)
    HTTP.Document.Seek(0,soFromBeginning);
    //copio para a stream de saida que veio no parametro desse médtodo (já deve estar criada)
    Data.CopyFrom(HTTP.Document, HTTP.Document.Size);
  finally
    //não esqueça: cuidado com os memory leaks
    HTTP.Free;
  end;

end;

procedure TForm1.btSendClick(Sender: TObject);
var

    host: string;
    st: TMemoryStream;

begin

     //url da atualização de status no twitter. Optei por xml porque xml é mais fácil no lazarus, mas também pode ser usado json.
     //tenho medo de json.... deve ser por causa da máscara e da motoserra. :P
    host := 'http://api.twitter.com/1/statuses/update.xml';

  try
     //cria a memory stream
    st:=TMemoryStream.Create;
    //no post, você tem que ter uma variavel=um valor. Na api do twitter, para atualização de status,
    //mtweet é o memo do status
    HTTPpostURL(host, 'status=' + mTweet.Text, st);
    //posiciono o stream de resultado (xml q o twitter me retorna) no inicio
    st.Seek(0,soFromBeginning);
    //mostro no outro memo
    Memo1.Lines.LoadFromStream(st);
  finally
    st.Free;
  end;

end;     

4 comentários:

  1. Excelente postagem Vitor, valeu :)

    Silvio Clécio

    ResponderExcluir
  2. Valew ^^

    Fiz um também de consulta de CEP com lazarus + synapse, dá uma olhada. Essa é a parte 3 http://vitorrubio.blogspot.com/2010/08/busca-de-cep-com-o-lazarus-parte-3-xml.html

    ResponderExcluir
  3. Muito bom! com base nessa dica consegui fazer um client bem simples para web services com kbmMW, valew!

    sucesso!

    JB

    ResponderExcluir
  4. Obrigado pelo feedback, JB, mas creio que o método que usei para postar no titter não funcione mais agora. Terei que escrever outro artigo usando o novo método de autenticação.

    ResponderExcluir

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)