Проблемы с загрузкой фотографий в TwitPic с помощью OAuth в Objective C на iPhone - PullRequest
0 голосов
/ 02 июня 2010

Я работаю над приложением для iPhone, которое имеет функцию загрузки фотографий в TwitPic. У меня это работает с базовой аутентификацией.

Я пытаюсь заставить его работать с OAuth. Я получаю ошибки аутентификации. Я очень внимательно изучил документацию TwitPic.

Я авторизую приложение, отображая веб-интерфейс пользовательского интерфейса, и оно возвращает значение PIN-кода. Я ввожу значение PIN-кода в приложение и запрашиваю токен.

Я могу загружать обновления статуса в Твиттер, но не фотографии.

Мой код основан на следующем примере кода:

Пример приложения для iPhone с использованием OAuth

Вот мой код:

NSString *url = @"http://api.twitpic.com/2/upload.json";
NSString *oauth_header = [oAuth oAuthHeaderForMethod:@"POST" andUrl:url andParams:nil];

NSLog(@"OAuth header : %@\n\n", oauth_header);

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
[request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"];
request.requestMethod = @"POST";

[request addRequestHeader:@"X-Auth-Service-Provider" value:@"https://api.twitter.com/1/account/verify_credentials.json"];   

[request addRequestHeader:@"X-Verify-Credentials-Authorization" value:oauth_header];    

NSData *imageRepresentation = UIImageJPEGRepresentation(imageToUpload, 0.8);        
[request setData:imageRepresentation forKey:@"media"];
[request setPostValue:@"Some Message"  forKey:@"message"];  
[request setPostValue:TWITPIC_API_KEY  forKey:@"key"];  

[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestFailed:)];

[request start];    

Вот заголовок OAuth:

OAuth realm="http://api.twitter.com/", oauth_timestamp="1275492425", oauth_nonce="b686f20a18ba6763ac52b689b2ac0c421a9e4013", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="zNbW3Xi3MuS7i9cpz6fw", oauth_version="1.0", oauth_token="147275699-jmrjpwk3B6mO2FX2BCc9Ci9CRBbBKYW1bOni2MYs", oauth_signature="d17HImz6VgygZgbcp845CD2qNnI%3D"

Ответы [ 4 ]

3 голосов
/ 06 мая 2011

Использование GSTwitPicEngine : https://github.com/Gurpartap/GSTwitPicEngine

Использование GSTwitPicEngine:

Инициализируйте двигатель по классу или по необходимости:

self.twitpicEngine = (GSTwitPicEngine *)[GSTwitPicEngine twitpicEngineWithDelegate:self];

Найдите токен авторизации и предоставьте twitpicEngine с:

[twitpicEngine setAccessToken:token];

Затем загрузить изображение и прикрепить к нему текстовое сообщение (не публиковать в твиттере):

[twitpicEngine uploadPicture:[UIImage imageNamed:@"mypic.png"]  withMessage:@"Hello world!"]; // This message is supplied back in success delegate call in request's userInfo.

Для загрузки только изображения:

[twitpicEngine uploadPicture:uploadImageView.image];

По окончании запроса вызывается один из методов делегата с соответствующими данными и информацией.


Протокол GSTwitPicEngineDelegate определяет два метода делегата:

- (void)twitpicDidFinishUpload:(NSDictionary *)response {
  NSLog(@"TwitPic finished uploading: %@", response);

  // [response objectForKey:@"parsedResponse"] gives an NSDictionary of the response one of the parsing libraries was available.
  // Otherwise, use [[response objectForKey:@"request"] objectForKey:@"responseString"] to parse yourself.

  if ([[[response objectForKey:@"request"] userInfo] objectForKey:@"message"] > 0 && [[response objectForKey:@"parsedResponse"] count] > 0) {
    // Uncomment to update status upon successful upload, using MGTwitterEngine's instance.
    // [twitterEngine sendUpdate:[NSString stringWithFormat:@"%@ %@", [[[response objectForKey:@"request"] userInfo] objectForKey:@"message"], [[response objectForKey:@"parsedResponse"] objectForKey:@"url"]]];
  }
}

и

- (void)twitpicDidFailUpload:(NSDictionary *)error {
  NSLog(@"TwitPic failed to upload: %@", error);

  if ([[error objectForKey:@"request"] responseStatusCode] == 401) {
    // UIAlertViewQuick(@"Authentication failed", [error objectForKey:@"errorDescription"], @"OK");
  }
}

Все готово?

3 голосов
/ 15 июня 2010

ХА! Я нашел это! Мы должны создать заголовок с https://api.twitter.com/1/account/verify_credentials.json и опубликовать http://api.twitpic.com/2/upload.json! (и использовать GET)

    NSString *fakeurl = @"https://api.twitter.com/1/account/verify_credentials.json";
NSString *oauth_header = [oAuth oAuthHeaderForMethod:@"GET" andUrl:fakeurl andParams:nil];

NSLog(@"OAuth header : %@\n\n", oauth_header);

NSString *url = @"http://api.twitpic.com/2/upload.json";
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
request.delegate = self;
[request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"];
request.requestMethod = @"GET";

[request addRequestHeader:@"X-Verify-Credentials-Authorization" value:oauth_header];    
[request addRequestHeader:@"X-Auth-Service-Provider" value:@"https://api.twitter.com/1/account/verify_credentials.json"];   


NSData *imageRepresentation = UIImageJPEGRepresentation([UIImage imageNamed:@"IMG_0717.jpg"], 0.2);    
if (imageRepresentation) {
    NSLog(@"Pic not nil");
}
[request setData:imageRepresentation forKey:@"media"];
[request setPostValue:@"twitpic, i hate you. die painfully."  forKey:@"message"];  
[request setPostValue:twitPicKey  forKey:@"key"];  

[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestFailed:)];

[request start];
0 голосов
/ 04 июля 2010

Спасибо, это помогло мне заставить его работать тоже :) Я также обновил http://github.com/jaanus/PlainOAuth с рабочим примером кода.

0 голосов
/ 10 июня 2010

Метод OAuth для генерации заголовка должен быть GET. НЕ ПОСТ.

Также URL должен быть https://api.twitter.com/1/account/verify_credentials.json

...