PHP Maniac

Das PHP Blog für PHP-Profis und alle die es werden wollen

PHP und die Twitter-API – Autofollow & Autounfollow (Teil 3)

28 Februar, 2010 (19:22) | Artikelserie, PHP 5 | Von: PHP Maniac

Willkommen zum dritten Teil meiner kleinen Serie zur Twitter-API mit PHP. Heute wollen wir das in den letzten zwei Teilen vorgestellte Wissen für eine erste kleine Twitter-Anwendung verwenden. Hierfür benötigen wir die call_twitter-Funktion aus dem ersten Teil und das im zweiten Teil besprochene Auslesen der eigenen Follower & Friends. Alle die diese Teile bis jetzt noch nicht gelesen haben, sollten dies vor der Lektüre dieses Artikels nachholen.

Einem Twitter-User folgen (followen)

Mit der Twitter-API können wir selbstverständlich nicht nur die Liste der Follower und Friends abrufen, sondern diese auch verändern. Zunächst möchte ich die API-Funktion zum Folgen eines anderen Twitter-Users implementieren:

http://twitter.com/friendships/create/(user_id).xml

Über diese URL lassen sich automatisiert Twitter-Freundschaften knüpfen. (user_id) muss hierbei mit der ID des Users ersetzt werden, dem wir folgen wollen. Weiterhin wird diese URL nicht mittels HTTP-Get aufgerufen, sonder als POST-Request realisiert. Dank unserer flexiblen call_twitter Funktion lässt sich dies allerdings sehr einfach durch das zweite, optionale Argument realisieren:

$result = twitter_call("http://twitter.com/friendships/create/".$user_id.".xml", "POST");
if(isset($followers->error))
{
	echo "Anfrage fehlgeschlagen: ".$result->error;
}
else
{
	echo "Freundschaft zu User-ID: ".$user_id." erstellt!";
}

Einen Twitter-Freund entfolgen (unfollow)

Genauso einfach wie das Hinzufügen von neuen Freunden lassen sich diese auch wieder aus dem Twitter-Account entfernen:

$result = twitter_call("http://twitter.com/friendships/destroy/".$user_id.".xml", "DELETE");
if(isset($followers->error))
{
	echo "Anfrage fehlgeschlagen: ".$result->error;
}
else
{
	echo "Freundschaft zu User-ID: ".$user_id." entfernt!";
}

Man beachte den Type-Parameter der twitter_call Funktion, hier setzt die Twitter-API einen DELETE Request-Typ vorraus. Skripts die einen HTTP-Request-Typ DELETE nicht unterstützen können hier allerdings auch einen POST-Request absenden. Es muss allerdings der Parameter „_method=DELETE“ an die URL angehängt werden. Da unsere twitter_call Funktion dank cURL auch DELETE-Requests unterstützt verzichten wir an dieser Stelle aber hierauf.

Automatisches Follow- & Unfollow-Skript

Zum Abschluss dieses Teils der Twitter-Serie möchte ich nun aus allen uns bekannten Funktionen ein kleines Autofollow/Autounfollow-Skript erstellen. Da in der Twitter-API die Anzahl der Anfragen pro Stunde für viele Anfragen auf 150 begrenzt ist, muss hier mit bedacht programmiert werden. In unserem Skript werden wir zunächst die Liste unserer Follower und die unserer Freunde von der API abrufen. Mit Hilfe von PHP-Funktionen bestimmen wir dann die Unterschiede der Listen und Löschen danach die Freundschaften zu Usern, die uns nicht folgen. Im Anschluss erzeugen wir Freundschaften zu Usern noch nicht unsere Freunde sind, aber unseren Account bereits folgen. Genug der Worte, hier erstmal der notwendige Quellcode:

$login_info = twitter_call("http://twitter.com/account/verify_credentials.xml");
if(isset($login_info->error))
{
	die("Login fehlgeschlagen: ".$login_info->error);
}
else
{
	$followers = twitter_call("http://twitter.com/followers/ids.xml");
	$friends = twitter_call("http://twitter.com/friends/ids.xml");
	
	foreach(array_diff($friends, $followers) as $user_id)
	{
		//Entfolge User die uns nicht folgen
		$result = twitter_call("http://twitter.com/friendships/destroy/".$user_id.".xml", "DELETE");
		if(isset($followers->error))
		{
			echo "Anfrage fehlgeschlagen: ".$result->error." (User ID: ".$user_id.")<br>";
		}
		else
		{
			echo "Entfolge: ".$user_id."<br>";
		}
	}
	foreach(array_diff($followers, $friends) as $user_id)
	{
		//Folge Usern denen wir noch nicht folgen
		$result = twitter_call("http://twitter.com/friendships/create/".$user_id.".xml", "POST");
		if(isset($followers->error))
		{
			echo "Anfrage fehlgeschlagen: ".$result->error." (User ID: ".$user_id.")<br>";
		}
		else
		{
			echo "Folge: ".$user_id."<br>";
		}
	}	
}

Da der größte Teil des Skripts bereits oben oder in den jeweiligen Teilen dieser Serie vorgestellt wurde, will ich hier nur auf die Neuerungen eingehen. Mit Hilfe der array_diff Funktion ermitteln wir über PHP die Unterschiede zwischen den Array mit den Freunden und dem der Follower. Je nachdem welcher Array als erstes Argument übergeben wird, erhalten wir eine Liste mit den Leuten denen wir folgen bzw. die wir entfolgen wollen. Mit der Foreach-Schleife setzen wir diese dann direkt in die Tat um und Entfernen alle User die uns nicht folgen aus unserer Freundesliste. Danach werden die Leute, die uns folgen zu unserer Freundesliste hinzugefügt. Zwar kann dieses Vorgehen auch das Twitter-Rate-Limit überschreiten, durch den Vergleich der Arrays werden allerdings sehr viele zeitintisive Abfragen gegenüber einer herkömmlichen Implementierung eingespart (herkommlich würde in diesem Fall bedeuten zunächst alle Freunde abzurufen und dann für jeden Freund mit Hilfe einer Abfrage zu Prüfen ob dieser in unserer Freundesliste ist).

Soviel zu dritten Teil der Twitter-Serie, heute haben wir zum ersten Mal ein mehr oder weniger sinnvolles Skript für die Twitter-API auf die Beine gestellt. Alle Leute die (wie ich) ihre Twitter-Zugangsdaten ungerne auf den diversen Twitter-Tools Webseiten eingeben können somit die beliebteste Funktion direkt auf dem eigenen Server realisieren. Alle anderen lernen hoffentlich etwas für eigene Twitter-Skripte, falls ihr eigene Skripte oder Ergebnisse vorweisen könnt postet gerne in den Kommentaren.

Be Sociable, Share!

Kommentare

Kommentar von Tim Bischoff
Datum 11. Mai 2010 um 19:27 Uhr

Das PHP-Script passt noch nicht ganz du musst noch kleine Anpassungen vornehmen, habe es eben mal getestet.

Meine Änderungen, du musst zuerst die XML-Objekte in Arrays umwandeln.

// Objekte in Arrays verwandeln
$friends = get_object_vars($friends);
$followers = get_object_vars($followers);

Die Foreach-Schleife muss anders lauten…
foreach(array_diff($friends[‚id‘], $followers[‚id‘]) as $user_id)

Dann funktioniert es wunderbar, ich habe in der Foreach-Schleife noch einen Zähler eingebaut – damit nur die 150 erlaubten Aktionen innerhalb einer Stunde an Twitter erfolgen.

Kommentar von Alex
Datum 31. Mai 2010 um 20:08 Uhr

Danke für die nette Tutorialreihe. Hat mir sehr gut gefallen.

Kommentar von Fabian Knopf
Datum 2. Juli 2011 um 20:00 Uhr

@Tim Danke!
@Php Maniac Danke für die Scripte!

Schreibe einen Kommentar