将Twitter状态更新发布到Java专用帐户的最简单方法

时间:2010-08-01 19:06:44

标签: java twitter oauth

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

目前,我们正在使用https basic auth对https://api.twitter.com/1/statuses/update.xml发送POST请求。但Twitter将禁用此API:http://apiwiki.twitter.com/Authentication

这个真实的东西真的非常复杂,根本没有得到很好的解释。

我尝试使用路标,但在玩了几个小时之后,我得到的只是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();

3 个答案:

答案 0 :(得分:5)

我使用Twitter4J获得 更好的运气而不是使用Signpost。核心jar只有300k,它也是Google App Engine和Android(这实际上是我用过的地方)兼容的。它维护得很好;它几乎支持xAuth。还有一些好code examples on their website

如果您想要查看真实代码here's the source,我为此实现了此目的。

答案 1 :(得分:1)

似乎对使用外部应用程序的所有专用Twitter帐户“简化”oauth的需求很高。发布到一个帐户。

对于使用路标的完整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调用都应该是正确的。

答案 2 :(得分:1)

这是我的代码。我在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帐户,并且绕过了以编程方式访问密钥时需要的复杂程序步骤,这非常有用。