Aplicativo conectando com Twitter

Tudo bom pessoal,
Estou tentando criar uma aplicação java basica utilizando Oauth para conectar ao Twitter, para que eu possa atraves dessa aplicação autenticar uma pessoa e ela possa enviar Twitts(nao sei se é assim q fala) através da minha aplicação.

Consegui fazer isso para atualizar minha propria timeline

ConfigurationBuilder cb = new ConfigurationBuilder();
        cb.setDebugEnabled(true).         
                setOAuthConsumerKey("x").
                setOAuthConsumerSecret("x").
                setOAuthAccessToken("x").
                setOAuthAccessTokenSecret("x");
         
        TwitterFactory tf = new TwitterFactory(cb.build());
        Twitter twitter = tf.getInstance();
        
        twitter.updateStatus("Testando aplicativos em Java no meu PC");  

Os ‘x’ são os valores que eu peguei através da aplicação que eu criei no twitter.
Porém com isso consigo atualizar apenas a minha propria timeline, como faço para que meu aplicativo seja capaz de atualizar timeline de outras pessoas.
ps: provavelmente a pessoa que irá usar meu app deva ter q fornecer alguma permissão, mas não sei como posso fazer isso?

Como assim? Timeline dos seus amigos ???
Se for, tem um exemplo no site do twitter4J (nao sei se eh este que vc esta usando):

    // The factory instance is re-useable and thread safe.
    Twitter twitter = new TwitterFactory().getInstance();
    List<Status> statuses = twitter.getFriendsTimeline();
    System.out.println("Showing friends timeline.");
    for (Status status : statuses) {
        System.out.println(status.getUser().getName() + ":" + status.getText());
    }

[quote=windsofhell] // The factory instance is re-useable and thread safe.
Twitter twitter = new TwitterFactory().getInstance();
List statuses = twitter.getFriendsTimeline();
System.out.println(“Showing friends timeline.”);
for (Status status : statuses) {
System.out.println(status.getUser().getName() + “:” + status.getText());
}
[/quote]
Eu estou usando o Twitter4J tbm, e inclusive tenho esse exemplo q vc passou, porém ele exibe a minha timeline(acho q é isso), ou seja quando entro no meu Twitter, mostra os últimos tweets de todas as pessoas q eu estou seguindo, mas não é isso que eu quero.
Eu quero que a pessoa acesse o meu sistema e atarvés dele post um tweet, como se ela estivesse postando de dentro do seu próprio twitter.
Espero que eu conseguido explicar direito desta vez.

[quote=fabiobh][quote=windsofhell] // The factory instance is re-useable and thread safe.
Twitter twitter = new TwitterFactory().getInstance();
List statuses = twitter.getFriendsTimeline();
System.out.println(“Showing friends timeline.”);
for (Status status : statuses) {
System.out.println(status.getUser().getName() + “:” + status.getText());
}
[/quote]
Eu estou usando o Twitter4J tbm, e inclusive tenho esse exemplo q vc passou, porém ele exibe a minha timeline(acho q é isso), ou seja quando entro no meu Twitter, mostra os últimos tweets de todas as pessoas q eu estou seguindo, mas não é isso que eu quero.
Eu quero que a pessoa acesse o meu sistema e atarvés dele post um tweet, como se ela estivesse postando de dentro do seu próprio twitter.
Espero que eu conseguido explicar direito desta vez.[/quote]

Ai eu acho que vc vai ter que criar um sistema de autenticacao pro usuario registrar a conta dele no twitter, ai ele tem que autorizar a sua aplicacao no twitter.
Seria o mesmo mecanismo quando vc vai em sites e faz um comentario usando sua conta no twitter ou facebook. Vc eh direcionado pro twitter e tem uma mensagem perguntando se vc quer ou nao autorizar acesso.

Fazendo isso eu acho que vc consegue criar tipo um “cliente” twitter que os seus usuarios possam postar no twitter.

//Daniel

Era exatamente isso que eu gostaria de fazer, o problema é justamente como faze-lo, e eu não faço idéia de como começar!

Aqui tem um implementacao legal
http://consultingblogs.emc.com/nileeshabojjawar/archive/2010/03/18/twitter4j-oauth-generating-the-access-token.aspx

Tem um exemplo de implementacao aqui https://github.com/yusuke/sign-in-with-twitter

Mas basicamente a ideia eh: Vc vai ter que fazer autenticacao OAuth, as unicas coisas que vc precisa sao “consumer’s key” e “secret key” e pegar RequestToken. Depois vc vai ter que obter um AccessToken que vai ser retornado para a sua aplicacao depois que o usuario logar com a conta do twitter e authorizar a sua aplicacao.

Da uma olhada tb na documentacao http://twitter4j.org/en/code-examples.html

Na parte “OAuth support”

//Daniel

Vlw, já tenho um caminho por onde começar, apesar de não parecer simples, vou pesquisar e testar os exemplos, obrigado

Nao eh tao complicado, eu fiz uma implementacao mas usando javascript (dojo).

Na verdade as partes mais importantes desse exemplo que eu te passei sao:

Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer("ZDuEJCn23jw3NuFcElaqw", "OkhinXH6EaymMUzlfbq0xWrablNBkUwfz7eLDPxmwk");
RequestToken requestToken = twitter.getOAuthRequestToken();

// a URL retornada aqui, eh a URL que vc tera que redirecionar o seu usuario para fazer a authenticacao.
string url = requestToken.getAuthorizationURL()

Quando vc registra a aplicacao no twitter vc colocar registra a callback_url que vai ser chamada apos a autenticacao.

No metodo callback, vc pode obter agora o AccessToken, onde “pin” eh o pincode que vai ser retornado para vc apos a autenticacao:

AccessToken  accessToken = twitter.getOAuthAccessToken(requestToken, pin);

Apos isso vc vai ter o access token e access token secret, que vc pode guarda num banco de dados por exemplo:

System.out.println("token : " + accessToken.getToken());
System.out.println("tokenSecret : " + accessToken.getTokenSecret());

Ai eh soh, para logar e comecar a usar a autorizacao eh soh fazer:

private Twitter twitter;  
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);
// esses sao os tokens (access token e access secret token) que vc obter guardar num banco de dados e buscar
// todas vez que o usuario logar, ai vc precisa fazer toda a parte de autorizacao apenas uma vez
AccessToken accessToken = new AccessToken(twitterToken, twitterTokenSecret);
twitter.setOAuthAccessToken(accessToken);

E para postar um update:

Status status = twitter.updateStatus("Au au au, twitter eh legal");

Tentei explicar passo-a-passo de como implementar e adicionei uns comentarios. Talvez ajude.

//Daniel

Nossa, vc realmente deu uma aula mesmo,
mas so teve uma coisa que não entendi

[quote=windsofhell]
// a URL retornada aqui, eh a URL que vc tera que redirecionar o seu usuario para fazer a authenticacao.
string url = requestToken.getAuthorizationURL()

Quando vc registra a aplicacao no twitter vc colocar registra a callback_url que vai ser chamada apos a autenticacao.

No metodo callback, vc pode obter agora o AccessToken, onde “pin” eh o pincode que vai ser retornado para vc apos a autenticacao:
[/quote]Essa url é uma pagina que eu vou registrar no Twitter, e eu tenho de criá-la dentro da meu servidor pessoal? tenho que colocar algum parametro nela?

Não entendi como vou conseguir recuperar o PIN diretamente da url de autorização

Um dos metodos de autenticacao eh chamado OOB (out-of-band), que ao inves de redirecionar o usuario para a callback url, vai mostrar na pagina o pincode. Nesse tipo de autenticacao o usuario vai ter que colocar o pincode no seu sistema.

Esse tipo de autenticacao eh o que esse exemplo faz:
http://consultingblogs.emc.com/nileeshabojjawar/ar...nerating-the-access-token.aspx

Se vc reparar, ele imprime no terminal a URL que vc tem que ir pra obter o pincode (soh copiar e colar no seu browser) e entra num loop loop ate o usuario entrar o pincode.

Outro metodo, direciona o usuario para uma pagina no twitter que vai perdir pra logar e dar autorizacao para o seu sistema, apos isso vai redirecionar para a URL callback que vc definiu na sua App no twitter.

Se eu nao me engano, o pincode vai ser enviado na QUERY_STRING (oauth_verifier)

//Daniel

Consegui fazer a autenticação via OOB, mas achei ela pouco prática para o usúario final.
Agora gostaria de saber como fazer usando a callback url.

Tentando usar o exemplo do Yusuke do github obtive o seguinte erro:

java.lang.IllegalStateException: OAuth consumer key/secret combination not supplied

Eu forneci a consumer key e a secret no twitter4j.properties e não entendi o pq do erro

Ola,

Dificil dizer, pode ser que o seu aplicativo nao esta conseguindo ler o arquivo twitter4j.properties.

Sugiro vc debugar e colocar breakpoints na parte que vc seta OAuthConsumer, e roda getOAuthRequesToken e getOAuthAccessToken, veja se os parametros esta sendo passados corretamente.

Se vc olhar a stacktrace, onde que essa exception ocorre?? Olhando a mensagen eu apostaria que as keys nao estao sendo passadas corretamente pra algum metodo.

//Daniel

Aconselho usar “CURL”, fácil e funcional.

Esse CURL que vc ta falando são algumas bibliotecas que instalam no windows ou a função curl do PHP?

No console do Tomcat não aparece nenhum erro, ja no log praticamente o mesmo erro que aparece na tela

GRAVE: Servlet.service() for servlet signin threw exception java.lang.IllegalStateException: OAuth consumer key/secret combination not supplied at twitter4j.TwitterBaseImpl.getOAuth(TwitterBaseImpl.java:374) at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:276) at twitter4j.examples.signin.SigninServlet.doGet(SigninServlet.java:51) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:662) O problema é que eu não entendi muito bem a pagina index.html do projeto

[code]

Sign in with Twitter example

Welcome ${twitter.screenName} (${twitter.id})

<form action="./post" method="post">
    <textarea cols="80" rows="2" name="text"></textarea>
    <input type="submit" name="post" value="update"/>
</form>
<a href="./logout">logout</a>

</tag:loggedin>

[/code]Ele utiliza a taglib [code]tag:notloggedin[/code]e não entendi muito bem o que ela faz, além disso não sei que callbackURL preciso cadastrar na minha aplicação do twitter

O do PHP, mas ele possui suporte a diversas linguagens.

Eu nao tenho tanta certeza, mas asp.net tem algo parecido. Eu acho que sao tipo dois templates da mesma pagina, um quando o usuario nao esta logado e outro quando o usuario esta logado.
Se vc notar tag:notloggedin adiciona o link para fazer o login no twitter.

E tag:loggedin mostra template quando o usuario ja esta conectado, por exemplo, nessa linha ele ja usa dados do twitter object.

<h1>Welcome ${twitter.screenName} (${twitter.id})</h1>  

Quanto ao seu erro, essa duas linhas sao importantes:

at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:276)  
at twitter4j.examples.signin.SigninServlet.doGet(SigninServlet.java:51)  

Da uma olhada se vc esta passando as keys corretamente. No methodo doGet.

//Daniel

Vc tem algum exemplo do curl para o PHP para atualizar o status do Twitter?

Soh tem um problema em usar o CURL, vc vai ter que armazenar dados da conta do twitter do usuario no seu sistema.
Pelo menos eu nao gostaria de sair por cai cadastrando as informacoes da minha conta num site, soh pra eu poder comentar usando twitter account.

Usando autenticacao OAuth vc nao tem esse problema.

//Daniel

[quote=windsofhell]Soh tem um problema em usar o CURL, vc vai ter que armazenar dados da conta do twitter do usuario no seu sistema.
Pelo menos eu nao gostaria de sair por cai cadastrando as informacoes da minha conta num site, soh pra eu poder comentar usando twitter account. [/quote]
Realmente, pensando por este lado acho q vc tem razão, nossa já to ficando doido…

O problema é que usando o OAuth, eu não consigo redirecionar a pessoa pra callbackURL

Achei este tutorial pra usar PHP com OAuth
http://blog.mannnq.com/2011/04/twitter/criando-um-aplicativo-para-twitter-com-oauth-e-php-1/
Vou tentar a partir dele e ver se consigo