2011-01-10 7 views
0

レート制限はIPあたり150/hrです。これは問題ありませんが、私のアプリケーションは(共有IPアドレスを持つ)携帯電話ネットワーク上にあります。Twitter APIレート制限 - 認証されていないJSONで克服Objective Cを取得するには?

Twitterの傾向をクエリしたいと思います。 GET/trends/1/json。 これは認証を必要としませんが、ユーザーが最初にOAuthを使用してアプリケーションを承認した後、JSON APIを実行するとどうなりますか?

- (void) queryTrends:(NSString *) WOEID { 

NSString *urlString = [NSString stringWithFormat:@"http://api.twitter.com/1/trends/%@.json", WOEID]; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSURLRequest *theRequest=[NSURLRequest requestWithURL:url 
      cachePolicy:NSURLRequestUseProtocolCachePolicy 
      timeoutInterval:10.0]; 


NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 
if (theConnection) { 
    // Create the NSMutableData to hold the received data. 
    theData = [[NSMutableData data] retain]; 
} else { 
    NSLog(@"Connection failed in Query Trends"); 
} 

//NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; 


} 

私はしかし、認証されたものとして、この要求を構築したい、とオンラインこの効果に任意の例を見ていないか見当がつかない:次のように

要求が構築されています。

私はtwitter OAuthのドキュメントを読んだことがありますが、どのように動作するべきかについてはまだ困惑しています。

OAuthViewController *oAuthVC = [[OAuthViewController alloc] 
     initWithNibName:@"OAuthTwitterDemoViewController" bundle:[NSBundle mainBundle]]; 
// [self setViewController:aViewController]; 
[[self navigationController] pushViewController:oAuthVC animated:YES]; 

これは、アプリの設定で必要なすべてのキーを格納しなければならない、私はちょうどGETを構築する方法を知っておく必要があります:私はベン・ゴットリーブの事前に作成ライブラリを使用してのOAuthを試し、そして私の最初のviewDidLoadでこれを呼び出しました 許可後にリクエストしてください!

多分これは不可能でしょうか?たぶん私はサーバー側のアプリケーションを介して要求をプロキシする必要がありますか?

任意の洞察力をいただければ幸いです!

+0

グラハム – Cian

答えて

0

OAuthによる認証は、後で行う各リクエストに渡す必要がある認証トークンを提供します。

認可の仕組みについては、Twitterのドキュメントを参照してください。

+0

http://dev.twitter.com/pages/auth#auth-request ..プログラム的に、これらのパラメータをそれぞれヘッダーとして設定します私の上記 'theRequest' GETリクエストの属性? – Cian

+0

待って、いいえ。計算されるべき他のものの全束も。 SA_OAuthTwitterEngineを使ってこれを行うことはできますか? OAuthとの最初の接続方法の例がたくさん見つかりましたが、それが完了した後にリクエストを作成する方法はありません。:-( – Cian

0

多くの検索の後、私はXcodeでプログラムでJSON APIへのリクエストを作成する方法を考えました。 まず、OAuthデモコードを使用してアプリケーションを認証し、認証する必要があります。

[prefs stringForKey:@ "authData"] - これが存在しない場合、あなたは正しくOAuthされていません。

OAuthライブラリのコードを見てリバースエンジニアリングしなければなりませんでしたが、状態更新を送信するなどの目的でライブラリを使用するのは簡単ですが、トレンドを取得することはできません...:

残りはdidReceiveData法などの標準URL接続として実装されている

#import "OAMutableURLRequest.h" 
#import "MGTwitterHTTPURLConnection.h" 
NSMutableString *dataString; 

    // Using OAuth: 


OAConsumer *consumer = [[OAConsumer alloc] initWithKey:@"YOURCONSUMERKEY" 
               secret:@"YOURCONSUMERSECRET"]; 

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSString *authData = [prefs stringForKey:@"authData"]; 
// [_engine 

OAMutableURLRequest *theRequest = [[[OAMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://stream.twitter.com/1/statuses/filter.json"] 
                    consumer:consumer 
                     token: (authData) ? [[OAToken alloc] initWithHTTPResponseBody:authData] : nil 
                     realm: nil 
                  signatureProvider:nil] autorelease]; 
[theRequest setHTTPMethod:@"POST"]; 
[theRequest setHTTPBody: [httpBody dataUsingEncoding:NSUTF8StringEncoding]]; 
[theRequest setHTTPShouldHandleCookies:NO]; 

// Set headers for client information, for tracking purposes at Twitter. 
[theRequest setValue:@"Trendy" forHTTPHeaderField:@"X-Twitter-Client"]; 
[theRequest setValue:@"1.0" forHTTPHeaderField:@"X-Twitter-Client-Version"]; 
[theRequest setValue:@"http://www.inisdesign.com"  forHTTPHeaderField:@"X-Twitter-Client-URL"]; 

// Set the request body if this is a POST request. 

[theRequest prepare]; 

// Create a connection using this request, with the default timeout and caching policy, 
// and appropriate Twitter request and response types for parsing and error reporting. 
MGTwitterHTTPURLConnection *connection; 
connection = [[MGTwitterHTTPURLConnection alloc] initWithRequest:theRequest 
                 delegate:self 
                requestType:MGTwitterFollowedTimelineRequest // Wrong type 
                responseType:MGTwitterStatuses]; // as above - doesnt seem to matter 


if (!connection) { 
    return; 
} else { 
    //  [_connections setObject:connection forKey:[connection identifier]]; 
    //  [connection release]; 
    dataString = [[NSMutableData data] retain]; 
    [connection start]; 
} 

} .. 私はこの問題を制限する私の率を軽減することで確認していませんが、誰もが持っている場合はちょっと...それはスタートです同様の問題。