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

用Java将Twitter状态更新发布到专用帐户的最简单方法,java,twitter,oauth,Java,Twitter,Oauth,我正在寻找一个非常简单的方式来发布状态更新到一个专用的Twitter帐户 目前,我们正在使用POST请求来验证https基本身份验证。但Twitter将禁用此API: 这个oauth的东西真的,真的很复杂,根本没有解释清楚 我试着使用路标,但在玩了几个小时后,我得到的只是一个401 OAuthConsumer consumer = new DefaultOAuthConsumer(consumerKey, consumerSecret, SignatureMethod.HMAC_SHA1); c

我正在寻找一个非常简单的方式来发布状态更新到一个专用的Twitter帐户

目前,我们正在使用POST请求来验证https基本身份验证。但Twitter将禁用此API:

这个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();

对于所有使用外部应用程序的专用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调用都应该是正确的。

对于所有使用外部应用的专用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使用signpost的(不要问),但是所有API调用都应该是正确的。

使用signpost比使用signpost幸运得多。核心jar只有300k,而且它与googleappengine和Android(实际上我就是在这里使用的)兼容。保养得很好,;它从一开始就支持xAuth。还有一些好处

以防你想看到我为之实现的应用程序的真实代码。

我的运气比路标好得多。核心jar只有300k,而且它与googleappengine和Android(实际上我就是在这里使用的)兼容。保养得很好,;它从一开始就支持xAuth。还有一些好处


以防您想看到我为其实现的应用程序的真实代码。

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

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

这与Java相关,但重点是Java。这与Java相关,但重点是Java。另外,还有一点需要注意的是,一旦您获得访问令牌/密码,您需要保存这些内容,并在下次发出请求时使用这些内容创建一个新的使用者(无需再次获得请求/授权访问令牌)。此外,还有一点需要注意的是,一旦获得访问令牌/密码,您需要保存这些内容,并在下次发出请求时使用这些内容创建一个新的使用者(无需再次获得请求/授权访问令牌)。