Baue dein eigenes soziales Zuhause!

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Viele von uns haben viele „Zuhause“ im Internet. Persönlich nutze ich Twitter, Flickr, ScrnShots und Facebook. Diese Webdienste sind cool genug, um Wege zur Interaktion mit ihnen anzubieten und Daten von ihnen abzurufen, ohne die Seite selbst unbedingt besuchen zu müssen. Das nennt man eine API (oder Application Programming Interface).

Demo anzeigen   Dateien herunterladen

Update November 2011 – ScrnShots wird eingestellt. Ich habe diese Demo vereinfacht, jQuery aktualisiert und ScrnShots durch Dribbble ersetzt. Ich habe es auch auf GitHub gelegt, falls jemand etwas hinzufügen möchte. Das untenstehende Tutorial ist meiner Meinung nach immer noch gut.
Update Januar 2013 – Aktualisiert zur Behebung der Twitter API.
Update Juli 2013 – Der untenstehende Code funktioniert mit der Twitter API-Aktualisierung auf 1.1 vom 11.06.2013 nicht mehr wie vorgesehen. Die 1.1 API erfordert OAuth, was eine serverseitige Komponente benötigt. Hier ist ein PHP-Weg, um mit der neuen API zu interagieren. Wenn ich Zeit habe, werde ich diese Demo aktualisieren.
Update Juli 2014 – Hier ist ein JavaScript-Weg, wenn auch etwas umständlich.

Man kann sich eine API wie einen RSS-Feed vorstellen. Wenn Sie CSS-Tricks über einen Feed-Reader wie Google Reader lesen, wissen Sie, dass Sie die Seite nicht einmal besuchen müssen, um meine Inhalte zu lesen, da diese Daten auf andere Weise bereitgestellt werden. Im Fall von RSS handelt es sich um eine XML-Datei, die auf sehr spezifische Weise formatiert ist. APIs werden oft als XML bereitgestellt, formatiert so, wie die jeweilige Anwendung sie für Sie am nützlichsten hält. XML ist cool, aber ähnlich wie HTML muss es geparst werden, bevor man wirklich etwas damit anfangen kann. Hier kommt JSON.

JSON (JavaScript Object Notation) ist das, was alle angesagten Anwendungen heutzutage mit ihren APIs als Alternative zu XML anbieten. Das Coole an JSON ist, dass man es nicht auf die gleiche Weise parsen muss wie XML. Die Daten, die Sie von einem JSON-Aufruf erhalten, kommen als Objekt zurück, das sofort einsatzbereit ist und es Ihnen ermöglicht, damit zu arbeiten. Hinweis: Wenn das eine sehr falsche oder schlechte Erklärung war, korrigieren Sie mich gerne.

APIs verwenden (jQuery und JSON)

jQuery bietet eine denkbar einfache Möglichkeit, diese JSON-Objekte abzurufen.

$.getJSON('http://url-to-api.com', function(data){
  $.each(data, function(index, item){
    // do stuff with each item
  });
});

Der obige Code greift auf die angegebene URL zu (Sie müssen diese natürlich durch eine echte URL einer echten API ersetzen, die echtes JSON ausgibt) und durchläuft dann jedes „Element“ und gibt Ihnen die Möglichkeit, etwas mit diesem Element zu tun. Ich sage „Element“, denn obwohl dies ein gebräuchlicher Name ist, den APIs verwenden, ist es nicht immer der Fall, und Sie müssen hier spezifisch und genau sein, da JSON nur sehr wenig Fehlerbehandlung bietet.

Inhalte auf Ihre Seite einfügen

Ein weiterer Grund, hier jQuery zu verwenden, ist, wie einfach es damit ist, HTML dynamisch auf der Seite einzufügen. Schauen wir uns das Codebeispiel an, um die neuesten „Tweets“ von Twitter abzurufen und dann die integrierte jQuery-Funktion append() zu verwenden, um sie auf der Seite anzuzeigen.

$.getJSON('https://api.twitter.com/1/statuses/user_timeline/chriscoyier.json?count=10&include_rts=1&callback=?', function(data){
	$.each(data, function(index, item){
		$('#twitter').append('<div class="tweet"><p>' + item.text + '</p><p>' + item.created_at + '</p></div>');
	});
});

Dadurch wird für jedes „Element“ im Objekt ein neuer Div mit der Klasse „tweet“ auf der Seite eingefügt (innerhalb des übergeordneten Div mit der ID „twitter“). Beachten Sie die Variable „count“ in der von Twitter bereitgestellten URL. Sie ist auf 10 eingestellt, was 10 Elemente zurückgibt, sodass 10 Divs auf der Seite vorhanden sein werden. Innerhalb dieser Divs befinden sich zwei Absatzelemente. Eines mit „item.text“ und eines mit „item.created_at“. Dies sind der eigentliche Text meines letzten Tweets und der Zeitpunkt seiner Einreichung.

Beispiel für resultierendes HTML aus einem Element

<div class="tweet">
  <p>I wish position: relative; worked for table cells =P</p>
  <p>1 day ago</p>
</div>

Das ist doch schon besser! Wir können unsere CSS-Kenntnisse nutzen, um das beliebig zu gestalten. Vielleicht so?

.tweet { 
   padding: 10px; 
   margin: 5px 0; 
   background: url(images/transpOrange25.png);
}

Die Idee erweitern

Lassen Sie uns drei Divs auf unserer Seite erstellen, einen für Flickr, einen für Twitter und einen für ScrnShots. Dann werden wir unsere jQuery + JSON-Technik verwenden, um sie zu füllen.

Basis-HTML

<body>
	<div id="page-wrap">

		<div id="flickr">
			<h1>Flickr Photos</h1>
		</div>
		
		<div id="twitter">
			<h1>Twitter Updates</h1>
		</div>
		
		<div id="scrnshots">
			<h1>Latest ScrnShots</h1>
		</div>
	
	</div>
</body>

Nun hier ist das jQuery, um alle Daten von allen drei Diensten abzurufen und anzuhängen.

<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){

	$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?ids=52723107@N00&lang=en-us&format=json&jsoncallback=?", function(data){
	  $.each(data.items, function(index, item){
		$("<img/>").attr("src", item.media.m).appendTo("#flickr")
		  .wrap("<a href='" + item.link + "'></a>");
	  });
	});
	
	$.getJSON('http://twitter.com/status/user_timeline/chriscoyier.json?count=10&callback=?', function(data){
		$.each(data, function(index, item){
			$('#twitter').append('<div class="tweet"><p>' + item.text.linkify() + '</p><p>' + relative_time(item.created_at) + '</p></div>');
		});
	
	});
	
	$.getJSON("http://www.scrnshots.com/users/chriscoyier/screenshots.json?callback=?", function(screenshots){
		$.each(screenshots, function(index, screenshot){
			$("#scrnshots").append("<a href='" + screenshot.url + "'><img src='" + screenshot.images.small + "' /></a>");
		});
	});

});
</script>

 

Twitter bereinigen

Zwei kleine Probleme mit den „rohen“ Daten, die die Twitter API ausgibt.

  • Links kommen „tot“ an. Die vollständige URL ist da, aber es ist nur Text, kein echter Ankerlink.
  • Das Datum kommt als hässlicher Zeitstempel an, kein schön lesbarer Text wie „vor 2 Tagen“.

Zwei kleine JavaScript-Funktionen, die ich ausgegraben habe, um diese Probleme zu lösen.

Linkify

String.prototype.linkify = function() {
  return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
    return m.link(m);
  });
};

relative_time

function relative_time(time_value) {
  var values = time_value.split(" ");
  time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  delta = delta + (relative_to.getTimezoneOffset() * 60);
  
  var r = '';
  if (delta < 60) {
	r = 'a minute ago';
  } else if(delta < 120) {
	r = 'couple of minutes ago';
  } else if(delta < (45*60)) {
	r = (parseInt(delta / 60)).toString() + ' minutes ago';
  } else if(delta < (90*60)) {
	r = 'an hour ago';
  } else if(delta < (24*60*60)) {
	r = '' + (parseInt(delta / 3600)).toString() + ' hours ago';
  } else if(delta < (48*60*60)) {
	r = '1 day ago';
  } else {
	r = (parseInt(delta / 86400)).toString() + ' days ago';
  }

Anstatt also nur „item.text“ in Ihre append-Anweisung einzufügen, können Sie „item.text.linkify()“ verwenden. Anstatt „item.created_at“ einzufügen, können Sie „relative_time(item.created_at)“ verwenden.

Danksagung

Funktionen für „linkify“ und „relative_time“ von Ralph Whitbeck.

Danke an Greg Bell, der die ScrnShots API für mich fit gemacht hat!

Demo anzeigen   Dateien herunterladen