17MARCH |
|---|
前几天开了个Amazon aws的帐号,由于是第一次碰,一点点摸索着运行了一台Ubuntu 10.04的实例,遇到的问题记录下。
linux一般使用SSH客户端进行连接,所以必须要打开22端口,否则实例化后连不上,等于白白消耗你的信用卡。
一般启动一个LAMP的话,这几个端口是需要打开的:
21:ftp
22:ssh
80:http
mysql:3306
当然这些端口都可以修改的。但第一次一定要开的就是ssh的端口。
Amazon的帮助文档还是比较全面的,我这个不懂linux的人,也可以参照帮助文档连接,不过,文档中可是有错误的。比如点击连接计算机的时候,这里就只是说输入这样的命令就可以进去:
ssh -i xxx.pem root@your Public DNS
可是总也连不上去,提示:
Permission denied (publickey)
后来查了下,说linux第一次进去时,root是没启用的,要用ec2-user这样一个用户名。无奈,尝试了,还是不行,进不去啊。(后来查的说是在ami上自己安装的ubuntu使用ec2-user,我们是直接实例化的系统,不一样)
直到最后才搜索到ubuntu的登录又得用另外一个用户名:ubuntu。
其他关于ubuntu的设置,就不记录了,网上的资料比较多。
12DECEMBER |
|---|
本文记录youtube 的几个常用api,并使用其中一个介绍其使用方式。
首先,我们来看看这几个api:
http://gdata.youtube.com/feeds/users/username/uploads
\- videos uploaded by username
http://gdata.youtube.com/feeds/users/username/favorites
\- videos bookmarked by username
http://gdata.youtube.com/feeds/users/username/playlists
\- playlists created by username
http://gdata.youtube.com/feeds/users/username/subscriptions
\- username's subscriptions
就是说,如果你要显示username这个用户(不知道有没有这个用户)的视频,可以访问
http://gdata.youtube.com/feeds/users/username/uploads
这个路径来获取数据。其他的就不用讲了。
有趣的是,google给这四个api设置了差不多的参数,常用的有:
?max-results=50:
最多要返回的记录数(默认情况下是25),不过要记住,youtube每次访问可返回的最大值恰好也是50,如果想要获得更多内容,可以多请求几次,哈哈。
?alt=rss or ?alt=json:
alt参数用于设置返回内容的格式。
?vq=query:
用于筛选结果,会从 metadata (title, tags, description)中进行检索,比如“google+ maps”,就是搜索google map。
?orderby={updated, viewCount, rating, relevance}:
排序,示例中以updated为第一排序,relevanced作为最后一个排序。
使用jquery的AJAX进行访问也很简单:
$.ajax({
type: "GET",
url: "http://gdata.youtube.com/feeds/users/username/uploads?alt=json”,
cache: false,
dataType: 'jsonp',
success: function (data) {
showMyVideos(data);
},
error: function (XMLHttpRequest, textStatus, errorThrown, data) {
alert("Not able to fetch the data due to feed unavailability!!!");
}
});
这里的showMyVideos(data)的方法就没必要写了,实际上我们只要随便找之前用到的播放器把内容显示出来就行了。而data结构还是比较复杂的,这里简单说一下。
data实际是个数组,针对其中的每一个entry(=entries[i]),我们常用的内容有:
entry.title.$t:视频的标题
entries[i].media$group.media$thumbnail[0].url:视频的缩略图
entries[i].media$group.media$content[0].url:视频的实际地址,这里content[0]实际是第一视频的地址,这个是flv格式的视频,如果不支持flash,可以取第二个。
entry.published.$t:这是发布时间。
entry.yt$statistics.viewCount:这个是被浏览次数。
似乎没有直接提供视频的id,但是我们可以通过字符串算出来:
entries[i].media$group.media$content[0].url.substr(playerUrl.indexOf(‘v/’) + 2, 11)
好了,基本的东西就这些了,其实也可以自己在firebug中输出一下,然后对比一下就知道怎么回事了,或者输出rss自己对比xml。还是很简单的。
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,我正好有时间。
28SEPTEMBER |
|---|
土豆的api很有问题,其登录使用了OAuth的认证,相关说明却直接链接到OAuth的官网去了,那总得把自己的认证服务的路径写上去吧!
找了半天,终于从其论坛中找到以下几个地址,
Tudou OAuth服务URL
Request Token URL: 获取未授权的Request Token服务地址;
http://api.tudou.com/auth/request_token.oauth
User Authorization URL: 获取用户授权的Request Token服务地址;
http://api.tudou.com/auth/authorize.oauth
Access Token URL: 用授权的Request Token换取Access Token的服务地址;
http://api.tudou.com/auth/access_token.oauth
论坛说文档中增加了,其实文档中还是没有。先记下,免得忘记。
23SEPTEMBER |
|---|
发现一些与分享url有关的api接口,记录下
Facebook - http://graph.facebook.com/?ids=http://www.seomoz.org
Twitter - http://urls.api.twitter.com/1/urls/count.json?url=http://www.seomoz.org
Linkedin - http://www.linkedin.com/cws/share-count?url=http://www.seomoz.org
Stumbleupon - http://www.stumbleupon.com/services/1.01/badge.getinfo?url=http://www.seomoz.org
Delicious - http://feeds.delicious.com/v2/json/urlinfo/data?url=http://www.seomoz.org
Google Buzz - https://www.googleapis.com/buzz/v1/activities/count?alt=json&url=http://www.seomoz.org
Reddit - http://www.reddit.com/api/info.json?url=http://www.seomoz.org
参考资料:
1、Seo blog:http://www.seomoz.org/blog/how-to-track-your-social-media-strategy
25AUGUST |
|---|
最近在研究各种api,本来要先搞人人的api,但人人的各种申请太繁琐了,.NET的skd很好用,代码写的很简单,但是php的那份死活调不通,作者也已经好几个月没有更新过了,同时有几个特别想测试的api偏偏需要申请,你说这学习研究阶段,懒的去申请,所以就暂缓搞人人的api了。这两天在新浪云里面整了个应用,顺便了解下新浪的api。
首先,需要注册新浪开发者账户,http://open.weibo.com/,当然可以使用新浪微博登录,不过对账户信息有限制,很简单,通过邮箱认证下即可。(今天很奇怪,新浪的认证用不了网易的163邮箱,估计这俩公司又闹起来了,呵呵,qq的倒能用)。
然后要创建一个新应用,一共有三种形式的应用:
我们创建的自然应该是站内应用了,设置还算比较简单。新浪的开发文档看起来很简单,至少比非死不可的简单多了:
http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5
它的php sdk在这里:
http://code.google.com/p/libweibo/
直接就有介绍,看着不错,下载了一份放到apache的htdocs目录,然后按照介绍中写的进行操作。
有问题了,说明里面有:
CANVAS_PAGE为“应用页面”中设置的”站内应用地址“
这个说法,但config.php中并不包含这部分,算了,不管了,估计用不着。但运行的时候却出错了。
错误1: Notice: Undefined index: SCRIPT_URI in D:Apache2.2htdocssinaappindex.php on line 13
这个错误仅仅是个提示,但他会影响到认证成功后返回的路径。网上也有很多人问该问题,有人说要启用apache的mod_rewrite模块,但我试过了,启用似乎不解决问题,也有人说需要启用php的php_curl扩展,我查了,我也启用了。问题的出处是访问$_SERVER[‘SCRIPT_URI’]这个值的时候,访问不到,而许多人也说SCRIPT_URI并不是内置的。最终也没有查到,不知道作者是不是启用了其他不常用的扩展或者模块,但是我们可以自己来处理:在访问前定义下:$_SERVER[‘SCRIPT_URI’]=‘http://yoururl’,就可以了。
错误2:乱码
认证成功后,页面上全是乱码,用记事本把所有的php文件另存为utf8,windows的(似乎作者上传的是linux下编写的php,但是问题仍旧很奇怪)
错误3:浏览器兼容性
这个还不知道是怎么回事,反正用chrome浏览器打开后,运行是不正常的,换firefox下可正常使用,这个实在奇怪,服务器端的代码,难道还挑客户端的浏览器?
好了,今天先写到这里吧。对这些问题有研究的朋友,不妨告知。
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,/晕。
备注,注意翻 墙。