构建你自己的社交主页!

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为你旅程的每个阶段提供云产品。立即开始使用 $200 免费信用额度!

我们中的许多人都在互联网上有许多“家”。我个人使用 Twitter、Flickr、ScrnShots 和 Facebook。这些网络服务足够酷,可以提供与它们交互并从中提取数据的方法,甚至不必访问网站本身。这被称为 API(或应用程序编程接口)。

查看演示   下载文件

2011年11月更新 – ScrnShots 即将关闭。我简化了这个演示,将 jQuery 更新到最新版本,并将 ScrnShots 替换为 Dribbble。我也 将其放到 GitHub 上,如果你想添加更多内容。我认为下面的教程仍然很好。
2013年1月更新 – 更新以修复 Twitter API。
2013年7月更新 – 由于 Twitter API 更新至 1.1 自 2013年6月11日起,以下代码不再按原样工作。 1.1 API 需要 oAuth,这需要服务器端组件。 这是一个使用 PHP 的方法 与新 API 交互。如果我有时间,我会更新此演示。
2014年7月更新 – 这是一个 使用 JavaScript 的方法,虽然有点 hacky。

你可以将 API 想象成类似于 RSS Feed。如果你通过像 Google Reader 这样的 Feed 阅读器阅读 CSS-Tricks,你会知道你甚至不需要访问该网站就可以阅读我的内容,因为这些数据正在通过另一种方式提供。在 RSS 的情况下,它是一个以非常特定方式格式化的 XML 文件。API 通常以 XML 格式提供,格式取决于特定应用程序认为对你最有用的方式。XML 很酷,但就像 HTML 一样,它需要在你可以真正使用它之前进行解析。JSON 就出现了。

JSON(JavaScript 对象表示法)是如今所有流行应用程序与其 API 一起提供的,作为 XML 的替代方案。JSON 的酷点在于你不需要像解析 XML 一样解析它。你从 JSON 调用获得的数据作为对象返回,它已经准备好让你使用它。注意:如果这个解释不准确或不好,请随时更正我。

使用 API(jQuery 和 JSON)

jQuery 提供了一种非常简单的方法来检索这些 JSON 对象

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

上面的代码访问了提供的 URL(你需要将它替换为指向真实 API 的真实 URL,该 API 当然会输出真实的 JSON),然后遍历每个“项”,并让你有机会对该项做一些操作。我说是“项”,因为虽然这是 API 使用的常见名称,但并不总是这样,你需要在这里具体准确,因为 JSON 在错误处理方面提供的帮助非常少。

将内容插入页面

另一个使用 jQuery 的原因是因为它如何使动态将 HTML 插入页面。让我们看看从 Twitter 抓取最近“推文”的代码示例,然后使用内置的 jQuery 函数 append() 将它们放到页面上。

$.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>');
	});
});

这将在页面上(在 ID 为“twitter”的父 div 内)放置一个新的 class 为“tweet”的 div,用于对象中的每个“项”。注意 URL 中的“count”变量,这是 Twitter 提供的。它设置为 10,这将返回 10 个项,因此页面上将有 10 个 div。在这些 div 内,我们有两个段落元素。一个是“item.text”,另一个是“item.created_at”。它们将是我的最后一条推文的实际文本以及我提交它的时间。

一个项产生的 HTML 示例

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

现在看起来更像了!我们可以使用我们的 CSS 技能根据需要对其进行样式设置。也许是这样的

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

扩展想法

让我们在页面上创建三个 div,一个用于 Flickr,一个用于 Twitter,一个用于 ScrnShots。然后我们将使用 jQuery + JSON 技术来填充它们。

基础 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>

现在以下是用于拉取并追加来自所有三个服务的全部数据的 jQuery 代码

<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

Twitter API 吐出的“原始”数据有两个小问题。

  • 链接以“失效”形式出现。完整的 URL 在那里,但它只是文本,而不是真正的锚链接。
  • 日期以难看的毫秒时间戳形式出现,而不是像“2 天前”这样友好的可读文本。

我挖出了两个小 JavaScript 函数来解决这些问题。

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';
  }

所以现在,你不再只在 append 语句中放置“item.text”,而是可以放置“item.text.linkify()”。同样,你也不再放置“item.created_at”,而是可以放置“relative_time(item.created_at)”。

感谢

来自 Ralph Whitbeck 的“linkify”和“relative_time”函数。

感谢 Greg Bell 为我整理 ScrnShots API!

查看演示   下载文件