Ограничение скорости API Twitter - Преодоление неподтвержденного JSON Get с Objective C? - PullRequest
0 голосов
/ 10 января 2011

Я вижу ограничение скорости 150 / час на IP.Это было бы хорошо, но мое приложение находится в сети мобильного телефона (с общими IP-адресами).

Я бы хотел запросить тенденции в твиттере, например, GET / trend / 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]];


}

Однако я не представляю, как бы я создал этот запрос как аутентифицированный, и не видел в Интернете никаких примеров этого эффекта.,

Я прочитал документацию OAuth в твиттере, но все еще озадачен тем, как это должно работать.Я экспериментировал с OAuth, используя предварительно созданную библиотеку Бена Готтлиба, и вызывал это в моем первом viewDidLoad:

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

Это должно хранить все ключи, необходимые в настройках приложения, мне просто нужно знать, как создатьПОЛУЧИТЬ запрос после авторизации!

Может быть, это просто невозможно?Может, мне придется прокси-запросы через приложение на стороне сервера?

Любое понимание будет оценено!

Ответы [ 2 ]

0 голосов
/ 11 января 2011

Хорошо, после долгих поисков мне удалось понять, как программно построить запрос к JSON API в XCode.Во-первых, вам нужно использовать демонстрационный код OAuth для аутентификации и авторизации вашего приложения.

Затем вы получите ключ, выполнив: [prefs stringForKey: @ "authData"] - если его не существует, вы не были должным образом OAuth.

Мне пришлось провести обратный инжиниринг, просматривая код библиотеки OAuth, и хотя библиотеку легко использовать для таких вещей, как отправка обновления статуса, она не позволяет вам получать тренды ...:

#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];
}

}

Остальное реализовано как стандартное соединение URL с методами didReceiveData и т. Д. Я не проверял, что это облегчает мои проблемы с ограничением скорости, но эй .. Этоначало, если у кого-то есть подобные проблемы.

0 голосов
/ 11 января 2011

Авторизация через OAuth предоставит вам токен авторизации, который вам нужно будет передать каждому последующему запросу.

Обратитесь к документации в Twitter, прочитайте о том, как работает авторизация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...