Dieser Teil wird etwas anspruchsvoller als die Vorangegangenen. Wir werden verstärkt von cURL und JSON Gebrauch machen um mit der Twitter API zu kommunizieren. Die Antworten der API müssen ausgewertet werden und darauf basierend “neue Fragen” formuliert werden.

Der Stinkefinger der Twitter API heißt “Fail Whale” aka. HTTP_RESPONSE Code 503. Wenn wir den als Antwort bekommen, dann hat Twitter was besseres vor, als sich um uns zu kümmern und wir können für die nächste Zeit vergessen eine brauchbare Antwort zu erhalten.

Wie immer definieren wir am Anfang unsere Variablen. Diesmal sind keine neuen Konstanten dabei. $followers und $friends werden die Matrizen sein, in denen unsere Follower und Freunde abgespeichert werden. Da wir die nicht einfach so kennen, müssen wir Twitter erst einmal danach Fragen. Den Cursor brauchen wir, weil uns Twitter nur maximal 100 Follower/Friends am Stück nennt. Mit dem Cursor wissen wir dann, wo wir die nächsten 100 als Antwort bekommen.

$stalled = false;

$next_cursor = -1;

$followers = array();
$friends = array();

Als nächstes Fragen wir die/das API so lange nach neuen Followern, bis wir keinen neuen Cursor erhalten. Wenn wir den Fail Whale treffen, dann können wir unser Programm eigentlich abbrechen, weil wir dann keine vollständigen Informationen erhalten haben.

do {
  $cursor = $next_cursor;

  $curl = curl_init( "http://api.twitter.com/1/statuses/followers.json?cursor=$cursor" );
  curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
  curl_setopt( $curl, CURLOPT_USERPWD, TWITTER_LOGIN .":". TWITTER_PASSWORT );
  curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1);
  $retval = curl_exec( $curl );

  $response = curl_getinfo($curl);
  $http_code = $response['http_code'];

  if (in_array($http_code, array("503"))) {
    $stalled = true; // Fail Whale
  }

  $retval = json_decode($retval);
  $next_cursor = $retval->next_cursor_str;

  foreach ($retval->users as $follower) {
    array_push($followers, $follower->id);
  }
} while ($next_cursor != $cursor && !$stalled);

if ($stalled) {
  die("We saw the Fail Whale!\n");
}

Der Wert für $next_cursor wird zurückgesetzt und das gleiche Spiel beginnt von Vorne. Diesmal fragen wir aber nach unseren eigenen Freunden. Also nach den Accounts, die uns bereits folgen.

$next_cursor = -1;

do {

  $cursor = $next_cursor;

  $curl = curl_init( "http://api.twitter.com/1/statuses/friends.json?cursor=$cursor" );
  curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
  curl_setopt( $curl, CURLOPT_USERPWD, TWITTER_LOGIN .":". TWITTER_PASSWORT );
  curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1);
  $retval = curl_exec( $curl );

  $response = curl_getinfo($curl);
  $http_code = $response['http_code'];

  if (in_array($http_code, array("503"))) {
    $stalled = true;
  }

  $retval = json_decode($retval);
  $next_cursor = $retval->next_cursor_str;

  foreach ($retval->users as $friend) {
    array_push($friends, $friend->id);
  }
} while ($next_cursor != $cursor && !$stalled);

if ($stalled) {
  die("We saw the Fail Whale!\n");
}

Jetzt müssen wir nur noch die IDs, die in unserer Follower Liste sind, nicht aber in unserer Friend Liste, als Freunde hinzufügen.

echo "adding friends... ";
foreach ($followers as $id) {
  if (!in_array($id, $friends)) {
    echo "$id ";
    $curl = curl_init( "http://api.twitter.com/1/friendships/create/$id.json" );
    curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
    curl_setopt( $curl, CURLOPT_POST,1);
    curl_setopt( $curl, CURLOPT_USERPWD, $login.":".$pw );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1);
    $retval = curl_exec( $curl );
  }
}
curl_close( $curl );

Fertig 🙂

Allesblog#JSON#PHP#Twitter