Twitter Development Serie

This entry is part 1 of 10 in the series Twitter Development

twitter-tVorstellen muß man Twitter wohl nicht mehr, denn in der Zwischenzeit hat das Twitter-Fieber die Gruppe der reinen Computer Nerds schon längst verlassen ist und ist inzwischen in aller Munde. Neben den vielen Einsatzmöglichkeiten des Microblogging-Dienstes ist sicher auch die sehr einfache und vollständige API ein Grund für den großen Erfolg von Twitter. Noch dazu das diese auch noch hervorragend dokumentiert ist.

Entspechende Module, mit denen man die Twitter API in den unterschiedlichen Programmiersprachen einfach nutzen kann, gibt es inzwischen schon fast wie Sand am Meer. Die populärsten davon sind im Developmentbereich bei Twitter sauber aufgelistet und sortiert.

In meiner Serie will ich mich nun speziell der Java API für Twitter widmen und unseren Lesern einige Grundfunktionen dieses Dienstes vorstellen. Auf jeden Fall werde ich versuchen sowohl auf technischen Background und API Einsatz, als auch den angedachten Verwendungszweck der diversen Funktionen einzugehen. Vorerst sind folgende Themen geplant:

  • Verbindung mit Twitter aufbauen
  • Benutzerinformationen
  • Friends und Followers
  • Private und Public Timelines
  • Nachrichten Empfangen und Versenden
  • Replies und Mentions
  • Suche von Tweets
  • Zusammenfassung

Solltet ihr das ein oder andere Feature vermissen, so freue ich mich über Feedback. Morgen gehts los.

Bernd Erk

Autor: Bernd Erk

Bernd ist einer der Geschäftsführer der NETWAYS Gruppe und verantwortet das Tagesgeschäft. Da er in einem früheren Leben mit Java und Oracle Datenbanken gearbeitet hat, kümmert er sich immer noch gerne um das Thema Reporting - sowohl bei NETWAYS, als auch im Icinga Team. In seiner knappen Freizeit streitet er sich mit seinem Sohn, wer das iPad gerade benutzen darf und widmet sich der Weiterverbreitung der gehobenen fränkischen Schaschlik-Kultur.

Twitter Development – Verbindung aufbauen

This entry is part 2 of 10 in the series Twitter Development

twitter-tTwitter ist ein sehr populärer Micro-Blogging Dienst, der seinen Erfolg großteils den vielen rund um ihn entstandenen Tools und Programmen zu verdanken hat. Vor allem, weil die Nutzung von Twitter durch die bereitgestellten API Funktionen besoners leicht ist.

Diese kleine Serie widmet sich der Verwendung der Java-API Twitter4J von Yusuke Yamamoto. Twitter4J schien mir die vollständigste und aktivste Java API für Twitter zu sein, aber der grundsätzliche Ansatz ist wohl API-übergreifend.

Die verwendete Funktionsweise zur Autorisierung der Benutzer ist ergänzend einen tiefergehenden Blick wert und basiert auf OAuth, welches die Freigabe von Informationen ohne Austauch von Benutzer und Passwort ermöglicht. Einen ausführlichen Beginners Guide gibt es bei Hueniverse.

Im ersten Beispiel bauen wir mal die Verbindung zu Twitter auf, was so einfach ist, dass sich die Definition einer eigenen Klasse eigentlich nicht lohnt, aber es soll auf Basis dieser Klassen in der Serie weiter gehen.

package org.netways.api.twitter;

import twitter4j.RateLimitStatus;
import twitter4j.Twitter;
import twitter4j.TwitterException;

public class TwitterFunctions {

	Twitter twitter;

	public TwitterFunctions(String user, String password) {
		twitter = new Twitter(user, password);
	}

	public int getHourlyLimit() throws TwitterException {
		RateLimitStatus rls = twitter.rateLimitStatus();
		return rls.getHourlyLimit();
	}

	public int getRemainingHits() throws TwitterException {
		RateLimitStatus rls = twitter.rateLimitStatus();
		return rls.getRemainingHits();
	}
}

Anschließend lassen wir uns unter Verwendung der Klasse RateLimitStatus gleich noch zurückgeben, ob wir noch ein paar Versuche frei haben, die Twitter-Services in Anspruch zu nehmen. Nachdem das aktuelle Limit vor kurzem von 100 auf 150 Calls erhöht wurde, haben wir also noch ein wenig Luft für weitere Übungen.

package org.netways.api.twitter;

public class TwitterApi {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TwitterFunctions tf = new TwitterFunctions("netways", "password");

			System.out.println("Hourly Limit: "+tf.getHourlyLimit());
			System.out.println("Free Limit: "+tf.getRemainingHits());
		} catch (Exception e) {
			System.err.println(e.toString());
		}
	}
}

Der nächsten Blog-Post widmet sich den vorhandenen Userattributen und und Möglichkeiten zur Weiterverarbeitung.

Bernd Erk

Autor: Bernd Erk

Bernd ist einer der Geschäftsführer der NETWAYS Gruppe und verantwortet das Tagesgeschäft. Da er in einem früheren Leben mit Java und Oracle Datenbanken gearbeitet hat, kümmert er sich immer noch gerne um das Thema Reporting - sowohl bei NETWAYS, als auch im Icinga Team. In seiner knappen Freizeit streitet er sich mit seinem Sohn, wer das iPad gerade benutzen darf und widmet sich der Weiterverbreitung der gehobenen fränkischen Schaschlik-Kultur.

Twitter Development – Benutzerinformationen

This entry is part 3 of 10 in the series Twitter Development

twitter-tIm ersten Teil der Serie haben wir Verbindung mit Twitter aufgenommen. Alle Merkmale eines Benutzers und auch dessen Profils sind in Twitter via API zugänglich. Das heisst sämtliche Informationen, welche im Webinterface angezeigt werden, darüber hinaus jedoch auch die die Einstellung des Profils wie Farben, Hintergrundbild und ob der Benutzer z.B. den Benachrichtigungsdienst von Twitter aktiviert hat.

twitter_page

Soweit das Profil des Benutzers nicht geschützt ist (Der Status kann nur von autorisierten Freunden eingesehen werden), sind diese Informationen für alle Twitter-Benutzer verfügbar.

Auch in diesem Beispiel wäre keine Implementierung einer eigenen Methode notwendig um die benötigten Informationen zu ermitteln. Die Kapselung erleichtert jedoch die nachfolgenden Beispiele.

So einfach geht die Implementierung:

package org.netways.api.twitter;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.User;

public class TwitterFunctions {

Twitter twitter;

public TwitterFunctions(String user, String password) {
twitter = new Twitter(user, password);
}

public User getUserInfo(String username) throws TwitterException {
User user = twitter.getUserDetail(username);
return user;
}
}

Die Ermittlung der Benutzerinformationen geht über die Funktion getUserDetail, welche die Übergabe des Twitter-Namens voraussetzt.

package org.netways.api.twitter;

import twitter4j.User;

public class TwitterApi {

/**
* @param args
*/
public static void main(String[] args) {
try {
TwitterFunctions tf = new TwitterFunctions("netways", "password");

User user = tf.getUserInfo("aplusk");
System.out.println("Name: " + user.getName());
System.out.println("Screenname: " + user.getScreenName());
System.out.println("Web: " + user.getURL());
System.out.println("Description: " + user.getDescription());
System.out.println("Location: " + user.getLocation());
System.out.println("Last Status: " + user.getStatusText());
System.out.println("Followers: " + user.getFollowersCount());
System.out.println("Following: " + user.getFriendsCount());
} catch (Exception e) {
System.err.println(e.toString());
}
}
}

Anschließend schreiben wir die ermittelten Daten einfach auf die Konsole:

Name: netways
Screenname: netways
Web: http://blog.netways.de
Description: Open Source IT Infrastructure
Location: Germany, Nürnberg
Last Status: New blog post: NETWAYSGrapherV2 RC3 veröffentlicht http://bit.ly/1wbXDH
Followers: 159
Following: 161

Zum Beweis noch der Output des Benutzers mit den meisten Followern (die Description ist echt lesenswert ;-)):

Name: ashton kutcher
Screenname: aplusk
Web: http://blahgirls.com
Description: I make stuff, actually I make up stuff, stories mostly, collaborations of
thoughts, dreams, and actions. Thats me.
Location: here
Last Status: it was a little hot today  http://bit.ly/oy5TI
Followers: 2839413
Following: 184

Während wir noch daran arbeiten Ashton mit unserem NETWAYS Twitter Account zu übertreffen, geht es in den nächsten beiden Blogposts um die Beziehung zwischen Twitter-User.

Bernd Erk

Autor: Bernd Erk

Bernd ist einer der Geschäftsführer der NETWAYS Gruppe und verantwortet das Tagesgeschäft. Da er in einem früheren Leben mit Java und Oracle Datenbanken gearbeitet hat, kümmert er sich immer noch gerne um das Thema Reporting - sowohl bei NETWAYS, als auch im Icinga Team. In seiner knappen Freizeit streitet er sich mit seinem Sohn, wer das iPad gerade benutzen darf und widmet sich der Weiterverbreitung der gehobenen fränkischen Schaschlik-Kultur.

Twitter Development – Friends und Followers I

This entry is part 4 of 10 in the series Twitter Development

twitter-tFreunde und Verfolger, wobei zweites hier nicht negativ gemeint sind, sind (waren) das entsprechende Wording für die Beziehungsbeschreibung zwischen unterschiedlichen Benutzern bei Twitter.

Ein Beispiel:

Benutzer A bekommt über alle Statusänderungen von Benutzer B ein Update seiner Timeline (dazu in einem späteren Post mehr). Er ist also ein Follower von Benutzer B. Aus Sicht von Benutzer B folgt ihm Benutzer A und ist somit Following. Früher gab es bei Twitter noch die Terminology des Freundes, welche jedoch vor einiger Zeit verändert wurde. Grund hierfür ist, dass nicht jeder dem Benutzer A folgt auch ihm folgen muss. Da es somit meist zu asymetrischen Beziehungen gekommen ist, war das Modell eher verwirrend.

Näheres zur Anpassung dieser Beschreibung sind im APIWiki von Twitter zu finden.

Die Beziehungen zwischen verschiedenen Benutzern lassen sich mit Hilfe der API sehr einfach ermitteln und ggf. auch weiterverarbeiten. Nachfolgendes Beispiel zeigt ein paar Möglichkeiten auf:

package org.netways.api.twitter;

import java.util.List;

import twitter4j.Paging;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.User;

public class TwitterFunctions {

	Twitter twitter;

	public TwitterFunctions(String user, String password) {
		twitter = new Twitter(user, password);
	}

	public List getMyFollowers() throws TwitterException {
		List followers = twitter.getFollowers();
		return followers;
	}

	public List getFollowers(String username) throws TwitterException {
		List followers = twitter.getFollowers(username);
		return followers;
	}

	public List getFollowerPage(int side) throws TwitterException {
		Paging paging = new Paging(side);
		List followers = twitter.getFollowers(paging);
		return followers;
	}
}

Zur Ermittlung von Followers und Following gibt es verschiedene Methoden Signaturen, welche auch die seitenweise Ermittlung der Daten und deren Rückgabe ermöglichen. Erstes Beispiel ermittelt alle Follower des angemeldeten Accounts:

package org.netways.api.twitter;

import java.util.Iterator;
import java.util.List;

import twitter4j.User;

public class TwitterApi {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TwitterFunctions tf = new TwitterFunctions("netways", "password");

			List users = tf.getMyFollowers();
			Iterator it = users.iterator();
                        while(it.hasNext()) {
                               System.out.println(it.next().getScreenName());
                        }
                      } catch (Exception e) {
                        System.err.println(e.toString());
                      }
          }
}

Output der Konsole:

ferrari9135
mariana4724
infinity1817
Seminaraccount
stephaniemuths
andel7
jrgptr
AddisonWesley
pugnacity
ratgeber24
goern
derjoern
ffiene
stayfriendsde
........

Unter Verwendung der Paging Funktion können auch nur bestimmte Ausschnitte der Ergebnisliste verarbeitet werden. Dies ist z. B. bei der Wiederverwendung von eigenen Applikation und seitenweise Ermittlung der Ergebnisse sinnvoll.

package org.netways.api.twitter;

import java.util.Iterator;
import java.util.List;

import twitter4j.User;

public class TwitterApi {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TwitterFunctions tf = new TwitterFunctions("netways", "password");

			List users = tf.getFollowerPage(2);
			Iterator it = users.iterator();
			while(it.hasNext()) {
				System.out.println(it.next().getScreenName());
			}

		} catch (Exception e) {
			System.err.println(e.toString());
		}
	}
}

Der nächste Teil dieses Posts verdeutlicht die Ermittlung der Following Benutzer (früher Friends genannt).

Bernd Erk

Autor: Bernd Erk

Bernd ist einer der Geschäftsführer der NETWAYS Gruppe und verantwortet das Tagesgeschäft. Da er in einem früheren Leben mit Java und Oracle Datenbanken gearbeitet hat, kümmert er sich immer noch gerne um das Thema Reporting - sowohl bei NETWAYS, als auch im Icinga Team. In seiner knappen Freizeit streitet er sich mit seinem Sohn, wer das iPad gerade benutzen darf und widmet sich der Weiterverbreitung der gehobenen fränkischen Schaschlik-Kultur.

Twitter Development – Friends und Followers II

This entry is part 5 of 10 in the series Twitter Development

twitter-tDer vergangene Blogpost verdeutlichte die Beziehung von Benutzer untereinander und die Möglickeit entsprechende Follower via API zu ermitteln. Zur Vervollständigung des Serienteils fehlt noch die Ermittlung der Benutzer, denen man selber folgt. Besonders wichtig ist hierbei das Verständnis für den Aufbau der API. Alle Objekte innerhalb des Twitter-Universums haben eindeutige IDs. Benutzer und Tweets können somit logisch verknüpft werden.

Ein Beispiel:

Benutzer A (ID 342354) antwortet Benutzer B (ID 434545) mit dem Tweet “Ich bin der selben Meinung” (ID 16676) auf den Tweet “Sehr ihr das auch so” (ID 45463). Mit diesen vier künstlichen Schlüsselelementen lässt sich jegliche Beziehung zwischen den Benutzer und deren Nachrichten erstellen. Dies ermöglicht verschiedenen Clients wie z. B. Nambu Replies einem ursprünglichen Tweets zuzuordnen. Twitter ist also weit mehr als eine ordnungslose Abfolge von Nachrichten. Mit Hilfe dieser IDs lassen sich auch komplexe Kommunikationsszenarien nachstellen.

Aber zurück zu den Friends bzw. Following. Die Methodensignatur ist identisch zur Ermittlung der Follower:

package org.netways.api.twitter;

import java.util.List;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.User;

public class TwitterFunctions {

Twitter twitter;

public TwitterFunctions(String user, String password) {
twitter = new Twitter(user, password);
}

public List getFollowing() throws TwitterException {
List following = twitter.getFriends();
return following;
}
}

Hier der Aufruf:

package org.netways.api.twitter;

import java.util.Iterator;
import java.util.List;

import twitter4j.User;

public class TwitterApi {

/**
* @param args
*/
public static void main(String[] args) {
try {
TwitterFunctions tf = new TwitterFunctions("netways", "password");

List users = tf.getFollowing();
Iterator it = users.iterator();
while(it.hasNext()) {
System.out.println(it.next().getScreenName());
}

} catch (Exception e) {
System.err.println(e.toString());
}
}
}

Output der Konsole:

goern
ratgeber24
stayfriendsde
derjoern
ffiene
RicRaftis
sherz
mfekry
stereofix
beginlinux
AdventureHarry
Ubuntuu
........

Der nächste Blogpost widmet sich dem Thema Twitter Timelines.

Bernd Erk

Autor: Bernd Erk

Bernd ist einer der Geschäftsführer der NETWAYS Gruppe und verantwortet das Tagesgeschäft. Da er in einem früheren Leben mit Java und Oracle Datenbanken gearbeitet hat, kümmert er sich immer noch gerne um das Thema Reporting - sowohl bei NETWAYS, als auch im Icinga Team. In seiner knappen Freizeit streitet er sich mit seinem Sohn, wer das iPad gerade benutzen darf und widmet sich der Weiterverbreitung der gehobenen fränkischen Schaschlik-Kultur.