Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: DeveloperTalk. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

DanielBocksteger

unregistriert

1

30.06.2011, 15:56

Twitter-Client mit Twitter4j

Hallo Gemeinde,

Ich hab heute mal angefangen, einen Twitter-Client zu schrieben , doch wirft Eclipse mir nun immer eine Exception beim ausführen des Codes ....

Spoiler Spoiler


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package com.messagebird.twitter;

import java.util.List;
import java.io.BufferedReader;
import java.io.InputStreamReader;

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

public class MessageBird {
	
	private String consumerKey = "######";	// Bei mir natürlich der Key
	private String consumerSecret = "#####";  // The same :)

	public void initialAuth() throws Exception {
		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 SetStatus( String text ) {
		
	}
	
	public List<Status> getTimeline() {
		return null;
	}
	
	public static void main( String[] args ) throws Exception {
		new MessageBird().initialAuth();
	}
}

Spoiler Spoiler



Eclipse wirft mir beim Ausführen "As Application" folgendes aus :

Zitat

Exception in thread "main" java.lang.NoSuchMethodError: main



Ich hoffe, das mir hier jemand bei meinem Problem helfen kann :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DanielBocksteger« (30.06.2011, 22:04)


Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

2

30.06.2011, 16:10

Bei mir geht der Code... Irgendwas muss in eclipse fals laufen, starte mal über cmd-line :)
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

DanielBocksteger

unregistriert

3

30.06.2011, 16:52

Habe gerade mal die *.class Datei im Linux-Terminal ausgeführt und bekomem folgendes zurück :

Zitat

Exception in thread "main" java.lang.NoClassDefFoundError: MessageBird (wrong name: com/messagebird/twitter/MessageBird)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: MessageBird. Program will exit.

Sagt das jemandem evtl. was da der Fehler ist ?

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

4

30.06.2011, 17:04

Du musst im bin ordner sein mit dem terminal und dann
java com.messagebird.twitter.MessageBird
benutzen...

Aber bei mir findet der die Klasse TwitterException nicht, da muss man wohl den Classpath selsbt anpassen...
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

DanielBocksteger

unregistriert

5

30.06.2011, 17:09

Nun der nächste Versuch gescheitert ;D

Zitat

daniel@Daniel-Ubuntu:~/Arbeitsfläche/Workspace/bin$ java com.messagebird.twitter.MessageBird
Exception in thread "main" java.lang.NoSuchMethodError: main


wie man sieht bekomme ich nun den selben Error wie in Eclipse .

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

6

30.06.2011, 17:14

Das Problem deutet eigentlich auf eine fehlende Einstiegsfunktion hin.
Darf die Mainfunktion vielleicht keine Exceptions throwen?
Probier das einmal aus.

DanielBocksteger

unregistriert

7

30.06.2011, 17:15

So , ich nochmal ;D

Da ich von Erik gerade gehört habe, dass es bei ihm unter Windows läuft ( nutze Ubuntu 11.04 ), wüsste ich mal gerne ob es am System liegen kann ? wenn ja , gibt es da eine Lösung ?

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

8

30.06.2011, 17:16

Hast du meine Anregung mal ausprobiert?

DanielBocksteger

unregistriert

9

30.06.2011, 17:20

Hey Simon,

ja , habe ich schon gemacht (vor der Anregung aber tdem. bedankt :) ). Dabei kommt dann so ziemlich genau das selber raus , wie gesagt, bei Erik läuft der oben gepostete Code ;)

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

10

30.06.2011, 17:27

Okay, an den Exceptions kann es schonmal nicht liegen, dass habe ich gerade ausprobiert.
Nur wie kann Erik das ganze Kompilieren und Testen, wenn ihm die Twitterklassen fehlen? O.o

DanielBocksteger

unregistriert

11

30.06.2011, 17:39

die hat er sich mit einem Link von mir runter geladen ;)

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

12

30.06.2011, 17:40

Kann ich den auch einmal haben?

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

13

30.06.2011, 17:47

Noch ein paar Anregungen:
Startest du die richtige Klasse?
Hast du in der Datei sicher nur eine Klasse drinne?

DanielBocksteger

unregistriert

14

30.06.2011, 17:52

Ja , es existiert nur eine Klasse und auch nur eine Datei ;)

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

15

30.06.2011, 17:53

Und der Link?

DanielBocksteger

unregistriert

16

30.06.2011, 18:05

Ich lade euch mal die lib hier hoch ;)

Dann kann die jeder, der mir helfen möchte nutzen und hat auch das selbe :)
Die Datei dann einfach ins workspace einfügen und dann den buildpath "bauen" ( in eclipse ja ganz einfach )

Edit:

Habe nun auch das Projektverzeichnis als *.zip hochgeladen (auf Wunsch von Simon ) ;)
»DanielBocksteger« hat folgende Dateien angehängt:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DanielBocksteger« (30.06.2011, 18:43)


Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

17

30.06.2011, 18:25

So ich habe mir das ganze mal angesehen.
Erstmal habe ich es zum Laufen bekommen.
Das Problem war, dass du die Lib 2 mal importiert hast, aber nur eine vorhanden ist.
Aus dem Grund compiliert Javac auch nicht und folglich gibt es keine main-Funktion.

Dann habe ich noch einen Programmierfehler gefunden :D
Du schreibst:

Java-Quelltext

1
twitter.setOAuthConsumer("consumerKey", "consumerSecret");

meinst aber warscheinlich

Java-Quelltext

1
twitter.setOAuthConsumer(consumerKey, consumerSecret);

Du willst ja die vorher definierten Appdaten übergeben ;)

Ich hoffe damit ist das Problem behoben :)

DanielBocksteger

unregistriert

18

30.06.2011, 20:08

Hier nun einmal der soweit funktionieren Client, leider postet er die Beiträge abe rnoch nicht , warum genau ist noch eine offen stehende frage, es gibt auf jedenfall als endergebnis "status wurde gesetzt" schaut man bei twitter rein ist dies abe rnicht der fall ^^.

Spoiler Spoiler


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.messagebird.twitter;

import java.util.List;
import java.io.BufferedReader;
import java.io.InputStreamReader;

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

import twitter4j.conf.ConfigurationBuilder;

public class MessageBird {
	
	private String consumerKey = "#####";
	private String consumerSecret = "#####";
	private String token = "#####";
	private String tokenSecret = "#####";
	private Twitter twitterClient;

	public void initialAuth() throws Exception {
		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 {
		ConfigurationBuilder cb = new ConfigurationBuilder();
		cb.setDebugEnabled(true)
		  .setOAuthConsumerKey(consumerKey)
		  .setOAuthConsumerSecret(consumerSecret)
		  .setOAuthAccessToken(token)
		  .setOAuthAccessTokenSecret(tokenSecret);
		TwitterFactory tf = new TwitterFactory(cb.build());
		twitterClient = tf.getInstance();
	}
	
	public void setStatus( String text ) throws TwitterException {
		if ( twitterClient == null ) throw new IllegalStateException( "Please login first!" );
		Status status;
		try {
			status = twitterClient.updateStatus( text );
			System.out.println( "Status gesetzt: " + status.getText() );
		} catch (TwitterException e) {
			e.printStackTrace();
			throw e;
		}
		
	}
	
	public List<Status> getTimeline() throws TwitterException {
		return twitterClient.getFriendsTimeline();
	}
	
	public static void main( String[] args ) {
		MessageBird mb = new MessageBird();
		try {
			mb.login();
			mb.setStatus( "First test!! with MessageBird" );
		} catch (TwitterException e) {
			e.printStackTrace();
		}
	}
}



Hat evtl. jemand von euch noch eine Idee ?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DanielBocksteger« (30.06.2011, 22:05)


DanielBocksteger

unregistriert

19

30.06.2011, 21:04

Das letzte Problem hat sich erledigt ;D

Werde mich nun dran setzten ne GUI dafür zu schrieben ;D Dann werde ich euch hier ein Tutorial dazu basteln ;)
Bis dahin ;)

DanielBocksteger

unregistriert

20

30.06.2011, 22:07

Grafische Oberfläche

Hey,

Da der Client soweit läuft wollte ich nur dazu noch eine Grafische Oberfläche schrieben , wo Linux mir aber scheinbar eine Rechnung durchmacht.
Code, der auf Windows funktionier, geht hier nun nicht .... Ich würde aber gerne eine Lösung dafür finden da ich hautsächlich Linux nutze.

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* MessageBirdGUI
 * Author : Daniel Bocksteger
 * Published: 30.06.2011  22:07
 */


package com.messagebird.twitter;

import java.awt.BorderLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MessageBirdGUI {

	private MessageBird messagebird;
	private final JTextField statusText = new JTextField();
	private final JTextArea timeline = new JTextArea();
	private final JProgressBar progressBar = new JProgressBar();
	
	// Baut den Statusbereich
	public JPanel buildStatusPanel() {
		// Panel, Text
		JPanel statusPanel = new JPanel( new BorderLayout() );
		statusPanel.setBorder( BorderFactory.createTitledBorder( "Status" ));
		statusPanel.add( statusText, BorderLayout.CENTER );
		// Button
		JButton statusButton = new JButton( "Senden" );
		JPanel statusButtonPanel = new JPanel( new BorderLayout() );
		statusButtonPanel.add( statusButton, BorderLayout.WEST );
		statusPanel.add( statusButtonPanel, BorderLayout.SOUTH );
		return statusPanel;
	}
	
	public JPanel buildTimelinePanel() {
		JPanel timelinePanel = new JPanel();
		timeline.setBorder( BorderFactory.createTitledBorder( "Timeline" ));
		// Textarea
		timeline.setEditable( false );
		timelinePanel.add( timeline, BorderLayout.CENTER);
		// Button
		JPanel timelineButtonPanel = new JPanel( new BorderLayout() );
		JButton timelineButton = new JButton( "Tweets holen" );
		timelineButtonPanel.add( timelineButton, BorderLayout.WEST );
		return timelinePanel;
	}
	
	public JFrame createFrame() {
		JFrame frame = new JFrame( "MessageBird" );
		frame.setSize( 400, 400 );
		frame.setLocation( 200, 500 );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.add( buildStatusPanel(), BorderLayout.NORTH);
		frame.add( buildTimelinePanel(), BorderLayout.CENTER);
		return frame;
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MessageBirdGUI gui = new MessageBirdGUI();
		JFrame main = gui.createFrame();
		main.setVisible( true );

	}

}



Evtl. habe ich auch einen Denkfehler drin ?

Ähnliche Themen

Verwendete Tags

Client, Java, Twitter