Flickr.com是业内最好、最有名的图片网站,它提供了丰富的API让开发者创建各种应用。Adobe也很早就发布了ActionScript的Library(as3flickrlib)帮助Flex/Flash开发者开发基于Flash的应用。2007年as3flickrlib的托管从Adobe迁移到Google Code中,到本文撰写时候的最后更新是在2008年8月28日,本文的所有示例代码都是基于Subversion中的最后代码(版本r37)。as3flickrlib的代码需要as3corelib的支持,同时也是学习使用as3corelib编写WebService API的好教材。
使用Flickr的API还是先解决认证的问题,Flickr的认证没有采用OAuth但是方式相似,认证过程相对简单一些。这里采用的是Desktop Application的认证流程:
1. 设定认证的权限,在Flickr.com取得一个frob的参数。
2. 根据frob进行签名获取认证的URL,在浏览器中打开由用户进行授权。
3. 完成授权后,使用frob换取认证的token。
声明一个FlickrService的对象
f = new FlickrService('xxxxxxxxxxxxxxxxx'); #API Key
f.secret = 'xxxxxxxxxxxxxxxxx'; #API Secret Key
获取frob,成功后打开授权页面:
f.addEventListener(FlickrResultEvent.AUTH_GET_FROB, function(e : FlickrResultEvent) : void{
if(e.success){
frob = e.data.frob as String;
var auth_url : String = f.getLoginURL(frob, AuthPerm.READ); #申请只读权限
avigateToURL(new URLRequest(auth_url), "_blank" ); #打开授权的URL
}
});
f.auth.getFrob();
授权完成后,frob交换token:
f.addEventListener(FlickrResultEvent.AUTH_GET_TOKEN, function(e : FlickrResultEvent) : void{
if(e.success){
var authResult : AuthResult = AuthResult(e.data.auth);
f.token = authResult.token;
username = authResult.user.username;
nsid = authResult.user.nsid;
}else{
Alert.show('Exchange Token Error');
}
});
f.auth.getToken(frob);
认证授权后,就可以使用FlickrService访问用户的资源,包括那些private的数据。下面是使用一些功能的示例:
//根据email地址搜索用户
f.addEventListener(FlickrResultEvent.PEOPLE_FIND_BY_EMAIL, function(e : FlickrResultEvent) : void{
if(e.success == true){
var user : User = e.data.user;
Alert.show(user.username, user.nsid);
}
f.people.findByEmail('xxxxxxx@gmail.com');
//根据用户名搜索用户
f.addEventListener(FlickrResultEvent.PEOPLE_FIND_BY_USERNAME, function(e : FlickrResultEvent) : void{
if(e.success == true){
var user : User = e.data.user;
Alert.show(user.username, user.nsid);
}
});
f.people.findByUsername('xxxxxxxxxxx');
//获取一张图片的信息
f.addEventListener(FlickrResultEvent.PHOTOS_GET_INFO, function(e : FlickrResultEvent) : void{
if(e.success){
var photo : Photo = e.data.photo;
Alert.show(photo.title, photo.dateAdded.toString());
}
});
f.photos.getInfo('xxxxxxx'); //图片ID
//获取用户所有公开的图片
f.addEventListener(FlickrResultEvent.PEOPLE_GET_PUBLIC_PHOTOS, function(e : FlickrResultEvent) : void{
if(e.success){
var s : PagedPhotoList = e.data.photos;
for each(var p : Photo in s.photos){
var url : String = 'http://farm' + p.farmId.toString() + '.static.flickr.com/'
+ p.server.toString() + '/' + p.id + '_' + p.secret + '.jpg';
var thumbnail : String = 'http://farm' + p.farmId.toString() + '.static.flickr.com/'
+ p.server.toString() + '/' + p.id + '_' + p.secret + '_t.jpg';
Alert.show(url, thumbnail);
}
}
});
f.people.getPublicPhotos('xxxxxx'); //用户ID,既NSID
要解释的是如何根据数据拼接图片的访问地址,Flickr的官方文档在http://www.flickr.com/services/api/misc.urls.html:
http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}.jpg
http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}_[mstb].jpg
http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{o-secret}_o.(jpg|gif|png)
farm-id、server-id、id、o-secret和sercret在Photo的对象中都有封装,将值带入上面的格式中就可以得到需要的URL。mstb这个值没有封装,第3种格式种的图片类型由Photo的originalFormat属性可以得到。如果需要得到不同大小的图片,可以修改第3种格式中的o参数
s 75x75 像素
t thumbnail,最长的边为100像素
m small, 最长的边为200像素
- medium, 最长的边为500像素
b large, 最长的边为1024像素 (只有原始图片非常大的时候才有这种格式)
o 图片原始大小
本文涉及的是只读flickr数据,以后会发一个使用as3flickrlib上传图片的文章。