Pixelfans

Kategorie: PHP

16 Mar 2009

Twitter mit PHP in eigener Website nutzen

geschrieben von Pawel

Twitter ist ein großartiger Webdienst. Man könnte ihn als Mischung aus Miniblog und Sammel-SMS bezeichnen. Kurz gesagt, kann ich andere daran teilhaben lassen, was ich gerade so tue oder denke. Wir sind davon bei Pixelfans so begeistert, dass wir jeweils immer den aktuellsten Beitrag von Carsten oder mir auf dieser Website einbinden.

Twitter hat natürlich eine API, die auch gut dokumentiert ist. In der Dokumentation findet der begeisterte Neutwitterianer unter dem Punkt The Easiest Way to Play around with the Twitter API folgendes:

get the public timeline in RSS format, unauthenticated: curl "http://twitter.com/statuses/public_timeline.rss"

Sieht simpel aus und es funktioniert auch in der Konsole, wenn man auf seinem Betriebsystem CURL installiert hat. RSS-Abruf von der KonsoleUm es auf einer Website zu nutzen, muss es aber mit PHP zusammen spielen.

CURL ist in den meisten PHP-Installationen enthalten. Das o.g. Beispiel würde in PHP wie folgt aussehen:

<?php
function twitter($url) {
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($curl_handle);
curl_close($curl_handle);
return $response;
}

$url="http://twitter.com/statuses/public_timeline.xml";
$xml = twitter($url);
echo "<pre>";
echo htmlentities($xml);
echo "</pre>";
}
?>

Nicht wirklich schwer, aber doch etwas umfangreicher als in der offiziellen Dokumentation.Das Tolle ist, das man keinen API-Schlüssel oder ähnliches braucht, in der o.g. Form benötigt man noch nicht einmal einen Twitter-Account. Nun möchte nicht jeder jede öffentliche Twitternachricht einbinden. Praktischer ist es nur seine eigenen Nachrichten bzw. die seiner Freunde einzubinden. Dazu muss das Beispiel nur leicht abgeändert werden.

Zunächst sollte Sie sich aber den Output ansehen.

<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
<created_at>Mon Mar 16 12:51:46 +0000 2009</created_at>
<id>1336057454</id>
<text>Gehe Mittagessen kaufen&#8230;</text>
<source>&lt;a href="http://www.twhirl.org/"&gt;twhirl&lt;/a&gt;</source>
<truncated>false</truncated>
<in_reply_to_status_id></in_reply_to_status_id>
<in_reply_to_user_id></in_reply_to_user_id>
<favorited>false</favorited>
<in_reply_to_screen_name></in_reply_to_screen_name>
<user>
<id>...</id>
<name>...</name>
<screen_name>...l</screen_name>
<location>Halle, Germany</location>
<description>...</description>
<profile_image_url>...</profile_image_url>
<url>http://www.pixelfans.de</url>
<protected>false</protected>
<followers_count>2</followers_count>
</user>
</status>
...

Soweit die Struktur des Dokuments. Die Twitter-API kann aber die meisten geüwnschten Formate zurückliefern. Soll die Antwort mit Javascript weiter verwendet werden, bietet sich JSON an.

<?php
function twitter($url) {
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url);

Freunde müssen natürlich einen bestimmten Nutzer zugeordnet werden. Deshalb ist die Angabe von Nutzernamen und Passwort, die durch ":" getrennt werden erforderlich.

 curl_setopt($curl_handle, CURLOPT_USERPWD, "Twitter_screen_Name:Passwort");
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($curl_handle);
curl_close($curl_handle);
return $response;
}
$url="http://twitter.com/statuses/friends_timeline.xml";

Wir nutzen jetzt SimpleXML für die Verabeitung der XML-Rückgabe. Dieses ist ab PHP 5 verfügbar.

$xml = simplexml_load_string(twitter($url));
foreach($xml->status as $status) {
echo "<strong>";
echo $status->user->name;
echo ":</strong> ";
echo $status->text;
echo "<hr />";
}
?>

Wozu sollten Sie sich den HTML-OUtput des ersten Beispiels ansehen? Richtig, um die Struktur des Dokumentenbaums zu verstehen und um damit Zugriff auf jedes Kindelement zu erlangen.

Wer Twitter umfangreicher nutzen möchte, dem sei nätürlich die Klasse twitter.lib.php empfohlen. Diese kann auch mit PHP4 genutzt werden, dazu ist es aber nötig, die private-Deklarationen zu löschen.

Für viele CMS sind natürlich Plugins u.ä. bereits fix und fertig nutzbar. Exemplarisch sei hier auf das Plugin für Expression Engine und die library für CodeIgniter verwiesen.

Kategorie: PHP | Permalink

4 Mar 2009

Flickr mit PHP in eigener Website verwenden (Teil 3)

geschrieben von Pawel

Ich bin in den ersten beiden Teilen dieser kleinen Serie schon auf eine PHP-Klasse und ein Mashup eingegangen. Ich habe mich immer gefragt, ob es nicht auch ein bißchen kleiner und eleganter geht. Nun spielt Webspace nicht unbedingt mehr eine Rolle, aber müssen es wirklich so viele Dateien sein, die Dan Coulders Klasse auf die Platte spült, um ein paar Flickraufrufe zu tätigen? Die Flickr-API gibt uns gewaltige Möglichkeiten, aber für Webpräsenzen reicht eine Handvoll von Methoden.

PHP5 ist immer mehr verbreitet, so dass es naheliegend ist, nach einr entsprechenden Klasse zu spähen. Erstaunlicherweise gibt es aber recht wenig. Flickr selbst verweist nur auf Phlickr, welches aber auch alles andere als simpel ist. Glücklicherweise hat Rasmus Lerdorf am 01.September 2005 mal etwas geschrieben.

Rasmus versteht (verständlicherweise) einiges von PHP. In der über über 3 Jahre alten Klasse (!) gelingt es ihm die wesentliche Funktionalität bereitzustellen. Der Aufbau der Sockets erfolgt über das verbreitete Curl.

Die Flickr-API hat sich verändert, es sind Methoden dazugekommen, die es 2005 noch nicht gab. Prinzipiell ist die Klasse aber auch in der bestehenden Form gut verwendbar. Für meine eigene Verwendung habe ich aber die Funktion photoSearch ein bißchen erweitert:

// add new features 11/08 and use practical defaults
function photosSearch
($user_id='',$tags='',$tag_mode='',$text='',$min_upload_date='',
$max_upload_date='',$min_taken_date='',$max_taken_date='',
$license='',$sort='',$privacy_filter='',$bbox='', $accuracy='',
$safe_search='',$content_type='', $machine_tags='', $machine_tag_mode='',
$group_id='', $contacts='', $woe_id='', $place_id='', $media='', $has_geo='1',
$geo_context='', $lat='', $lon='', $radius='', $radius_units='', $extras='',
         $per_page='20',$page='') {
    if(is_array($user_id)) $params = $user_id;
    else {
     $params = array();
     if($user_id) $params['user_id'] = $user_id;
     if($tags) $params['tags'] = $tags;
     if($tag_mode) $params['tag_mode'] = $tag_mode;
     if($text) $params['text'] = $text;
     if($min_upload_date) $params['min_upload_date'] = $min_upload_date;
     if($max_upload_date) $params['max_upload_date'] = $max_upload_date;
     if($min_taken_date) $params['min_taken_date'] = $min_taken_date;
     if($max_taken_date) $params['max_taken_date'] = $max_taken_date;
     if($license) $params['license'] = $license;
     if($sort) $params['sort'] = $sort;
     if($privacy_filter) $params['privacy_filter'] = $privacy_filter;
     if($bbox) $params['bbox'] = $bbox;
     if($accuracy)     $params['accuracy'] = $accuracy;
     if($safe_search) $params['safe_search'] = $safe_search;
     if($content_type) $params['content_type'] = $content_type;
     if($machine_tags) $params['machine_tags'] = $machine_tags;
     if($machine_tag_mode) $params['machine_tag_mode'] = $machine_tag_mode;
     if($group_id)     $params['group_id'] = $group_id;
     if($contacts) $params['contacts'] = $contacts;
     if($woe_id) $params['woe_id'] = $woe_id;
     if($place_id) $params['place_id'] = $place_id;
     if($media) $params['media'] = $media;
     if($has_geo) $params['has_geo'] = $has_geo;
     if($geo_context)$params['geo_context'] = $geo_context;
     if($lat) $params['lat'] = $lat;
     if($lon) $params['lon'] = $lon;
     if($radius) $params['radius'] = $radius;
     if($radius_units) $params['radius_units'] = $radius_units;
     if($extras) $params['extras'] = $extras;
     if($per_page) $params['per_page'] = $per_page;
     if($page) $params['page'] = $page;
    
    }

Mit etwas mehr Fleißkönnte man auf diese Weise alle neuen Methoden abbilden. Hier noch ein kleines Anwendungsbeispiel, welches aber nicht die neuen Methoden nutzt:

<!DOCTYPE html 
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Flickrtest mit Klasse!</title>

</head>
<body>
<h2>Flickrbeispiel mit der Klasse von Rasmus Lerdorf</h2>

<?php
require_once("includes/clsFlickr_Api.php");
$secrets = array('api_key'=>'0815','api_secret'=>'pixelfans');
$flickr = new Flickr($secrets);
$photos = $flickr->photosSearch(null, 'Pixelfans');
foreach($photos['photos'] as $photo) {
$nsid = $photo['owner'];
$title = $photo['title'];
$url = $flickr->getPhotoURL($photo);
$owner = $flickr->peopleGetInfo($nsid);
if (!$owner['realname'])
$owner = $owner['username'];
else
$owner = $owner['realname'];
$in = array('ö','ü','ä','ß','"');
$out = array('&ouml;','&uuml;','&auml;','&szlig;','');
$title = str_replace($in,$out , "$title");
echo "<img style=\"height:75px;width:75px\" alt\"Bild vom Pixelfan aus Flickr\" src=\"".$url."\" title=\"".$title." &copy ".$owner."\" />\n";
         }
?>
</body>
</html>

Elegant und einfach, aber da REST immer verbreiteter wird und man auf einer Webpräsenz unterschiedliche API's aufrufen will, bietet es sich an, auf eine allgemeine REST-Parser-Klasse zu setzen.

Kategorie: PHP | Kommentare (0) | Permalink

13 Jan 2009

Flickr mit PHP in eigener Website verwenden (Teil 2)

geschrieben von Pawel

Es gibt wenige Webseiten, die nicht in der einen oder anderen Weise Googlemaps verwenden. Kann man auf Satellitenaufnahmen verzichten, so können Open Street Maps durchaus ein Alternative sein.

Als gelegentlicher ix-Leser habe ich mir Anfang 2007 ein Sammelheft über das Web2.0 gekauft, der auch einen Artikel von Ramon Wartala über Flickr-Googlemaps-Masup enthielt. Der Artikel ist noch immer kostenpflichtig. Ähnlichen Beispielcode enthält aber auch ein Text der FH Wedel.

Als ich die Beispiele Mitte 2008 ausprobieren wollte, funktionierten sie nicht. Man muss im Web 2.0 immer mit Änderungen rechnen. Zum Erstellungszeitpunkt der Artikel wurden die Geokoordinaten noch direkt in den Tags gespeichert. Jetzt werden diese nicht nur in der Datenbank direkt gespeichert, sondern können auch komfortabel hinzugefügt werden. Das erleichtert sogar die Anwendung. Ein paar Sitzungen mit dem Flickrexplorer waren aber schon noch nötig.

Google bietet eine API für Googlemaps an, die auf Javascript beruht. Erforderlich ist ein kostenloser Key, der immer für eine Domain gültig ist. Es lohnt sich auf jeden Fall, direkt in Javascript zu programmieren, zumal die API auch gut dokumentiert ist. Es gibt aber auch PHP-Klassenbibliotheken, die einem die Arbeit ein wenig erleichtern. Da in den oben genannten Beispielen phoogle verwendet wurde, nutzen wir die GoogleMapAPI. Diese verwendet auch die API 2.

<?php 
// phpFlickr einbinden
require_once(“includes/phpFlickr.php”);
// GoogleMapsAPI einbinden
require_once (“includes/GoogleMapAPI.class.php”);
// neue Instanz der flickr-API erzeugen
$f = new phpFlickr(“pawelisindahouse”);
$f->enableCache(“fs”, “cache”);
// neue Instanz der Google Maps erzeugen
$map = new GoogleMapAPI(‘map’);
$map->setAPIKey(“pixelfanssindklasse”);
$map->setWidth(‘100%‘);
$map->setHeight(‘600px’);
$map->setMapType(‘satellite’);
$map->disableSidebar();
$map->disableDirections();
$map->setMarkerIcon(‘/images/blue.png’,‘/images/shadow.png’,0,0,10,10);

Der Anfang ist schnell erklärt, die Klassen werden eingebunden und instanziert. Höhe und Breite kann man mitsetzen und auch wie die Karte angezeigt wird. Standardmäßig wird eine Sidebar verwendet, die wir aber ebensowenig wie die Richtungssuche benötigen. Wir verwenden ein eigenes Icon.

// welcher Nutzer?
$username = “pawelfritsch”;
$user = $f->people_findByUsername($username);
$nsid = $user[‘nsid’];
// Hole alle Fotos des Nutzers mit Tags Halle-Neustadt und Koordinaten
$geo_photos = $f->photos_search(array(“tags”=>“Halle-Neustadt”,“user_id”=>$nsid, “has_geo”=>“1”));

Jetzt wird der Nutzername ermittelt. Wer seinen eigenen Namen verwendet, kann auch gleich die Nutzer-Id verewenden.Mit der Methode photo_search werden nun alle Bilder die mit Halle-Neustadt getagged, Geokoordinaten enthalten und von mir sind gesucht (und gefunden).

foreach ($geo_photos[‘photo’] as $photo) 
{
$something = $f->photos_geo_getLocation($photo[id]);
$location = $something['location'];
// Erzeuge eine Pin-Notiz mit Bild und dem Titel des Fotos
$note = $photo[title]."<br /><img border='0' alt='$photo[title]' src=". $f->buildPhotoURL($photo, "Square") . " />";
$lat = $location['latitude'];
$lon = $location['longitude'];
// Erzeuge einen geografischen Pin
$map->addMarkerByCoords($lon,$lat,$photo[title],$note,"Klicken, um das Bild anzuzeigen");
}
?>

Die Methode photos_geo_getLocation gab es 2006 noch nicht. Damit stehen die Koordinaten jetzt ganz bequem zur Verfügung.Nun folgt noch ein bißchen HTML.

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” 
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=“http://www.w3.org/1999/xhtml”>
<head>
<?php $map->printHeaderJS(); ?>
<?php $map->printMapJS(); ?>
</head>
<body onload=“onLoad()“>
<h2>Beispiel Mashup mit <a
href=“http://phpinsider.com/php/code/GoogleMapAPI/“>GoogleMapApi</a>
und <a href=“http://www.phpflickr.com/“>phpFlickr</a></h2>
<?php $map->printMap();?>
</body>
</html>

Das generierte Javascript wird an den entsprechenden Stellen im <head> und <body> ausgegeben und fertig ist das Mashup.

Studenten der Universität Jena haben das natürlich noch ein bisschen eindrucksvoller hinbekommen.

Kategorie: PHP | Kommentare (0) | Permalink