10DECEMBER |
|---|
关于facebook的项目停了一段时间,最近突然又来了一个这类的项目,是要制作一个专页上的链接。话说创建专页不难啊,但是由于不懂,而且时间比较紧,遇到不少问题,至今还有些搞不明白。幸得本站用户KIVU的鼎力帮助,项目算顺利完成了。这里把制作过程记录下来,分享给大家,以减少大家走的弯路。
首先,专页是facebook专门推出用来展示个人或者企业的一个工具,创建专页在facebook上面有专门的帮助文档,很详细(不过也很多,说实话,我没有详细去看,创建专页自己试试就可以创建出来),url如下:
[http://www.facebook.com/help/?faq=104002523024878&ref\_query=crea](http://www.facebook.com/help/?faq=104002523024878&ref_query=crea)
我们可以看到很多公司做了挺漂亮的专页,但我们创建的专页却仍然只是由涂鸦墙、视频等信息组成的页面,我们自己的页面怎么实现呢?或者说,在左侧上部的链接中,加入我们自己制作的页面。
这里要感谢本站用户KIVU,一句话说的很明白,左侧的链接都是应用,也就是facebook app。其中涂鸦墙等几个是facebook自己的app,也有几个是必须显示不可删除的,添加怎么办呢?Facebook似乎没有提供一个地方要指定加入一个应用的地方。感觉把专页中的设置尝试遍了,也没找到对应的功能。
KIVU在百忙之中给予支持:
1、创建新应用(前面我们有文章提到过),在编辑应用基本信息的界面左下角,找到“View App Profile Page”这个链接,现在即使是简体中文的界面,这个链接的文字也没有翻译,应该是查看我的应用的专页吧。
2、进入该页面以后(url如http://www.facebook.com/apps/application.php?id=XXX),可以在其左下角找到“加入到我的专业链接”,其实这是一个按钮,点击后会弹出你所有的可以被加入的专页(包括其他应用)。如图:
找到你想加入的页面,点 add to page就可以了。至于页面中的内容,就是你的app中指定的页面的内容了。还算简单吧。
3、往往你制作好页面以后,页面高度没有按照自己的页面来,就是说即使你设置了高度自适应(那似乎只对应用页面有效,对专业中的页面无效),页面中还是出现了滚动条,其实也很简单,我们只需要写这样一段代码就可以了
FB.Canvas.setSize({ width: 520, height: 2400 });
这里要记住啊,width:520基本上是必须这么写的,因为专页中的页正好是520的宽度。很有爱啊。对了别忘了,要加入facebook js api的引用啊:
<script src="http://connect.facebook.net/en\_US/all.js#xfbml=1"></script>
还有一点要说明,刚创建的应用好像点查看我的应用专页时会直接进入应用详细页,要等几个。我昨天创建的应用就这样,害得我好苦,不过今天都可以点进去了。所以有些东西是不可仓促行事的,必要的时间是需要留出来的。
如果你的页面是纯静态的话,还有一种实现方式,就是使用别人做的应用来帮忙实现。当然了,这是其他人做好了的应用,facebook有好多此类的应用。比如我们在facebook中搜索FBML:
可以看到有许多做静态FBML的应用,随便找一个把它加入到你的专页中去,然后在编辑专业的应用程序栏找到该应用,如图:
然后点击访问应用程序,可以到编辑FBML页面的地方,如图:
如果你的页面足够简单,使用该方法是可以非常轻易制作一个应用的页面,而且不需要自己准备服务器,够爽吧?
当然,如果你的页面中脚本比较多,可能并不适合你,因为需要学习许多FBML中js的用法,我还没用过,也还不清楚是否麻烦。
好了,本文通过两种方式实现了专页中的个性页面,实际上实现过程中还遇到了rss、youtube和twitter中的问题,我会在后面的文章中继续与大家分享。
20OCTOBER |
|---|
昨日有朋友问及关于facebook 的php sdk的问题,由于之前并没有关注其php sdk,并不是特别的了解,于是专门下载了php sdk来试用,现把学习所得与大家分享。
首先,到facebook的开发者站上下载php的sdk,具体页面在以下地址:
https://developers.facebook.com/docs/reference/php/
这个页面其实是使用文档,讲到了许多使用方法。下载后把下载的压缩包解压缩到站点的目录中即可。
下载的sdk中,有个example.php的文件(具体在example的子文件夹中),这其实就是一个登录并获取用户基本信息的一个演示。另外还有一个结合jssdk的演示,功能一样,效果不一样而已。
演示中提供了默认的appkey和secretkey,但是我只是第一次测试的时候,用它登录成功了,但后来再测试的时候就不能正常使用了,换了我的某一个应用的key,还是不能访问,提示说没有通过url访问的权限之类的说法。不得已,只好创建了一个新的应用,设置url为测试用的域名,还是报一样的错误。
仔细查找后发现,facebook此次升级版本后,增加了好多设置,其中有个url访问的设置默认是关闭的,将其打开即可。具体该选项在高级设置(Advanced)里,叫做Stream post URL security。
我们只分析php sdk的代码,关于jssdk的代码之前曾有文章提到过。
小提示:
使用php sdk,必须打开php_curl.dll,在php.ini中,找到该行,去掉前面的分号,重启apache即可。
首先,引入facebook 的phpsdk,并初始化facebook对象:
require '../src/facebook.php';
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => '191149314281714',
'secret' => '73b67bf1c825fa47efae70a46c18906b',
));
初始化中,要把appid后的数字修改为自己申请到的应用的appkey,secret也修改为对应的secretkey,注意secretkey是可变的,如果你觉得你的应用被其他人冒用,可以重新生成该值,但你所有的应用中对应值都要相应的修改。
查看是否有用户已登录:
$user = $facebook->getUser();
// We may or may not have this data based on whether the user is logged in.
//
// If we have a $user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.
if ($user) {
try {
// Proceed knowing you have a logged in user who's authenticated.
$user\_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error\_log($e);
$user = null;
}
}
// Login or logout url will be needed depending on current user state.
if ($user) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl();
}
$user是通过sdk检测是否用户已经登录。
其中提到的几个方法分别说一下:
$facebook->getUser();
如果已登录,$user就是用户id,否则为空。
$facebook->getLogoutUrl();
如果用户已经登录,可以通过此方法,获取一个退出的链接。
$facebook->getLoginUrl(); 如果用户未登录,可以通过此方法,获取一个登录的链接。点击该链接会到一个登录页面并授权的页面,登录成功并确认授权后会返回之前的页面。
$facebook->api(‘/me’);
获取当前登录用户的详细信息;如果要访问某用户的信息,比如naitik’,则可以写做:
$facebook->api(‘/naitik’);
其中,$facebook->api(‘/me’); 就是调用具体api的写法。
前面的文章中提到过js sdk的使用,有这么一段:
FB.api({path}, 'GET', {}, function(response){
if (!response || response.error) {
alert('Error occured');
}
else {
…
}
})
其实这里的写法也是完全类似的,第一个参数就是路径,第二个参数是访问谓词,一般是GET、POST、DELETE等,第三个参数是一个数组,就是对应的方法的文档中所需要的参数。当然,我们这个程序就不需要回调函数了,呵呵,下面有一个完整的写法示例:
$facebook->api('/daaku.shah', 'DELETE', array(
'client\_id' => self::MIGRATED\_APP\_ID));
总的来看,facebook提供的sdk还是比较好用的。虽然在论坛上有许多人说它难用,但我估计是因为facebook太庞大了,api研究不过来,不像优库那样只有一个接口。对比严重抄袭facebook的renren,renren的api设计的简直是欠抽:那个东西才叫做难用,搞好几天都调不通!再一个,说说土豆,文档跟进缓慢,很多东西忘记写入文档了???而且示例也不通!
废话说多了,把国内的几个网站都得罪了,不过还是希望提到的几个网站能够及时优化,开发平台如果很难用,就别开放了。
好了,关于php sdk的入门就写到这里,感觉往下也没有什么好写的了(难道要写具体的api方法?)。如果朋友们有兴趣,欢迎留言,我们再深入探讨。
20OCTOBER |
|---|
[kivu]( “[email protected]”) -
嘻嘻,不错,写得很详细,把你这网址收藏了,有机会可以交流!
[kivu]( “[email protected]”) -
http://www.facebook.com/wbintl?sk=app_276923065674608在这个专题应用程序页,你的facebook就算登陆了,也得在这里 login一次才不会返NULL。请问LOGIN这一步能跳过?我想客户打开这个应用程序,直接获取他当前语言,选择对应语言专题。?
这个链接看似应该是打开一个应用,但链接并没有通过应用的方式去打开,如果链接:
http://www.facebook.com/276923065674608
则会到应用的介绍页面,点进入应用会有授权。
如果链接:
http://apps.facebook.com/wbabout/
直接到应用页面。
不知道是这个意思么?
[kivu]( “[email protected]”) -
facebook 换版了,以前在应用程序里点See App Timeline View然后就可以选择要把这个应用程序加到哪个专页的,现在不知道改哪里去,嘻嘻,你也看看怎么样才能把应用加入到指定专页!
[Jason]( “[email protected]”) -
ok,我正好有时间。
18AUGUST |
|---|
近期参与了一些开发facebook相关应用的项目,由于国内访问困难,相关资料查找及测试都比较困难,起初只做一些简单的调用,比如要从手机上打开facebook的发送消息的页面,并把对应的参数传递过去。这个本应该是个很简单的工作,但由于我们对其并不熟悉,相关资料都查过好多。本想咨询做过facebook相关项目开发的iphone团队,可对方使用的是ios上的一个sdk,至于要打开哪个页面,就不知道了。当然,后来这些问题都解决了,我上一篇文章中有对具体方法的描述,但感觉就像一个外行在做开发,我觉得个人站长都应该对此很明白(这些内容甚至不需要使用facebook的api)。
现在另一个项目是开发facebook上面的web app,开发web app需要注册成为facebook开发者,这个很简单,进入
https://developers.facebook.com/
网站自己注册就可以了,如果不是开发者,会提示要注册激活,美国人可以直接绑定手机号码激活,我们只好使用双币信用卡激活了,反正标着visa和万事达卡的信用卡都可以激活(我用了一个即将到期的万事达卡,现在还不知道到期后会不会让重新激活),激活并不会收费,放心激活就行了。
入门级javascript sdk:
注册过程不详细写了,很简单,需要注意的是:
1、website项目中的站点url和domain两个项目是不需要http://开头的;而app on facebook的canvas URL,是需要写http的。而且这一段是实际上从facebook打开这个app时,嵌入的iframe的地址。
2、如果本机测试,可以直接使用localhost作为地址,真正上线的时候记得改回来就行。也可以用改host文件的方法随便指定一个域名,加端口访问也没问题,就是不能用ip地址,提交通不过。
注册好了,就开始开发吧,我们首先不使用C#的sdk,直接使用facebook提供的javascript api:
1、创建一个静态页面,引入脚本
http://connect.facebook.net/en_US/all.js
除此之外,还要引用jquery,写脚本方便嘛;
2、另外需要在页面上方这么一个div:
如果不放,就会脚本报错。放哪儿都行,也不显示。但是要放在fb初始话的脚本前面。
3、写段脚本吧,这里我们有个登录按钮:
FB.init({ appId: ‘{这里是appid}’, status: true, cookie: true, xfbml: true });
$(“#FBLogin”).click(function () {
FB.login(function (response) {
if (response.session) {
// 登录成功
window.location = ‘about.aspx’
} else {
//
}
}, { perms: “publish_stream” });
});这里首先初始化了fb对象,需要appid,它在创建时自动生成。第二个呢注册了一个登录按钮的点击事件,点击后直接调用FB封装好的login方法,第一个参数是回调函数,第二个参数是一个json对象,这里注明了该app的访问权限是publish_stream,差不多是最小权限了吧。
所有权限的资料和其他api的资料可以直接访问以下地址查找:
https://developers.facebook.com/docs/
刚入个门,其实后面的对照文档中的,就都可以了,比如fql:
FB.api({
method: ‘fql.query’,
query: ‘SELECT name, pic FROM profile WHERE id=’ + uid
}, function(response){
fb_User.name = response[0].name;
fb_User.pic = response[0].pic;
…});
这是访问用户配置表,返回用户名称和头像。
graph api相比更加简单,先看例子
FB.api({path}, ‘GET’, {}, function(response){
if (!response || response.error) {
alert(‘Error occured’);
}
else {
…
}
})
path就是对应访问内容的路径,比如访问个人资料,就填me,访问某视频的信息,可以直接填视频的id。很简单吧,回调函数中都是返回的json对象,书写也很便利。
项目用到一半,除了登入退出外,也就用了这么两类的api,很简单吧。
Facebook C# SDK
项目开始时查到过两个SDK,一个叫做Facebook C# SDK,更新的很快;另一个叫做Facebook toolkit什么的,从名字上看似乎是微软自己的帮助系列,代码也很庞大,但有半年多没有更新了。而据我所知,今年6月份facebook的api还有改动(突然某天代码失效,后来发现api改了,竟然不兼容!)。所以我们选择更新的比较快的这个。
代码地址:
http://facebooksdk.codeplex.com/
仅支持vs2010,你可以下载了dll然后加载到项目的引用中去。今天我们介绍另外一种引用方式:
1、在vs2010中,新建web站点(以次举例,也支持mvc、windowsphone),右键项目,选择 Add Library Package Reference,
把最后那两个安装仅上就可以了。如果没有看到的话,可以从右侧搜索facebook就可以找到了。安装上之后,不仅对应的dll会被拷贝进了,web.config中也会生成对应的两段配置
configSections段中增加了
configuration段中增加了
我们把我们申请到的appid和appsecret填入即可。
前台的页面我们还是需要按照前面讲的javascript的方式进行编写,只是我们appid的位置可以这么写:
<%: Facebook.FacebookApplication.Current.AppId %>
到这里,第一步也算迈出去了。详细使用方法,我们举几个例子:
获取用户信息:
// Using dynamic (.Net 4.0 only) var client = new FacebookClient(); dynamic me = client.Get("me"); string firstName = me.first\_name; string lastName = me.last\_name; string email = me.email; // Using IDictionary<string, object> (.Net 3.5, .Net 4.0, WP7) var client = new FacebookClient(); var me = (IDictionary<string,object>)client.Get("me"); string firstName = (string)me\["first\_name"\]; string lastName = (string)me\["last\_name"\]; string email = (string)me\["email"\];
获取某一条post的详细信息
// Using dynamic (.Net 4.0 only) var client = new FacebookClient("my\_access\_token"); dynamic result = client.Get("19292868552\_118464504835613"); string id = result.id; string fromName = result.from.name; string fromCategory = result.from.category; string message = result.message; int likes = result.likes; foreach (dynamic comment in result.comments.data) { string commentId = comment.id; string commentMessage = comment.message; }
发布一条信息
var client = new FacebookClient("my\_access\_token"); dynamic parameters = new ExpandoObject(); parameters.message = "Check out this funny article"; parameters.link = "http://www.example.com/article.html"; parameters.picture = "http://www.example.com/article-thumbnail.jpg"; parameters.name = "Article Title"; parameters.caption = "Caption for the link"; parameters.description = "Longer description of the link"; parameters.actions = new { name = "View on Zombo", link = "http://www.zombo.com", }; parameters.privacy = new { value = "ALL\_FRIENDS", }; parameters.targeting = new { countries = "US", regions = "6,53", locales = "6", }; dynamic result = client.Post("me/feed", parameters);
访问ADS API
var client = new FacebookClient("my\_access\_token"); dynamic reportSpec = new ExpandoObject(); reportSpec.report\_type = "perf"; reportSpec.summarize\_by = "ad"; reportSpec.agg\_time = "daily"; reportSpec.filter\_obj\_ids = new string\[\] { }; reportSpec.internal\_columns = false; reportSpec.time\_start\_offset = 172800; reportSpec.time\_stop\_offset = 86400; dynamic scheduleSpec = new ExpandoObject(); scheduleSpec.name = "test\_schedule"; scheduleSpec.time\_next\_ref = DateTime.UtcNow.AddDays(1).ToString(); scheduleSpec.report\_spec = reportSpec; scheduleSpec.frequency = 1; scheduleSpec.status = 1; scheduleSpec.email = 1; dynamic parameters = new ExpandoObject(); parameters.method = "ads.createAdreportSchedules"; parameters.account\_id = 1234567891235; parameters.schedule\_specs = scheduleSpecs; parameters.flags = 1; // Debug Mode dynamic result = client.Post(parameters);
创建相册
// create album dynamic albumDetails = new ExpandoObject(); albumDetail.name = "test album"; dynamic fbResult = fbApp.Post('/me/albums', albumDetails); var albumID = fbResult.id; uploadPhotos(albumId);
上传图片
private void uploadPhoto(string albumID) { var fbUpl = new Facebook.FacebookMediaObject { FileName = @"Some.png", ContentType = "image/png" }; var bytes = System.IO.File.ReadAllBytes(@"C:somePath" + fbUpl.FileName); fbUpl.SetValue(bytes); var photoDetails = new Dictionary<string, object>(); photoDetails.Add("message", "test photo"); // this will appear on the wall photoDetails.Add("image", fbUpl); // the name of this parameter does not matter var fbResult = fbApp.Post(@"/" + albumID + @"/photos", photoDetails); var result = (IDictionary<string, object>)fbResult; // Or we could use dynamic.. only the photo "id"(s) come back }
上传视频
var fb =newFacebookClient("access_token");
dynamic parameters =newExpandoObject();
parameters.source =newFacebookMediaObject { ContentType ="video/3gpp", FileName ="video.3gp"}.SetValue(File.ReadAllBytes(@"c:video.3gp"));
parameters.title ="video title";
parameters.description ="video description";
dynamic result = fb.Post("/me/videos", parameters);
Console.WriteLine(result);
可获的进度条和可取消的使用方式
var mediaObject =newFacebookMediaObject
{
ContentType ="image/jpeg",
FileName = Path.GetFileName(_filename)
}
.SetValue(File.ReadAllBytes(_filename));
var fb =newFacebookClient(_accessToken);
fb.PostCompleted += fb_PostCompleted;
fb.PostAsync("/me/photos",newDictionary<string,object> { {"source", mediaObject } });
fb.UploadProgressChanged += fb_UploadProgressChanged;
publicvoidfb_UploadProgressChanged(objectsender, FacebookUploadProgressChangedEventArgs e)
{
progressBar1.BeginInvoke(
newMethodInvoker(() =>
{
var totalBytesToSend = e.TotalBytesToSend;
var bytesSent = e.BytesSent;
var state = e.UserState;
progressBar1.Value = e.ProgressPercentage;
}));
}
publicvoidfb_PostCompleted(objectsender, FacebookApiEventArgs e)
{
if(e.Cancelled)
{
var cancellationError = e.Error;
MessageBox.Show("Upload cancelled");
}
elseif(e.Error ==null)
{
// upload successful.
MessageBox.Show(e.GetResultData().ToString());
}
else
{
// upload failed
MessageBox.Show(e.Error.Message);
}
}
可以使用fb.CancelAsync()进行结束上传。好了就举这些例子吧,例子代码来源于作者博客。总体感觉使用还是比较方便的。
18AUGUST |
|---|
[白兔]( “[email protected]”) -
就是样式有些难看,能不能再美一点?
[白兔]( “[email protected]”) -
自己创建的blog?很好很喜欢,加油喽!
Jason.Z -
还不太会调整,在学习,多谢关注
[kivu]( “[email protected]”) -
请问FACEBOOK的集成require ‘src/facebook.php’;
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
‘appId’ => ‘175974682484604’,
‘secret’ => ‘2cc482fd8cb824b1b95a3afe51b50aac’,
));设置已经正确了,为什么不可以用呢,是不是还要其它条件设置?谢谢!
Jason.Z -
你说的是php的sdk么?
Jason.Z -
@kivu
facebook 官网的文档中,初始化确实这一段就可以了:
require_once(“facebook.php”);
$config = array();
$config[‘appId’] = ‘YOUR_APP_ID’;
$config[‘secret’] = ‘YOUR_APP_SECRET’;
$config[‘fileUpload’] = false; // optional
$facebook = new Facebook($config);
你说不可以的是什么情况?
Jason.Z -
我刚才下载了最近版的facebook,PHP sdk,测试过程中也遇到问题了,提示curl执行失败。
就是说,首先需要启用php.ini中的extension=php_curl.dll扩展;
其次,在访问facebook某些api的时候,一些访问路径被GFW给墙了,如果要做测试,最好使用VPN。
另外,似乎sdk中的key和安全码已经失效了,需要自己再申请一个帐号,创建应用,并设置应用可以通过url访问,然后把key和安全码换成自己的,否则会在链接登录到facebook时报一个应用错误的提示。
不知道你遇到的是否如此。欢迎来信交流。
[kivu23]( “[email protected]”) -
php sdk后面我知道为什么失效了,要先给当前用户LOGIN,允使操作这个应用程序。
现在我就有点想不明白,这个应用程序本想让浏览客户看到PHP SDK调出来数据显示在专题的,如果不”LOGIN,允使操作这个应用程序”,$facebook->getUser()反回是null。
Jason.Z -
这是因为demo中的登录过程,包含了部分app授权的过程。我记得在js版的facebook登录的方法中,可以直接写进入访问权限的参数,代码大概是这样的
FB.login(handleSessionResponse, {
perms: ‘user_videos,publish_stream’
});
我记得这样写之后,从facebook直接点开该app时,会自动授权,不需要重新登录。
你的链接我看到了,我也研究下。
31JULY |
|---|
近期有个mobile的项目,需要在项目中加两个功能,是在twitter和facebook上发消息的按钮,客户不想自己做界面,希望直接调用各自网站上的页面发消息。这俩网站国外很流行,国内却无法访问,也没怎么用过,不甚了了。于是开始查资料。
1、Twitter
twitter上发消息其实很简单,很多地方提供生产twitter按钮的功能,访问也完全支持get方式的访问。就是说完全可以直接输入一个url地址,就可以打开对应的twitter页面,且可以传入想要的信息内容。对比国外网站对twitter的引用和官网上提供的button按钮的说明,我们很快找到了这样一个地址,示例如下:
http://twitter.com/intent/tweet?status=i%20think%20is%20 @zsz417 http://baidu.com
这个地址用来修改用户的状态(status),不过twitter似乎也就有个状态而已,所有的信息无非就是通过status来表现的。你看,有内容,有url,还可以@某人,直接写入,就很完整了啊。当然,由于twitter中对状态有140个字符数的限制(国外的140个字符能表达充足的含义么),如果url比较长,最好通过短网址服务把网址做短喽。经过简单的几个测试后,就把该链接交给mobile开发的同事去用。
不过,很快mobile组那边就找过来,说每次发twitter都得登录,那是相当的麻烦。经跟踪发现,用mobile访问twitter,它会自动重定向到mobile.twitter.com进行登录,而且cookie仅仅对mobile.twitter.com有效(当然对当前连接也是有效的),而这个网址是web版本的,它需要www.twitter.com 这个网址上的cookie。(这个twitter也太不地道了,咋能这样呢?)
由于英语欠佳,资料查起来也很费力,而且baidu上面的资料几乎没有有效的,而google搜索相关敏感词语时,时不时就被墙了。喵了个咪的,人在天朝,全凭想象啊,猜吧。改下访问路径:
http://mobile.twitter.com/intent/tweet?status=i%20think%20is%20 @zsz417 http://baidu.com
键入地址后,竟然跳到了@intent这个用户的页面,我了个去,还是加密连接。看来这次猜的不给力啊。
边查边猜,发现另外一种写法:
那么,是不是它有对应的mobile版的写法呢:
https://mobile.twitter.com/?status=
这个加密连接,是自动重定向上去的(我修改agent为iphone了)。那在mobile 上直接访问这个,岂不更好?急忙交割mobile的同事去测试,OK,通过了。
2、Facebook
facebook的资料还是有一些的,比较适合我们的,资料上有这样一个链接(注意这个用法已过期):
http://www.facebook.com/sharer/sharer.php?u=http://www.sina.com.cn&t=this is sina
其中参数u是链接,t是标题,意味着可以分享一个网页,并且可以定义title。09年很多网页中也都是这么写的。但经过测试,facebook对这个sharer进行了优化,它自动抓取了网页的title以及首页的title,甚至抓取了其中的某些图片和描述信息,另外还有个用于用户输入的框。也就是说,现在这个只有u参数的写法还是对的,t这个参数已经无效了。几经测试,并不能完成客户的需求,只好再查找其他资源。(我并没有从facebook api文档中找到这个sharer的用法,惭愧)。
在facebook api文档的对话框项目中,发现有这么个用法:
其中:
其他的非必填项有:
先留下来做记录吧,不知道facebook哪天又要修改它的api,/晕。
备注,注意翻 墙。