【问题标题】:Simplest way to post Twitter status update to a dedicated account in Java将 Twitter 状态更新发布到 Java 专用帐户的最简单方法
【发布时间】:2010-08-01 19:06:43
【问题描述】:

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

目前我们正在使用带有 https 基本身份验证的 POST 请求到 https://api.twitter.com/1/statuses/update.xml。但 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();

【问题讨论】:

标签: java twitter oauth


【解决方案1】:

我在Twitter4J 上的运气比在 Signpost 上的运气要好得多。核心jar只有300k,而且还兼容Google App Engine和Android(这其实是我用过的地方)。它维护得很好;它从第一天开始就支持 xAuth。还有一些不错的code examples on their website

以防万一您想查看真实代码,here's the source 用于我实现此代码的应用程序。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 另外,有点警告,一旦你得到你的访问令牌/秘密,你需要保存它们并在下次发出请求时使用它们创建一个新的消费者(没有收到请求/再次授权访问令牌)。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 2011-05-27
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多