2010-08-01 60 views
1

我正在寻找一种非常简单的方式将状态更新发布到专用的Twitter帐户。将Twitter状态更新发布到Java专用帐户的最简单方法

目前我们正在使用POST请求https://api.twitter.com/1/statuses/update.xml与https基本身份验证。但Twitter将禁用此API:http://apiwiki.twitter.com/Authentication

这oauth的东西真的很复杂,并没有很好地解释。

我试图用路标,但与几个小时玩耍后,我得到的是一个401

OAuthConsumer consumer = new DefaultOAuthConsumer(consumerKey, consumerSecret, SignatureMethod.HMAC_SHA1); 
consumer.setTokenWithSecret(accessToken, tokenSecret); 

URL url = new URL("https://api.twitter.com/1/statuses/update.xml"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

// Setup the header for the request 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("User-Agent", "Status Updater"); 

consumer.sign(connection); 

// write the message 
connection.setDoOutput(true); 
OutputStream os = connection.getOutputStream(); 
os.write(("status=" + message.substring(0, Math.min(message.length(), 139))).getBytes("UTF-8")); 
os.close(); 

// send the request 
connection.getInputStream().close(); 
+0

这与http://stackoverflow.com/questions/3382311/twitter-turning-off-basic-auth-is-oauth-overkill-for-some-tasks有关,但关注于Java。 – 2010-08-01 19:07:54

回答

1

好像有将成为“简化” OAuth认证的高需求全部使用外部应用程序的专用Twitter帐户。发布到单个帐户。

对于使用路标的完整oauth循环,您需要首次提出三个请求,之后您只需发出最后一次使用访问令牌的请求。

从测试应用程序拉一些东西。我写的,你的“快速和肮脏的” OAuth的代码应该是这个样子......

import java.io.BufferedReader 
import java.io.InputStreamReader 
import java.net.HttpURLConnection 
import java.net.URL 

import oauth.signpost.OAuth 
import oauth.signpost.OAuthConsumer 
import oauth.signpost.OAuthProvider 
import oauth.signpost.basic.DefaultOAuthConsumer 
import oauth.signpost.basic.DefaultOAuthProvider 

api_url = "http://twitter.com/statuses/user_timeline.xml" 
callback_url = "OOB" 
provider = new DefaultOAuthConsumer(key, secret); 
consumer = new DefaultOAuthProvider("http://twitter.com/oauth/request_token", 
         "http://twitter.com/oauth/access_token", 
         "http://twitter.com/oauth/authorize"); 

auth_url = provider.retrieveRequestToken(consumer, callback_url); 

# Visit the auth_url and authorize that token manually 

# oauth_verifier should be the digits returned by twitter for OOB authorization 

provider.retrieveAccessToken(consumer, oauth_verifier); 

access_token = consumer.getToken() 
access_secret = consumer.getTokenSecrect() 

# Finally, make your request... 

url = new URL(api_url) 

connection = url.openConnection() 

consumer.sign(connection) 
connection.connect() 

# In case you wanted to get the data/response. 
response = connection.getResponseMessage() 

reader = new BufferedReader(new InputStreamReader(connection.getInputStream())) 

line = '' 
results = '' 

while ((line = reader.readLine()) != NULL) { 
     results += line; 
    } 
reader.close() 

我左边的变量声明了,因为我用的是通过PHP路标(不要问),但所有的API电话应该是正确的。

+0

另外,有一点需要告诫,一旦你获得了你的访问令牌/密码,你需要保存这些密码,并在你下次发出请求时使用这些消息来创建新的使用者(不再需要请求/授权访问令牌)。 – Hylidan 2010-08-05 17:53:19

5

我有更好的运气与Twitter4J比与路标。核心jar只有30万,它也是Google App Engine和Android(这实际上是我用过的)兼容。它维护得很好;它几乎支持xAuth。还有一些不错的code examples on their website

以防万一你想看到真正的代码,here's the source为我实现这个应用程序。

1

这是我的代码。我在twitter上创建了一个应用程序(我只需要发布到我的Twitter帐户),并从“Twitter应用程序设置”和“我的twitter访问令牌”屏幕接收了消费者密钥,消费者密钥,Twitter访问令牌和Twitter访问令牌密钥。在应用程序设置中,将默认访问类型设置为读取和写入。

public void postToTwitter(String message) { 
     try { 
      ConfigurationBuilder confbuilder = new ConfigurationBuilder(); 
      confbuilder.setOAuthAccessToken(TWITTER_ACCESS_TOKEN_HERE) 
      .setOAuthAccessTokenSecret(TWITTER_ACCESS_TOKEN_SECRET_HERE) 
      .setOAuthConsumerKey(TWITTER_CONSUMER_KEY_HERE) 
      .setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET_HERE); 
      Twitter twitter = new TwitterFactory(confbuilder.build()).getInstance(); 

      Status status = twitter.updateStatus(message); 
      System.out.println("Successfully updated the status to [" + status.getText() + "]."); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

,如果你想发布到自己的Twitter帐户这个伟大的工程,并绕过如果你以编程方式访问键否则你需要复杂的程序步骤。