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

2011年9月14日水曜日

メモ的: Twitterのhome_timelineの情報を無理矢理4storeに入れてみる(いろんな意味でいろいろ間違ってるとは思う)

  • OAuthConsumerフレームワーク('#import <OAuthConsumer/OAuthConsumer.h>')についてはこちら
  • 4storeのクライアントライブラリ(っぽいなにか)('#import "FourStore.h"')についてはこちら

    #import "TwTurtleAppDelegate.h"
    #import <OAuthConsumer/OAuthConsumer.h>
    #import "FourStore.h"

    @implementation TwTurtleAppDelegate

    @synthesize window;

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
    OAConsumer *consumer = [[OAConsumer alloc] initWithKey:@"XXXXXXXXXXXXXXXXXXXXXX"
    secret:@"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"];

    OAToken *accessToken= [[OAToken alloc] initWithKey:@"XXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    secret:@"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"];

    NSURL *url= [NSURL URLWithString:@"http://api.twitter.com/1/statuses/home_timeline.xml"];
    OAMutableURLRequest *requestWithBodyParams = [[[OAMutableURLRequest alloc] initWithURL:url
    consumer:consumer
    token:accessToken
    realm:nil
    signatureProvider:nil] autorelease];

    OADataFetcher *fetcher = [[[OADataFetcher alloc] init] autorelease];

    [fetcher fetchDataWithRequest:requestWithBodyParams
    delegate:self
    didFinishSelector:@selector(apiTicket:didFinishWithData:)
    didFailSelector:@selector(apiTicket:didFailWithError:)];

    }
    - (void)fourstoreWithTurtle:(NSString *)turtle
    {
    FourStore *store= [[FourStore alloc] initWithEndpoint:@"http://localhost:8000/sparql/"];
    [store addPrefix:@"tsp" uri:@"http://example.org/twitter/status/predicate/"];
    [store addPrefix:@"tu" uri:@"http://example.org/twitter/users/"];

    NSString *message0= [store deleteWithGraph:@"http://example.org/twitter/status/"];
    NSLog(@"message0 %@", message0);


    NSString *message1= [store addTurtle:turtle graph:@"http://example.org/twitter/status/"];
    NSLog(@"message1 %@", message1);

    NSString *message2= [store queryWithString:
    @"SELECT ?s ?p ?o \nWHERE {\nGRAPH <http://example.org/twitter/status/> {\n?s ?p ?o .\n}\n}\n"];
    NSLog(@"message2 \n%@", message2);

    }
    - (NSString *)createTurtleWithXMLData:(NSData *)data
    {
    NSMutableString *turtle= [NSMutableString string];

    NSXMLDocument *document = [[[NSXMLDocument alloc] initWithData:data
    options:NSXMLDocumentTidyHTML
    error:NULL] autorelease];
    NSError *error= nil;
    NSArray *nodes = [document nodesForXPath:@"//status" error:&error];
    NSEnumerator *nodesEnum= [nodes objectEnumerator];
    NSXMLNode *node= nil;
    while(node= [nodesEnum nextObject]) {
    NSArray *idnodes= [node nodesForXPath:@"id" error:&error];
    if ([idnodes count]==0) continue;
    NSString *idString= [[idnodes objectAtIndex:0] stringValue];
    NSEnumerator *childrenEnum= [[node children] objectEnumerator];
    NSXMLNode *child=nil;
    while(child= [childrenEnum nextObject]) {
    NSString *name= [child name];
    if ([name isEqualToString:@"id"])
    continue;
    NSString *value= nil;
    if ([name isEqualToString:@"retweeted_status"]){
    NSArray *cidnodes= [child nodesForXPath:@"id" error:&error];
    if ([cidnodes count]==0) continue;
    NSString *cidString= [[cidnodes objectAtIndex:0] stringValue];
    value= [NSString stringWithFormat:@"<%@>", cidString];
    } else if ([name isEqualToString:@"user"]){
    NSArray *cidnodes= [child nodesForXPath:@"id" error:&error];
    if ([cidnodes count]==0) continue;
    NSString *cidString= [[cidnodes objectAtIndex:0] stringValue];
    value= [NSString stringWithFormat:@"<tu:%@>", cidString];
    } else {
    if ([[child stringValue] length]==0) continue;
    value= [child stringValue];
    value= [value stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
    value= [value stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
    value= [NSString stringWithFormat:@"\"%@\"", value];
    }

    [turtle appendFormat:@"<%@> tsp:%@ %@ .\n", idString, name, value];
    }
    }


    return turtle;
    }
    - (void)apiTicket:(OAServiceTicket *)ticket
    didFinishWithData:(NSData *)data
    {

    if (0)
    NSLog(@"didFinish %@", [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);

    NSString *turtle= [self createTurtleWithXMLData:data];

    if (0)
    NSLog(@"\n%@", turtle);

    [self fourstoreWithTurtle:turtle];
    }
    - (void)apiTicket:(OAServiceTicket *)ticket
    didFailWithError:(NSError *)error
    {

    NSLog(@"%@", error);
    }
    @end



    やってみてアレコレ悩んだ足跡.
  • 2011年8月9日火曜日

    OAuthConsumer.frameworkを使う(TwitterへPOST)

    動機
    前回の物を使ってみるため,あちらこちらのサンプルを継ぎ接ぎして(例えば)以下の様にしたら動いた..

    やってみた.
    フレームワークの追加

    ~/Library/Frameworks/のOAuthConsumer.frameworkを追加
    /System/Library/Framewokrs/のSecurity.frameworkを追加


    フレームワークの利用のためのHeader
    
    
    #import <OAuthConsumer/OAuthConsumer.h>



    インスタンス変数
    
    
    OAConsumer *consumer;
    OAToken *accessToken;


    インスタンス変数の初期化
    
    
    consumer = [[OAConsumer alloc] initWithKey:@"[Consumer Key]"
    secret:@"[Consumer Secret Key]"];
    accessToken= nil;

    Consumer Key/Consumer Secret KeyはTwitterの開発者サイトで登録し取得する.

    ConsumerKey/ConsumerSecretKeyからRequestTokenを取得へ
    
    
    - (void)requestRequestToken
    {
    NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/oauth/request_token"];

    OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url
    consumer:consumer
    token:nil
    realm:nil
    signatureProvider:nil];

    [request setHTTPMethod:@"POST"];

    OADataFetcher *fetcher = [[[OADataFetcher alloc] init] autorelease];

    [fetcher fetchDataWithRequest:request
    delegate:self
    didFinishSelector:@selector(requestTokenTicket:didFinishWithData:)
    didFailSelector:@selector(requestTokenTicket:didFailWithError:)];
    }
    - (void)requestTokenTicket:(OAServiceTicket *)ticket
    didFinishWithData:(NSData *)data
    {
    if (ticket.didSucceed) {

    }
    }
    - (void)requestTokenTicket:(OAServiceTicket *)ticket
    didFailWithError:(NSError *)error
    {
    NSLog(@"%@", error);
    }

    RequestTokenから認証のWebページ(PIN)の取得へ
    
    
    - (void)requestTokenTicket:(OAServiceTicket *)ticket
    didFinishWithData:(NSData *)data
    {
    if (ticket.didSucceed) {
    OAMutableURLRequest *request;
    NSString *responseBody = [[NSString alloc] initWithData:data
    encoding:NSUTF8StringEncoding];

    if (accessToken != nil) {
    [accessToken release];
    accessToken = nil;
    }

    accessToken = [[OAToken alloc] initWithHTTPResponseBody:responseBody];
    [responseBody release];

    NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/oauth/authorize"];

    request = [[[OAMutableURLRequest alloc] initWithURL:url
    consumer:consumer
    token:accessToken
    realm:nil
    signatureProvider:nil] autorelease];


    OARequestParameter *p0 = [[OARequestParameter alloc] initWithName:@"oauth_token"
    value:accessToken.key];
    NSArray *params = [NSArray arrayWithObject:p0];
    [request setParameters:params];

    [[NSWorkspace sharedWorkspace] openURL:[request URL]];

    [p0 release];
    }
    else {

    }

    }


    (デフォルトブラウザでURLが開かれる.ここではTwitterサイトでの認証であり数字キー(PIN)が手に入る

    PINからAccessTokenの取得へ
    
    
    - (void)authorizationWithPin:(NSString *)pin
    {
    OAMutableURLRequest *request;
    OADataFetcher *fetcher;

    NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"];

    request = [[[OAMutableURLRequest alloc] initWithURL:url
    consumer:consumer
    token:accessToken
    realm:nil
    signatureProvider:nil] autorelease];


    OARequestParameter *p0 = [[OARequestParameter alloc] initWithName:@"oauth_token"
    value:accessToken.key];
    OARequestParameter *p1 = [[OARequestParameter alloc] initWithName:@"oauth_verifier"
    value:pin];
    NSArray *params = [NSArray arrayWithObjects:p0, p1, nil];
    [request setParameters:params];

    fetcher = [[[OADataFetcher alloc] init] autorelease];

    [fetcher fetchDataWithRequest:request
    delegate:self
    didFinishSelector:@selector(accessTokenTicket:didFinishWithData:)
    didFailSelector:@selector(accessTokenTicket:didFailWithError:)];

    [p0 release];
    [p1 release];
    }
    - (void)accessTokenTicket:(OAServiceTicket *)ticket
    didFinishWithData:(NSData *)data
    {
    if (ticket.didSucceed) {

    }
    }
    - (void)accessTokenTicket:(OAServiceTicket *)ticket
    didFailWithError:(NSError *)error
    {
    NSLog(@"%@", error);
    }

    accessTokenを生成してDefaultUserInfoへ保存
    
    
    - (void)accessTokenTicket:(OAServiceTicket *)ticket
    didFinishWithData:(NSData *)data
    {
    if (ticket.didSucceed) {
    NSString *responseBody = [[NSString alloc] initWithData:data
    encoding:NSUTF8StringEncoding];

    if (accessToken != nil) {
    [accessToken release];
    accessToken = nil;
    }

    accessToken = [[OAToken alloc] initWithHTTPResponseBody:responseBody];
    [responseBody release];

    [accessToken storeInUserDefaultsWithServiceProviderName:@"NAME"
    prefix:@"KEY"];

    }
    }


    (ちなみにDeaultUserInfoから取り出すときは

    accessToken= [[OAToken alloc] initWithUserDefaultsUsingServiceProviderName:@"NAME"
    prefix:@"KEY"];
    )

    accessTokenを使ってPOSTしてみる

     NSString *message= @"Hello World!";

    NSURL *url= [NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.xml"];
    OAMutableURLRequest *requestWithBodyParams = [[[OAMutableURLRequest alloc] initWithURL:url
    consumer:consumer
    token:accessToken
    realm:nil
    signatureProvider:nil] autorelease];
    NSString *encodedParameterPairs= [NSString stringWithFormat:@"status=%@", [message URLEncodedString]];
    NSData *requestData = [encodedParameterPairs dataUsingEncoding:NSASCIIStringEncoding
    allowLossyConversion:YES];
    [requestWithBodyParams setHTTPBody:requestData];
    [requestWithBodyParams setValue:[NSString stringWithFormat:@"%d", [requestData length]]
    forHTTPHeaderField:@"Content-Length"];
    [requestWithBodyParams setValue:@"application/x-www-form-urlencoded"
    forHTTPHeaderField:@"Content-Type"];
    [requestWithBodyParams setHTTPMethod:@"POST"];

    OADataFetcher *fetcher = [[[OADataFetcher alloc] init] autorelease];

    [fetcher fetchDataWithRequest:requestWithBodyParams
    delegate:self
    didFinishSelector:@selector(apiTicket:didFinishWithData:)
    didFailSelector:@selector(apiTicket:didFailWithError:)];
    - (void)apiTicket:(OAServiceTicket *)ticket
    didFinishWithData:(NSData *)data
    {

    }
    - (void)apiTicket:(OAServiceTicket *)ticket
    didFailWithError:(NSError *)error
    {
    NSLog(@"%@", error);
    }


    結果
    http://twitter.com/#!/p_g_/status/100810688833912833

    OAuthConsumer.frameworkを設置(インストール)してみる

    動機
    OAuth周りのCocoaの実装であるOAuthConsumer.frameworkというのを知ったのでインストールしてみる.

    やってみた
    コンソールで以下を実行.obj-cフォルダが出来上がる.
    > svn checkout http://oauth.googlecode.com/svn/code/obj-c



    checkoutしたフォルダ内の以下を開く(Xcode).
    obj-c/OAuthConsumer/OAuthConsumer.xcodeproj



    コンパイル
    Build for Running


    OAuthConsumer.frameworkを確認

    Finderでの表示.



    インストール先をターミナルで開く
    > mkdir -p ~/Library/Frameworks
    > open ~/Library/Frameworks/



    OAuthConsumer.framework をドラッグして ~/Library/Frameworks/ へドロップ



    できた.