使用twitter4j从Twitter客户端发布推文时收到错误

时间:2012-03-11 20:09:54

标签: java twitter

当我尝试从我的Twitter客户端更新状态时收到错误消息。 当我使用getHomeTimeLine()方法读取状态时,它工作正常。 我真的不知道错误在哪里。 请帮忙!

Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(consumerKey, consumerSecret);
        RequestToken requestToken = twitter.getOAuthRequestToken();
        AccessToken accessToken = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (null == accessToken) {
          System.out.println("Open the following URL and grant access to your account:");
          System.out.println(requestToken.getAuthorizationURL());
          System.out.print("Enter the PIN(if aviailable) or just hit enter.[PIN]:");
          String pin = br.readLine();
          try{
             if(pin.length() > 0){
               accessToken = twitter.getOAuthAccessToken(requestToken, pin);
             }else{
               accessToken = twitter.getOAuthAccessToken();
             }
          } catch (TwitterException te) {
            if(401 == te.getStatusCode()){
              System.out.println("Unable to get the access token.");
            }else{
              te.printStackTrace();
            }
          }
          System.out.println("token = "+accessToken.getToken());
          System.out.println("tokenSecret = "+accessToken.getTokenSecret());
        }

这是我的登录方法

public void login()throws TwitterException{
    TwitterFactory factory = new TwitterFactory();
    AccessToken accessToken = new AccessToken(token, tokenSecret);
    Configuration conf = new PropertyConfiguration(new Properties());
    OAuthAuthorization auth = new OAuthAuthorization(conf);
    auth.setOAuthConsumer(consumerKey, consumerSecret);
    auth.setOAuthAccessToken(accessToken);
    twitterClient = factory.getInstance(auth);
}

这是我的状态更新方法

public void setStatus(String text) throws TwitterException {

    if(twitterClient==null)throw new IllegalStateException("Please login first : ");
    Status status; 
    try {
        status = twitterClient.updateStatus(text);
    } catch (TwitterException e) {
        e.printStackTrace();
        throw e;
    }
    System.out.println("Status : "+status.getText());
}

这些是我的错误消息:

  

401:身份验证凭据(https://dev.twitter.com/docs/auth)丢失或不正确。确保您已设置有效的conumer密钥/密钥,访问令牌/密钥和系统时钟同步。   错误 - 只读应用程序无法POST   请求 - /1/statuses/update.json   相关讨论可以在互联网上:       http://www.google.co.jp/search?q=b2b52c28或       http://www.google.co.jp/search?q=1b433fc8   TwitterException {exceptionCode = [b2b52c28-1b433fc8],statusCode = 401,retryAfter = -1,rateLimitStatus = null,featureSpecificRateLimitStatus = null,version = 2.2.6-SNAPSHOT(build:404bccc2082954dc0d12612322791a37f3daa917)}       在twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:185)       在twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65)       在twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102)       在twitter4j.TwitterImpl.post(TwitterImpl.java:1927)       在twitter4j.TwitterImpl.updateStatus(TwitterImpl.java:433)       在twitter.Zwietschi.setStatus(Zwietschi.java:74)       在twitter.Zwietschi.main(Zwietschi.java:93)

问题在哪里? 请帮忙!

4 个答案:

答案 0 :(得分:3)

检查您是否已更改权限...您必须重新生成令牌!!!

答案 1 :(得分:1)

这对我有用,您应该尝试使用ConfigurationBuilder。

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey("YOUR_APP_KEY");
cb.setOAuthConsumerSecret("YOUR_APP_SECRET");
cb.setOAuthAccessToken("USER_TOKEN_KEY");
cb.setOAuthAccessTokenSecret("USER_TOKEN_SECRET");

Twitter twitter = new TwitterFactory(cb.build()).getInstance();   
String tweet="HELLO WORLD!";
twitter.updateStatus(tweet);

答案 2 :(得分:1)

似乎截至今天(1月14日),当不使用ssl连接时,也会抛出此错误。

请参阅REST API, regarding 403 error code?了解解决方案(启用SSL,使用最新的twitter4j)。

答案 3 :(得分:1)

此实现在Twitter4J API 3.0.3版本中适用于我。

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true).setOAuthConsumerKey(Config.CONSUMER_KEY)
.setOAuthConsumerSecret(Config.CONSUMER_SECRET)
.setOAuthAccessToken(Config.ACCESS_TOKEN)
.setOAuthAccessTokenSecret(Config.ACCESS_TOKEN_SECRET);
cb.setUseSSL(true);                 
TwitterFactory twitterFactory = new TwitterFactory(cb.build());
twitter = twitterFactory.getInstance();

使其有效的线是

cb.setUseSSL(true); 

听说这是Twitter4J API 3.0.5的默认设置。