ラベル Bitly の投稿を表示しています。 すべての投稿を表示
ラベル Bitly の投稿を表示しています。 すべての投稿を表示

9/26/2011

短縮URLを作るNSString (shortURL) カテゴリ

昨日の短縮URLを展開するNSString (expandURL) カテゴリと対となるカテゴリ。
Bitly APIを使用しているので、事前にBitlyのアカウントとAPIキーを取得しておく必要がある。また、JSON形式の返り値をNSDictionaryに変換するためにSBJSONを使用している。


NSString+shortURL.h
#import <Foundation/NSString.h>

@interface NSString (shortURL)
+ (NSString *)shortURL:(NSString *)longUrl;
@end

NSString+shortURL.m
#import "NSString+shortURL.h"
#import "SBJson.h"

static NSString *kBitlyWrapperString = @"http://api.bit.ly/shorten?version=2.0.1&format=json&longUrl=";
static NSString *kBitlyFootterString = @"&login=ログイン名&apiKey=APIキー";

@implementation NSString (shortURL)

+ (NSString *)shortURL:(NSString *)longUrl{
NSString *aaa = nil;
NSString *escapeStr = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)longUrl, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
NSString *str = [NSString stringWithFormat:@"%@%@%@",kBitlyWrapperString,escapeStr,kBitlyFootterString];
NSURL *url = [NSURL URLWithString:str];
NSData *data = [NSData dataWithContentsOfURL:url];
if (data) {
NSString *tempStr = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
NSDictionary *aDic = [tempStr JSONValue];
NSLog(@"%@",[aDic description]);
NSNumber *errorCode = [aDic objectForKey:@"errorCode"];
NSString *statusCode = [aDic objectForKey:@"statusCode"];
if ([errorCode intValue] == 0 && [statusCode isEqualToString:@"OK"]) {
NSDictionary *results = [[aDic objectForKey:@"results"]objectForKey:longUrl];
NSString *shortUrl = [results objectForKey:@"shortUrl"];
aaa = shortUrl;
} else {
aaa = longUrl;
}
} else {
aaa = longUrl;
}
return aaa;
}

@end

9/12/2011

NSXMLParserとBitlyAPIを使って短縮URLを作る

BitlyShortURLというNSObjectのサブクラスを作る。

まずはBitlyShortURL.h

#import <Foundation/Foundation.h>

@interface BitlyShortURL : NSObject <NSXMLParserDelegate>
{
NSString *_baseURL; //短縮される元URL
NSString *_resultURL; //APIによって短縮されたURL
}
- (id)initWithLongURL:(NSString *)longURL; //URLを使って初期化
- (NSString *)parse; //パースして短縮URLを返す

@end

次にBitlyShortURL.m

#import "BitlyShortURL.h"

static NSString *kBitlyWrapperString = @"http://api.bit.ly/shorten?version=2.0.1&format=xml&longUrl=";
static NSString *kBitlyFootterString = @"&login=ログイン名&apiKey=APIキー";

@implementation BitlyShortURL

- (NSString *)returnLink:(NSString *)str{
return (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
}

- (id)initWithLongURL:(NSString *)longURL{
self = [super init];
if (self) {
NSString *str = [NSString stringWithFormat:@"%@%@%@",kBitlyWrapperString,[self returnLink:longURL],kBitlyFootterString];
_baseURL = [[NSString alloc]initWithString:str];
NSLog(@"%@",_baseURL);
_resultURL = @"error";
}
return self;
}

- (NSString *)parse{
NSURL *url = [NSURL URLWithString:_baseURL];
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:url];
[parser setDelegate:self];
[parser parse];
if (_resultURL == nil) {
_resultURL = @"error";
}
return _resultURL;
}

- (void)dealloc{
[_baseURL release],_baseURL = nil;
[_resultURL release],_resultURL = nil;
[super dealloc];
}

#pragma mark -
#pragma mark NSXMLParserDelegate Protocol

- (void)parserDidStartDocument:(NSXMLParser *)parser{
}
- (void)parserDidEndDocument:(NSXMLParser *)parser{
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
attributes:(NSDictionary *)attributeDict {
NSLog(@"<%@>",elementName);
if ([elementName isEqualToString:@"shortUrl"]) {
[_resultURL release],_resultURL = nil;
}
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
NSLog(@"%@",string);
if (_resultURL == nil) {
_resultURL = [[NSString alloc]initWithString:string];
}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
NSLog(@"</%@>",elementName);
}

@end

パースされた要素の通り、他にも色々な情報があるがとりあえず短縮URLを手に入れたい!って時にこれから始める。
異常時には結果に@"error"が入るので、これを後続の条件分岐に使うと良い。

bitlyのReferenceはGoogleCodeでどうぞ。