Twitter 4j与Netbeans

时间:2012-04-09 04:43:52

标签: netbeans twitter4j

第一次发布海报,但我真的被卡住了。 我正在做一个小项目,我正在尝试使用netbeans项目发送推文。我正在使用twitter4j,似乎最近事情发生了变化,你必须使用他们的OAuth功能。我在twitter上创建了一个应用程序并尝试了一些代码,但我一直收到这个错误:线程“main”中的异常连接超时相关讨论可以在Internet上进行:

http://www.google.co.jp/search?q=b2b52c28 or
http://www.google.co.jp/search?q=1b442895 
TwitterException{exceptionCode=[b2b52c28-1b442895 b2b52c28-1b44286b], statusCode=-1, retryAfter=-1, rateLimitStatus=null, featureSpecificRateLimitStatus=null, version=2.2.5}
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:200)
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65)
at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102)
at twitter4j.TwitterImpl.post(TwitterImpl.java:1929)
at twitter4j.TwitterImpl.updateStatus(TwitterImpl.java:433)
at login.Login.start(Login.java:36)
at login.Login.main(Login.java:63)
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:75)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:388)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:483)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:213)
at sun.net.www.http.HttpClient.New(HttpClient.java:300)
at sun.net.www.http.HttpClient.New(HttpClient.java:316)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:992)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:928)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:846)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1087)
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:158)
... 6 more
Java Result: 1

我不完全确定我做错了什么。以下是我尝试过的代码。

package login;

import java.io.IOException;

import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;

public class Login {

    private final static String CONSUMER_KEY = "******";
    private final static String CONSUMER_KEY_SECRET =
     "******";

    public void start() throws TwitterException, IOException {

 Twitter twitter = new TwitterFactory().getInstance();
 twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_KEY_SECRET);

 // here's the difference
 String accessToken = getSavedAccessToken();
 String accessTokenSecret = getSavedAccessTokenSecret();
 AccessToken oathAccessToken = new AccessToken(accessToken,
  accessTokenSecret);

 twitter.setOAuthAccessToken(oathAccessToken);
 // end of difference

 twitter.updateStatus("Hi, im updating status again from Namex Tweet for Demo");

 System.out.println("\nMy Timeline:");

 // I'm reading your timeline
 ResponseList list = twitter.getHomeTimeline();
/* for (Status each : list) {

     System.out.println("Sent by: @" + each.getUser().getScreenName()
      + " - " + each.getUser().getName() + "\n" + each.getText()
      + "\n");
 }*/

    }

    private String getSavedAccessTokenSecret() {
 // consider this is method to get your previously saved Access Token
 // Secret
 return "oC8tImRFL6i8TuRkTEaIcWsF8oY4SL5iTGNkG9O0Q";
    }

    private String getSavedAccessToken() {
 // consider this is method to get your previously saved Access Token
 return "102333999-M4W1Jtp8y8QY8RH7OxGWbM5Len5xOeeTUuG7QfcY";
    }

    public static void main(String[] args) throws Exception {
            new Login().start();
    }

}

2 个答案:

答案 0 :(得分:4)

我可以建议一条替代路线..

我最近一直在搞乱twitter4j而且我的处理方式略有不同 - 我发现了一种使用ConfigurationBuilder对象验证客户端的简单方法,并将其传递给工厂,获取所需的Twitter对象实例

package main;

import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.conf.ConfigurationBuilder;

public class Base {

    protected Twitter twitter;
    //protected TwitterStream twitterStream;
    private ConfigurationBuilder configBuilder;

    public Base(){

        configBuilder = new ConfigurationBuilder();
        configBuilder.setDebugEnabled(true);        
        configBuilder.setOAuthConsumerKey("[consumer key here]");
        configBuilder.setOAuthConsumerSecret("[consumer secret key here]");
        configBuilder.setOAuthAccessToken("[OAuthAccessToken here]");
        configBuilder.setOAuthAccessTokenSecret("[secret OAuthAccessToken here]");

        //use the ConfigBuilder.build() method and pass the result to the TwitterFactory
        TwitterFactory tf = new TwitterFactory(configBuilder.build());
        //you can now get authenticated instance of Twitter object.
        twitter = tf.getInstance();
    }
}

然后,您可以使用实现所需功能的子类扩展此类,或者在代码中的其他位置创建ConfigurationBuilder / TwitterFactory / Twitter对象。

下面我实现了一个创建status的类,并且可以返回包含其他信息的Status对象,例如createdAt()和ID等。

package main;

import twitter4j.Status;
import twitter4j.TwitterException;

public class StatusUpdater extends Base{   

    public StatusUpdater(){}

    public Status updateStatus(String statusToUpdate) throws TwitterException{
        Status status = twitter.updateStatus(statusToUpdate);
        System.out.println("statusToUpdate: " + status + ".");
        return status;
    }
}

然后,您可以使用以下语句来创建状态。这可以从mbean / ejb / servlet等完成。

     try {
            StatusUpdater statusUpdater = new StatusUpdater();
            String statusTextToSet = "test status";
            Status updatedStatus = statusUpdater.updateStatus(statusTextToSet);
            System.out.println("Created at: " + updatedStatus.getCreatedAt());
        } catch (TwitterException tex) {
            System.out.println(tex.getErrorMessage());
        }

有关配置过程的更多信息here

答案 1 :(得分:0)

您的代码看起来不错。您是否确认使用了正确的消费者密钥和应用秘密?请尝试twitter.verifyCredentials()查看是否收到相同的错误或更具体的错误。

如果您通过代理更正网络,则需要包含代理设置以允许连接成功,详情请参见http://twitter4j.org/en/configuration.html#HTTP%20proxy%20server

顺便说一句,您可能希望从帖子中删除您的访问令牌和密码,如果它们仍然有效,则有人可以登录您的帐户。