Facebook研究帖
Facebook商业模式分析(FROM http://markcgh123.bokee.com/viewdiary.25470209.html )创始人: Michael Arrington
公司:FaceBook
成立日期:2004年2月4日
资产结构:由 Peter Thiel and Accel合伙人共同成立
雇员:32个在帕拉阿图,4个在波士顿
总部:帕拉阿图
Facebook是一个社会化网络站点。它于2004年2月4日上线。
Facebook的创始人是Mark Zuckerberg,他是哈佛大学的学生,之前毕业于Asdsley高中。最初,网站的注册仅限于哈佛学院(译者注:哈佛大学的本科生部)的学生。在之后的两个月内,注册扩展到波士顿地区的其他高校(波士顿学院 Boston College、波士顿大学 Boston University、麻省理工学院 MIT、特福茨大学 Tufts)以及罗切斯特大学 Rochester、斯坦福 Stanford、纽约大学 NYU、西北大学和所有的长春藤名校。第二年,很多其他学校也被加入进来。最终,在全球范围内有一个大学后缀电子邮箱的人(如 .edu, .ac.uk等)都可以注册。之后,在Facebook中也可以建立起高中和公司的社会化网络。而从2006年9月11日起,任何用户输入有效电子邮件地址和自己的年龄段,即可加入。用户可以选择加入一个或多个网络,比如中学的、公司的、或地区的。
据2007年7月数据,Facebook在所有以服务于大学生为主要业务的网站中,拥有最多的用户:三千四百万活跃用户(包括在非大学网络中的用户)。从2006年9月到2007年9月间,该网站在全美网站中的排名由第60名上升至第7名。同时Facebook是美国排名第一的照片分享站点,每天上载八百五十万张照片。这甚至超过其他专门的照片分享站点,如Flickr。
网站的名字Facebook来自传统的纸质“花名册”。通常美国的大学和预科学校把这种印有学校社区所有成员的“花名册”发放给新来的学生和教职员工,帮助大家认识学校的其他成员。
运营状况
网站对用户是免费的,其收入来自广告。广告包括横幅广告和由商家赞助的小组(2006年4月,有消息称Facebook每周的收入超过一百五十万美元)。用户建立自己的档案页,其中包括照片和个人兴趣;用户之间可以进行公开或私下留言;用户还可以加入其他朋友的小组。用户详细的个人信息只有同一个社交网络(如学校或公司)的用户或被认证了的朋友才可以查看。据TechCrunch(译者:硅谷最著名的IT新闻博客。)报道,“在Facebook覆盖的所有学校中,85%的学生有Facebook档案;(所有这些加入Facebook的学生中)60%每天都登陆Facebook,85%至少每周登陆一次,93%至少每个月一次。”据Facebooke 发言人Chris Hughes说,“用户平均每天在Facebook上花19分钟。”据新泽西州一家专门进行大学市场调研的公司“学生监听”在2006年进行的调研显示, Facebook在“本科生认为最in的事”中
排名第二,仅次于苹果的iPod,和啤酒与性并列。
起步和发展
Mark Zuckerberg在Andrew McCollum和Eduardo Saverin的支持下,于2004年2月创办了“The Facebook”。当时他是哈佛大学的学生。月底的时候,半数以上的哈佛本科生已经成了注册用户。其时,Dustin Moskovitz和Chris Hughes加入进来,帮助网站的推广,将Facebook扩展到麻省理工学院、波士顿大学和波士顿学院。扩展一直持续到2004年4月,包括了所有长春藤院校和其他一些学校。之后的一个月,Zuckerberg,McCollum和Moskovitz搬到加利福尼亚州的Palo Alto市(译者:斯坦福大学所在地,硅谷的发源地),在Adam D\'Angelo和Sean Parker(译者:著名的第一代P2P音乐分享网站Napster的创始人)的帮助下继续Facebook的发展。同年9月,另一个社会化网络站点 ConnectU的合伙人Divya Narendra,Cameron Winklevoss和Tyler Winlevoss把Facebook告上法庭。他们称Zuckerberg非法使用了他们在让他帮助建站时开发的源代码。与此同时,Facebook获得了PayPal创始人Peter Thiel提供的约五十万美金的天使投资。到12月时,Facebook的用户数超过100万。
2005
2005年5月,Facebook获得Accel Partners的一千两百七十万美元风险投资。2005年8月23日,Facebook从AboutFace公司手中以20万美元购得 facebook.com域名,从此从名字中把The去掉了。网站当时进行了重大改进。据Zuckerberg称,目的是提高用户档案页面的用户友好性。在这个月,McCollum回哈佛大学继续学业,同时仍旧以顾问的身份继续为Facebook工作,并在暑假来公司工作。Hughes则继续在剑桥市(译者:哈佛大学所在地)履行他公司发言人的职责。2005年9月2日,Zuckerberg推出了Facebook高中版,并称这是最合乎逻辑的下一步。虽然最初,这被定位为需要邀请才能加入的社区,仅15天以后,大部分高中的网络不需要密码也可以加入了(虽然Facebook账户还是需要的)。到10月份,Facebook已经扩展到大部分美国和加拿大的规模更小的大学和学院。除此之外,还扩展到英国的21所大学、墨西哥的ITESM、波多黎各大学、及维京群岛大学。2005年12月11日,澳大利亚和新西兰的大学也加入了Facebook,至此,Facebook中共有超过2000所大学和高中。
2006
2006年2月27日,应用户要求,Facebook允许大学生把高中生加为他们的朋友。约一个月后,2006年3月28日,《新闻周刊》报道 Facebook可能被收购,谈判正在进行中。据报道,Facebook拒绝了一个七亿五千万美金的收购条件,甚至有传闻收购价格达到了20亿美金。同年四月,Peter Thiel、Greylock Partners和Meritech Capital Partners额外投资了两千五百万美元。5月,Facebook扩展到印度的印度理工学院和印度管理学院。6月,Facebook状告 Quizsender.com抄袭其设计风格,要求赔偿十万美元。7月25日,Facebook增加了更多提高收入机会的功能。和苹果iTunes的合作推广活动中,加入“苹果学生小组”的用户可以在9月10日之前每周下载25首单曲。这个推广活动的目的是让学生们在秋季学期开学前对苹果和 Facebook的服务都更熟悉和喜爱。8月,Facebook又加入了德国的大学和以色列的高中。8月22日,Facebook推出Facebook记事本功能--一个可以加标签、嵌入图片、评论的博客服务。同时用户可以从其他博客服务中导入。2006年9月11日,Facebook对所有互联网用户开放,这引起了很多现有用户的抗议。但两周后,Facebook注册仍旧对所有拥有有效电子邮件地址的人开放。
2007
2007年5月10日,Facebook宣布了一个提供免费分类广告的计划,直接和其他分类广告站点,如Craigslist竞争。这个被称为 “Facebook市场”的功能,于2007年5月14日上线。2007年5月24日,Facebook推出应用编程接口(API)。通过这个API,第三方软件开发者可以开发在Facebook网站运行的应用程序。这被称为Facebook开放平台(Facebook Platform)。同年6月,和iTunes的合作继续为用户
提供免费音乐单曲下载。7月,Facebook完成了第一次对其他公司的收购,从 Blake Ross和Joe Hewitt手中收购了Parakey(译者:Ross和Hewitt是火狐浏览器的作者,Parakey是一个被称为网络操作系统的平台)。7月24 日,Facebook聘用YouTube的前CFO Gideon Yu为CFO,替换了Michael Sheridan。8月,Facebook成为新闻周刊的封面故事。2007年9月25日,微软宣布他们可能会收购Facebook的部分股份。据称Facebook被完全收购可能性不大,因为其创始人Mark Zuckerberg希望保持独立。
网站功能
墙(The Wall)
墙就是用户档案页上的留言板。有权浏览某一个用户完整档案页的其他用户,都可以看到该用户的墙。用户墙上的留言还会用Feed输出。很多用户通过他们朋友的墙,留短信儿。更私秘的交流则通过“消息(Messages)”进行。消息发送到用户的个人信箱,就象电子邮件,只有收信人和发信人可以看到。2007年7月起,用户可以在墙上贴附件。之前,只允许文本内容。
礼物(Gift)
2007年2月,Facebook新增了“礼物”功能。朋友们可以互送“礼物”--一些由前苹果设计师Susan Kare设计的有趣的小图标。礼物从Facebook的虚拟礼品店选择,赠送时附上一条消息。收到的礼物以及所附的消息会显示在收礼者的“墙”上,除非送礼者设定这个礼物是私秘的。另外,在墙的上方还有一个“礼盒”。用户收到的所有礼物都在礼盒中。公开的礼物显示送礼者的名字,私秘的礼物则显示“私人”。另有一个“匿名”的选项。虽然所有人都可以看到礼物,但只有收礼者可以看到送礼者的名字和消息。这种礼物只在礼盒中,而不在墙上显示。Facebook用户注册时免费获得一个礼物。以后的每个礼物一美元。最初推出时的礼物是有关“情人节”的。同年2月由此产生收入的50%捐献给 Susan G. Komen乳腺癌基金会。之后,Facebook每天推出一款新礼物,大多数都是限量版,或只是限期供应。用户个人主页会显示每日礼物的广告。随着 Facebook开放平台应用程序的出现,第三方开发的应用程序对1美元购买礼物的模式构成威胁。请注意,Zachary Allia(译者:一个第三方程序开发员)开发的“免费礼物”,与Facebook的官方礼物是不同的。
市场(Marketplace)
2007年5月,Facebook推出Facebook 市场。用户可以免费发布下列分类广告:卖二手货、租房、工作,等。供求两方均可发布。所有Facebook用户都可以使用这个功能。目前是免费的。
捅(Pokes)
Facebook提供一个“捅(Poke)”别的用户的功能,让用户可以给别人发送一个“Poke”。Facebook常见问题中这样解释: “Poke是你和朋友互动的一种方式。当我们设计这个功能时,我们觉得提供这么一个什么意思也没有的功能其时挺酷。用户们给Poke不同的解释。我们鼓励你给它你自己的解释。”实际上这个功能的目的只是让用户能引起别的用户的注意。尽管很多用户确实用这个功能来引起别的用户注意,或说声“嘿”,但有些用户仍把它理解为“性”的意味。这个解释造成了一个很热门的Facebook小组的产生--“Poke”够了,咱们干脆做爱吧。到2007年9月,这个小组共有二十五万用户。有时朋友之间会进行一种被称为“Poke仗”的游戏--两个用户间用“Poke回”功能,互相Poke来、Poke去。另有一些衍生出来的新功能,如“X 我”,和“超级Poke”,让用户可以把Poke替换成任何动作。
状态(Status)
状态,让用户向他们的朋友和Facebook社区显示他们现在在哪里、做什么。Facebook让用户填入状态的提示是“(某某用户)正在。。。”,用户填入剩下的部分。在用户好友列表的“新近更新”区,显示这些状态。活动(Events)Facebook活动的功能帮助用户通知朋友们将发生的活动,帮助用户组织线下的社交活动。
开放平台上的应用(Application)
2007年5月24日,Facebook推出Facebook 开放平台。利用这个框架,第三方软件开发者可以开发与Facebook核心功能集成的应用程序。最流行的应用程序包括:
顶级朋友:用户可以选择和显示他们最好的朋友
涂鸦板:一个图形效果的“墙”
我喜欢:一个社会化音乐发现和分享服务,包括音乐会信息和有关音乐知识的小游戏, 甚至有象棋、拼字游戏之类的游戏出现。而第三方网站如进行Facebook应用数据统计的Adonomics,相关博客如AppRate、Inside Facebook、Face Reviews等等或应运而生或对Facebook应用青睐有加。2007年7月4日,Altura 风投宣布“Altura 1 Facebook投资基金”,成为第一个只投资Facebook相关项目的风险投资。2007年7月10日,Bay Partners宣布成立“应用工厂(AppFactory)”,一个只投资Facebook应用的种子基金。2007年8月29日,Facebook改变了他们对应用程序热度的衡量标准,更倾斜于那些有深度价值的应用。因为之前,衡量标准仅以用户数为标准,使得那些高度“病毒传播”(译者:指极易于在用户间口口相传)但没什么用处的程序排名很高。著名IT博客Valleywag曾批评 Facebook 应用是“一大堆垃圾”。截止2007年9月26日,共有超过4500个Facebook应用出现。
Facebook标识语言(Facebook Markup Language)
Facebook 标识语言是HTML的子集。Facebook应用的开发者可以用这种语言定制他们的应用程序的外观。Facebook视频与Facebook开放平台同时推出的,还有一个Facebook自己开发的应用程序--视频分享。用户可以上传视频、通过 “Facebook移动”上传手机视频,以及用摄像头录像。同时用户可以给视频中的朋友加“标
签”。这一功能被认为会与MySpace的相关功能竞争。但 Facebook的视频只能在Facebook网络内观看。然而,一段发表在Userscripts.org上的Greasemonkey代码让用户可以下载Facebook视频或将之转贴在其他网站。
Facebook的域模型
附图,用UML类图的形式,显示了Facebook系统所管理的信息。它提炼出了Facebook数据库中的实体、关系、字段。比如,图中显示了有关工作、学校、信用卡、显示用户名等的字段。(黄色方框代表类)请注意该图为概念类图,而不是具体实施的细节。如欲了解更多数据模型的细节,请参考Facebook查询语言(FQL)--一种类似SQL的查询语言的相关资料。
技术构架
Facebook使用LAMP(Linux、 Apache、 MySQL、 PHP)作为技术构架。Facebook的一个技术构架工程师Steven Grimm在博客中写到:几乎我们所有的服务器都运行开源软件。我们的Web服务器是Linux,Apache和PHP。我们数据库是MySQL
。我们使用memchached来保证网站的快速反应。一些后台应用Python、Perl和Java,以及一些gcc和Boost。程序员用 Subversion和git来进行代码管理。还有很多--象很多网站一样,从头到脚都是开源软件。
收购传闻
2006年随着MySpace被新闻集团收购,关于Facebook会被一家大的媒体公司收购的传闻出现。Facebook的创始人Zuckerberg说过他不想出售公司,并否认了这些传闻。他已经拒绝了九亿七千五百万美元左右的收购价格,不知还有谁愿意出高出这个的价格收购 Facebook。分析师Steve Rosenbush猜测是维亚康姆(Viacom)。2006年9月,Facebook和Yahoo开始进行关于收购的认真谈判,价格约10亿美元。同年 10月,随着Google以16亿美元收购YouTube,有传闻说Google开价23亿美元欲从Yahoo手中抢购Facebook。 Facebook的董事Peter Thiel暗示,根据2015年10亿美元收入的估计,Facebook内部的估值是80亿美元。这一估值依据对与Facebook用户构成类似的维亚康姆的MTV品牌的估值。2007年9月,微软向Facebook示好,欲以3-5亿美元投资该公司5%的股份。(译者:这使得Facebook的估值在60-100亿美元左右)其他公司,如Google也表示过类似兴趣。
facebook的网址是www.facebook.com。任何人都可以加入,但是全英文操作。注册只需要一个email。facebook的用户不只是大学生,也有很多中学生和小学生,而且facebook上不仅有美国人,也有来自各个国家的,比如加拿大,中国,挪威,英国,等等。
你可以通过这个链接引用该篇文章:http://markcgh123.bokee.com/viewdiary.25470209.html
[ 本帖最后由 coredump 于 30-12-2010 23:00 编辑 ]
手把手教你开发Facebook 应用
FROM:http://article.yeeyan.org/view/fren/3299目录[*]引言[*]创建“Hello World”程序[*]在用户信息栏中使用FBML(FaceBook标记语言)[*]在用户信息栏中使用mock-AJAX技术[*]使用Mysql数据库创建计数器[*]将这些例子代码集合到一起[*]相关下载引言
这个教程指导我们如何创建一个名为“tutorialapp”的应用,当你创建自己的程序的时候,它可以作为一个模板。使用这个教程需要你有一个支持php5的web服务器。
最新版本的“tutorialapp”可以在这里(http://tperry256.dreamhost.com/f8/tutorialapp/)找到。访问这个连接的时候,系统会要求你登录到facebook,并且增加“tutorialapp”程序。在很多公司像这样访问服务一个月只需要花费几美元而已。
当你创建了自己的应用,你会使用一个不同的名称和不同的服务器。我们把那些会使你的应用与众不同的地方用这种颜色高亮显示。
创建“hello World”程序
[*]访问:http://developers.facebook.com/[*]点击“Get Started”[*]点击“Add Facebook Developer Application”[*]一个到“Developer”的链接将显示在Facebook的左边导航栏,进入应用开发[*]点击“Setup new Application”按钮[*]下面是一些表单的填写步骤[*]Application Name:在本文中,我们填写“Tutorial Application”--对于你自己的应用,你要填写自己不同的名称。[*]点击“Terms of service”[*]点击“Optional Fields”链接,来进行更详细的配置[*]Support E-mail:你在Facebook的注册Email会自动填入,但可能你并不希望自己的个人Email被所有使用你应用的人知道,所以也可以填写一个你可以使用的其他Email。[*]CallBack Url:在本文中,我们填写“'http://tperry256.dreamhost.com/f8/tutorialapp/”。你应该填入不同的URL,通常情况下,你要填写你自己服务器上运行这个应用的目录的URL。[*]Canvas Page URL:http://apps.facebook.com/:在本文中,我们填写“tutorialapp”--你必须为自己的应用填写一个不同的名称。[*]Use FBML:保持默认设置即可。[*]Application Type:保持此处设置为:“website”[*]Can your application be added to Facebook:设置“yes”,然后进行详细设置[*]TOS URL:留空即可。[*]Post-Add Url:在本文中,我们填写“'http://apps.facebook.com/tutorialapp/”,对于你自己的应用,一般你应该填写自己一个不同的面板页的完整路径。[*]Default FBML:输入“hello”[*]其他的设置按照安装默认即可。[*]Side Nav Url:在本文中,我们填写“http://apps.facebook.com/tutorialapp”,对于你自己的应用,也应该填写自己不同面板页的完整路径。[*]其他设置使用默认即可。点击“Submit”按钮提交。 进入“My Application”页面,检查刚才的应用是否已经创建。 拷贝php5最新版的客户端库文件到你的服务器端应用程序的目录。 在后面的“相关下载”中有库文件的一些下载地址。如果你使用一个类UNIX 的shell,并且当前位于应用程序的目录,那么可以运行下面的命令:
wget http://developers.facebook.com/clientlibs/facebook-platform.tar.gz
tar zxvf facebook-platform.tar.gz
cp facebook-platform/client/facebook.php .
cp facebook-platform/client/facebookapi_php5_restlib.php .
rm -rf facebook-platform.tar.gz facebook-platform11. 建立一个“appinclude.php”文件,该文件要被你的应用的所有php文件在头部包含。将如下代码粘贴到文件中:
<?phprequire_once 'facebook.php';$appapikey = '
';$appsecret = '
';$facebook = new Facebook($appapikey, $appsecret);$user = $facebook->require_login();//$appcallbackurl = '
';//catch the exception that gets thrown if the cookie has an invalid session_key in ittry {if (!$facebook->api_client->users_isAppAdded()) { $facebook->redirect($facebook->get_add_url());}} catch (Exception $ex) {//this will clear cookies for your application and redirect them to a login prompt$facebook->set_user(null, null);$facebook->redirect($appcallbackurl);}12. 将其中的“app_key”和“secret”替换成你自己的。他们将显示在应用开发网站的的“My Applications”页面中,你同时要将我们的“call back URL”换成你自己的。
13.创建一个“index.php”文件,它将是你的应用的主页面,将如下代码粘贴进去:
<?phprequire_once 'appinclude.php';echo "<p>hello $user</p>"$$14. 在浏览器中输入你创建的应用的回调地址,你也可以输入面板页的路径,都会访问到“index.php”这个主页。总之,不管哪种方式,都是要在你的浏览器中输入地址 :-)
这是我们这个应用的回调地址:http://tperry256.dreamhost.com/f8/tutorialapp/
这是我们这个应用的面板页地址:http://apps.facebook.com/tutorialapp/
15. 点击“I agree”接受你的应用的服务条款,然后点击“Add [你的应用的名称]”。
16. 接着系统会自动转向到面板页,其中包含了“index.php”的运行的输出结果。
17. 在这个应用中,进入你的用户信息栏中,你会发现“hello”字符,这个是你在前面设置的默认FBML。
18. 最后,从左边的导航栏可以返回到面板页。
在个人信息栏中使用FBML
[*]下面是“index.php”的一个扩展版本,它可以将用户在表单中填写的字符串显示在用户的信息栏中[*]注意:提交空字符串会导致用户信息栏的无法显示!
<?phprequire_once 'appinclude.php';echo "<p>hello $user</p>"$$if (isset($_REQUEST['profiletext'])) {$facebook->api_client->profile_setFBML($_REQUEST['profiletext'], $user);$facebook->redirect($facebook->get_facebook_url() . '/profile.php');}echo '<form action="" method="get">';echo '<input name="profiletext" type="text" size="30" value=""><br>';echo '<input name="submit" type="submit" value="Display text on profile">';echo '</form>';在用户信息栏中使用mock-AjAX技术
[*]下面的代码使用FBML的mock-AJAX技术在用户信息栏中增加一个表单,会给用户一种信息栏被动态更新的假象。[*]注意“index.php”文件的最上面对mock-AJAX进行调用的if语句。
<?phpif (isset($_REQUEST['mockfbmltext'])) {echo $_REQUEST['mockfbmltext'];exit;}require_once 'appinclude.php';echo "<p>hello $user</p>"$$$fbml = <<<EndHereDoc<fb:subtitle>This is the subtitle</fb:subtitle><form><input name="mockfbmltext" type="text" size="30"><br /><input type="submit"clickrewriteurl="$appcallbackurl"clickrewriteid="preview" value="Draw text below"/><br /><div id="preview" style="border-style: solid; border-color: black;border-width: 1px; padding: 5px;"></div></form>EndHereDoc;$facebook->api_client->profile_setFBML($fbml, $user);echo "<p>the following form was added to the profile box:</p>"$$echo $fbml;
使用Mysql数据库创建计数器
[*]这个例子需要你在服务器上创建一个php脚本可以访问的数据库。[*]如果你没有数据库,就新建一个。[*]在这个数据库中新建一个名为“counter”的数据表,表中有一个名为“count”的integer类型的列。[*]创建一个新文件名为“dbappinclude.php”,将下面的代码粘贴进去,别忘了替换你自己的数据库地址,用户,密码和数据库名称。
<?phprequire_once 'appinclude.php';$dbhost = '
';$dbuser = '
';$dbpass = '
';$dbname = '
';$conn = mysql_connect($dbhost, $dbuser, $dbpass);mysql_select_db($dbname, $conn);function query($q) {global $conn;$result = mysql_query($q, $conn);if (!$result) { die("Invalid query -- $q -- " . mysql_error());}return $result;} 5. 现在在浏览器中访问下面这个新版本的“index.php”,主页将显示一个计数器,并且没访问一次“index.php”,计数器就会更新一次。
<?php
require_once 'dbappinclude.php';
echo "<p>hello $user</p>"$$
$rs = query("select count from counter");
if ($row = mysql_fetch_assoc($rs)) {
$count = $row['count'];
query("update counter set count=count+1");
} else {
query("insert into counter values (1)");
$count = 1;
}
echo "<p>the count is $count</p>"$$
将这些例子代码集合到一起
[*]这里是一个最终版本的“index.php”,将上面的例子集合到了一起,假定你已经在前一个例子中创建了“dbappinclude.php”
<?phpif (isset($_REQUEST['mockfbmltext'])) {echo $_REQUEST['mockfbmltext'];exit;}require_once 'dbappinclude.php';echo "<p>hello $user</p>"$$$rs = query("select count from counter");if ($row = mysql_fetch_assoc($rs)) {$count = $row['count'];query("update counter set count=count+1");} else {query("insert into counter values (1)");$count = 1;}echo "<p>the count is $count</p>"$$if (isset($_REQUEST['profiletext'])) {$facebook->api_client->profile_setFBML($_REQUEST['profiletext'], $user);$facebook->redirect($facebook->get_facebook_url() . '/profile.php');}echo '<form action="" method="get">';echo '<input name="profiletext" type="text" size="30" value=""><br>';echo '<input name="submit" type="submit" value="Display text on profile">';echo '</form>';$fbml = <<<EndHereDoc<form><input name="mockfbmltext" type="text" size="30"><br /><input type="submit"clickrewriteurl="$appcallbackurl"clickrewriteid="preview" value="Draw text below"/><br /><div id="preview" style="border-style: solid; border-color: black;border-width: 1px; padding: 5px;"></div></form>EndHereDoc;$facebook->api_client->profile_setFBML($fbml, $user);echo "<p>the following form was added to the profile box:</p>"$$echo $fbml;
相关下载
[*]facebook_client.tar.gz -- php5的最新客户端库文件[*]tutorialapp.tar.gz -- 将文中例子合并到一起的代码。在你自己的服务器上运行时需要替换其中的“app_key”,“application secret”和数据库信息[*]tutorialapp.zip --和上面tutorialapp.tar.gz内容相同,为zip压缩格式
facebook开发详解,对开发Facebook程序有很大帮助 【转】
转载自 hwlinux最终编辑 hwlinux
转载:http://xiecc.blog.163.com/blog/static/14032200791635949331/
全球第二大社交网站的facebook推出的开发平台在几个月之内迅速走红。在拒绝了 yahoo,google等的收购后,它的狼子野心也暴露无遗,它要做基于web的OS,在它的开放发台上可以搭建集成任何应用。游戏、工作、理财一切都在facebook中了,浏览器+facebook,会成为以后人们的生活方式吗?
然而不得不说facebook的官方文档既乱且差, 很多刚开发facebook应用的人可能都会丈二和尚摸不着头脑。这篇日志算是八卦+tutorial吧。
一、facebook简介
这段纯属废话,给那些不解facebook, 又不愿意点链接的人看。
Facebook发源于哈佛大学,是目前社会化网络和web2.0的风向标。这个网站目前全球排名第8位,估值可能超过100亿美元。而Facebook开放平台的推出,更是让互联网业内认为它是最有可能和Google比肩的公司。 Facebook创建于2004年2月。这样的高速增长和短短三年多取得的成就,成为当今互联网发展的一个奇迹。
(Facebook创始人兼CEO Mark Zuckerberg)
这里的介绍更详细:
http://www.yeeyan.com/articles/view/thunder/2346
二、facebook platform
2007年5月24日,Facebook推出应用编程接口(API)。通过这个API,第三方软件开发者可以开发在Facebook网站运行的应用程序。这被称为Facebook开放平台(Facebook Platform)。
没有什么比facebook创始人mark Zackerberg的总结更好了:
"We want to make Facebook into something of an operating system so you can run full applications," Zuckerberg told me, saying it would be analogous to the platform that Microsoft Windows provides for developers.
去 http://www.facebook.com/apps/ 看看吧, 那里的应用真是应用尽有。
读写网总结的top 10 facebook apps也相当的棒:
http://www.readwriteweb.com/archives/top_10_facebook_apps_work.php
http://www.readwriteweb.com/archives/top_10_facebook_apps_play.php
三、facebook 应用概述
1、平台开发环境
Facebook的开发环境是LAMP, 这套传统的linux+apache+mysql+php的架构尽管被很多java程序员和ruby程序员所不屑,但它却仍然以绝对的优势占据着主导地位。
不过这对java程序员来说确实有点痛苦,因为facebook官方包装的java client相当的差,更关键的是它没有提供任何java开发web应用的例子和文档。幸亏还有一些非官方的tutorial。地址附在后面。
2、应用集成
谈到应用集成, 我们首先想到的是web services 和SOA,这些被工业界吹了那么多年的buzzword终于得到了推广,然而值得讽刺的是最后web services的推广形式不是他们花了那么多年想出来的SOAP标准,而是最简单又不用任何标准的REST,facebook正是提供了一堆REST的 Web services(从严格意义上说facebook的所有service都是POST过去的,URL也没有完全遵守REST)。
然而这个层面的集成显然不能满足facebook作为web OS的需要,facebook需要让application运行在它提供的平台上。看看操作系统的需要就能想象到facebook的web OS应用提供怎么的集成。
在windows上我们需要安装应用软件,facebook提供了完整的搜索、浏览、添加application的方式。
在windows上我们利用各种快捷方式让应用运行在自己的平台里,facebook提供了运行应用的简单入口,而所有的应用都是在facebook内部展示的。
记得前几天看到的一篇文章将应用集成分为三个层面:
1 基于web services和SOA的应用程序交互
2 平台运行在内部服务器上,而各种应用运行在外部服务器上,这正是facebook的方式
3 平台和应用都运行在内部服务器上
但是不知道他有没有想过第三种集成方式的扩展性和伸缩性是多么贫乏,我相信facebook的集成方式才是最好的方式。
Facebook的这篇官方文档解剖了facebook应用集成到平台后的各个界面展示:
http://developers.facebook.com/anatomy.php
四、facebook应用种类
Facebook提供了三类的应用:
External application
Iframe
fbml
1、 external application没什么好说的,就是基于web services的集成,外部应用在经过facebook的认证后可以调用facebook提供的一些web services。
2、 Iframe的集成也相当简单,只是在facebook平台的应用页面上放了个iframe, iframe里跑的是应用程序的应用。好象facebook里的最火的应用之一top friends是用iframe做的。但是由于iframe的天生限制,使它无法完全集成facebook平台提供的功能,如fbml,在页面的显示上也有些怪。
3、目前应用用的最多还是fbml。因为在fbml的应用中,facebook平台的页面(下图所示的菜单部分)和应用程序的页面(如下图黄色部分)是无缝显示的,看上去完全象是一个应用做的事。想象成OS的话,外部的菜单栏更象是windows提供的桌面和开始菜单,黄色区域则是应用程序。
在fbml应用中,facebook平台主要起着中间人的作用,如下图所示,
所有的用户对facebook平台的请求都被转到了应用的url(在application 里可以配callback url),只不过是把所有的请求变为post, 同时加上认证必需的一些参数。最后返回的html显示在facebook的application区的canvas里。
但是这个中间人的角色并不象想象中的那么简单, 它至少会引起以下问题:
1、httpsession信息丢失,基本上现在的httpsession都依赖于cookie中的jsessionid,但是经过中间人(facebook服务器)后,cookie的信息是无法获取,也意味着httpsession是无法保存信息的。因此所有的用户相关的信息都是加在中转后的reqeust参数里的,从request里的userId 和sessionKey应用程序可以重建出用户的所有信息。 不过这倒反而实现了应用的share nothing architectue,对系统的scalability是有好处的。
2、外部css丢失,由于中转的时候只去request callback url里的页面,所有外部的css内容都是干掉的,应用程序只能在html文件里定义css,这对于css狂们真是灾难。
3、js丢失,facebook会把页面中所有的js给滤掉,而取而代之用自己设计的有限的安全的js语言,这很重要的一部分原因是安全性。但对于ajax狂来说这又是灾难。
五、facebook的authentication
Facebook的认证过程其实不复杂, 但是如果java程序捧着官方提供的java包捣腾,恐怕还要费些功夫,官方那个只提供了桌面应用的认
证程序,而web应用的认证过程则大厢径庭。
应用程序在注册时会获得该应用的api_key和secret,这实际上是访问该应用的用户名和密码了,只有开发人员可以看到。事实上以后的每次调用facebook api都会带上这api_key,但这显然还不够,登录用户必须拥自己特定的信息:sessionKey,每次调用带上这个key才能将用户的信息关联(类似于tomcat的jsessionid),因此认证的主要目的就是拿到sessionKey。
上图是外部web应用的认证过程,这种应用只通过web services与facebook集成,这种应用唯一要做的是获得取得调用web services的权限,上图的流程很清楚了。如果用java开发,一般先用一个filter或其它interceptor拦截,如果发现没有登录 facebook应用自动导到facebook的login页面(在request的参数里将登录完后回来的页面传进去),登录后跳回到原来的页面,就可以在filter中通过request里的authtoken获取sessionKey了,这种应用一般将认证后的sessionKey放到HttpSession就可以了(以后不用重复认证)。
上图是fbml应用的认证过程,事实上内部应用的authentication远比外部应用简单,但是官方竟然没提供文档。由于facebook的用户必须登录才能使用,实际上在使用 facebook应用时用户已经登录并拥有了sessionKey和user_id等参数,因此在中间人(facebook server)中转到应用的url时,它在request里会把sessionKey和userId等参数传进去,因此在拿到这些参数后客户端可以直接进行任何web services的调用。
六、facebook api (RESTful web services)
Facebook提供了一堆的api,有认证、用户、相册、好友等功能,从使用的角度来说这倒并不存在什么难点。本身REST的api就是一个httpRequest请求过去返回一个xml的response。经过了官方或非官方的包装以后就变成一个简单的方法调用。
1、所有的api调用都是无状态的,这也是facebook拥有这么好的 scalability的重要原因。每个request里都会带上api_key, session_key, call_id, sig等参数,这保证了安全性的同时也保证了scalbility。
2、java的客户端调用包比起ruby来实在是恶心多了。这个时候动态语言的优势体现得太明显了。利用ruby的method missing功能,一个简单的实现就可以调用facebook的所有api了,而且扩展性好。Java的包里则定义了一堆恶心方法,而且返回的是一个 xml document, 经过一堆的解析才能取到结果。
七、fql与fbml
Fql就是facebook版的sql,从使用的角度来说fql的其实挺简单,它只是sql的一个子集, 只支持单表查询,where条件必须是索引过的字段,支持子查询, 还支持一些sql的函数。最简单的例子:
SELECT name, pic FROM user WHERE uid=211031 OR uid=4801660
Fbml是facebook提供的一堆tag,它只能在fbml的应用程序中使用。从使用的角度来说也很简单,以下html显示了一个用户头像:
<td><fb:profile-pic uid="${friendId}" linked="true" /></td>
八、开发环境
开发外部的facebook应用和iframe的facebook应用不需要任何的特殊配置,但是开发fbml的facebook应用却是另一回事了。从第四节的facebook as middleman的图中我们可以看到facebook服务器要读到应用的页面塞到facebook的canvas里。这意味着应用的页面必须是外网可以直接访问才能看到效果。
而我们的开发平台却是搭在本地的, 难道只有部署到服务器上才能看到页面效果?这对开发调是一个严重的挑战。
后悔我当初没有看到这篇blog, 利用SSH的reverse tunnel功能可以将外网的地址按端口号tunnel到本地的开发环境。
http://blog.evanweaver.com/articles/2007/07/13/developing-a-facebook-app-locally
我采用另一种方法:增加middleman,facebook本身起了一个中间人的作用,将facebook的请示导到了应用的请求,为什么我们不可以再增加一个中间人, 把外网的请求导到内网?
幸好一个几十行的ruby on rails程序就可以搞定route的功能。
这样实现后的配置也很简单,只要将callback url里的参数映射到本地机器就可以实现多人的同时开发:
urlMap={
cc=>'http://192.168.80.156/facebook/',
:skt=>'http://192.168.80.133/facebook/'
}
附 facebook平台开发的非官方tutorial:
Ruby的:
http://www.liverail.net/articles/2007/6/29/tutorial-on-developing-a-facebook-platform-application-with-ruby-on-rails
http://giantrobots.thoughtbot.com/2007/6/14/fist-in-your-facebook
java的:
http://javablog.co.uk/2007/07/25/tips-for-writing-facebook-applications-in-java
http://tmachine1.dh.bytemark.co.uk/blog/index.php/2007/08/02/how-to-make-facebook-apps-using-java-part-1/
http://tmachine1.dh.bytemark.co.uk/blog/index.php/2007/08/13/how-to-make-facebook-apps-using-java-part-2/
http://tmachine1.dh.bytemark.co.uk/blog/index.php/2007/09/21/ten-tips-and-tricks-for-writing-facebook-apps/
回复 #1 coredump 的帖子
coredump, 啥时候对facebook的开发有兴趣啦? 是不是想为家里的小人们,开一个小朋友的facebook? 原帖由 lb7ba6 于 7-1-2011 16:23 发表 http://www.freeoz.org/ibbs/images/common/back.gifcoredump, 啥时候对facebook的开发有兴趣啦? 是不是想为家里的小人们,开一个小朋友的facebook?
Facebook是颗摇钱树,以色列人正在拼命的摇:P 以色列人开发了什么东西?
回复 #5 coredump 的帖子
哈哈,看来你也想傍上facebook啊!PS: 你给我的回复,在短消息里怎么没有提示的啊?
页:
[1]