2010-08-01 61 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帳戶這個偉大的工程,並繞過如果你以編程方式訪問鍵否則你需要複雜的程序步驟。