2012-04-09 11 views
0

Das erste Mal Poster, aber ich bin wirklich fest. Ich arbeite an einem kleinen Projekt und versuche mit einem Netbeans-Projekt einen Tweet zu versenden. Ich benutze twitter4j und es sieht so aus, als ob die Dinge in letzter Zeit geändert wurden, wo Sie ihre OAuth-Funktion verwenden müssen. Ich habe einen Antrag auf Twitter erstellt und einige Codes versucht, aber ich erhalte immer diese Fehlermeldung: Exception in thread „main“ connect timed outRelevant Diskussionen im Internet sein können:Twitter 4j mit Netbeans

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 

Ich bin nicht ganz sicher, was Ich mache falsch. Unten ist der Code, den ich ausprobiert habe.

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(); 
    } 

} 

Antwort

0

Ihr Code sieht gut aus. Haben Sie bestätigt, dass Sie auf jeden Fall den richtigen Kundenschlüssel und das richtige Geheimnis für Ihre App verwenden? Versuchen Sie twitter.verifyCredentials(), um zu sehen, wenn Sie den gleichen Fehler oder einen spezifischeren Fehler erhalten.

Wenn Sie an das Netz über einen Proxy sind zu korrigieren, müssen Sie Ihre Proxy-Einstellungen umfassen die Verbindung zu ermöglichen, um erfolgreich zu sein, können Details hier http://twitter4j.org/en/configuration.html#HTTP%20proxy%20server

Als Nebenwirkung gefunden werden, können Sie entfernen möchten Sie greifen auf Token und Secret von Ihrem Post zu, wenn sie noch gültig sind, dann könnte sich jemand mit Ihrem Account bei ihnen anmelden.

+0

Ist es notwendig, einen Proxy-Server zu benutzen? Ich bin ein bisschen neu in diesem Bereich, so dass ich nicht alle Details kenne. Keines der Tutorials, die ich mir angeschaut habe, hat es erwähnt. Ich denke, verifyCredentials existiert nicht mehr in der neuesten twitter4j (Auch die Zugriffs-Token und Secret sind nicht mehr gültig, keine Sorge) – user1321171

+0

Es ist nur notwendig, wenn Sie mit dem Internet über einen Proxy-Server verbinden, wenn Sie nicht, dann Sie nicht Ich brauche sie nicht. Haben Sie versucht, das mit dem Quellcode gebündelte OAuth-Beispiel zu starten und auszuführen? Ich benutze die neueste Version - 2.2.5 und verifyCredentials() ist definitiv noch da. – dpmatheson

+0

Sie haben Recht, verifyCredentials() existiert noch. Welchen Teil meines Codes schlagen Sie vor, das durch zu ersetzen? – user1321171

4

Kann ich eine alternative Route vorschlagen ..

Ich habe Herumspiele vor kurzem mit Twitter4J und ich näherte dies etwas anders - Ich fand eine schöne und einfache Möglichkeit, den Client mit einem Configuration Objekt zu authentifizieren und vorbei, dies zu die Factory, die die Instanz des von Ihnen benötigten Twitter-Objekts erhält.

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(); 
    } 
} 

Sie könnten dann diese Klasse mit Unterklassen erweitern, die die Funktionalität, die Sie benötigen implementieren oder erstellen Sie einfach die Configuration/TwitterFactory/Twitter an anderer Stelle im Code-Objekte.

Im Folgenden werde ich eine Klasse implementiert, die den Status' erstellt und kann das Statusobjekt zurückgeben, die solche zusätzlichen Informationen enthält als createdAt() und die ID etc etc.

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; 
    } 
} 

Dann können Sie die folgende Anweisung verwenden, um Erstelle den Status. Dies kann von mbean/ejb/Servlet usw.

 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()); 
     } 

Weitere Informationen über den Konfigurationsprozess erfolgen here