2015-03-02 1 views
0

Я пытаюсь попасть в конечную точку media/upload, чтобы загрузить изображение в твиттер. Я подписываю запрос с классом PFTwitterUtils Parse.com. Проводка твит к statuses/update работает отлично, но media/upload конечная точка продолжает возвращаться ошибка аутентификации:Как добавить медиа в Tweet, используя Parse.com и PFTwitterUtils?

{ 
    "errors": [ 
     { 
      "message": "Could not authenticate you.", 
      "code": 32 
     } 
    ] 
} 

Я удостоверился, что у меня есть действительный маркер OAuth для пользователя и данные, переданные в теле POST кодируется Base64.

Вот мой код:

NSURL *url = [NSURL URLWithString:@"https://upload.twitter.com/1.1/media/upload.json"]; 
NSData *imageData = UIImageJPEGRepresentation(imageToUpload, 1.0); 
NSString *postString = [NSString stringWithFormat:@"media=%@", [[imageData base64EncodedStringWithOptions:kNilOptions] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
request.HTTPBody = [postString dataUsingEncoding:NSUTF8StringEncoding]; 
[request setHTTPMethod:@"POST"]; 

[[PFTwitterUtils twitter] signRequest:request]; 

NSLog(@"Sending twitter request..."); 
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
    NSLog(@"Got twitter response"); 
    NSLog(@"Response: %@", response); 
    NSError *jsonSerializationError; 
    NSDictionary *mediaDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonSerializationError]; 
}]; 

ответ

0

Я нашел этот старый Parse.com форум пост, который объяснил, как загрузить изображение с теперь устаревшей statuses/update_with_media конечной точки: https://parse.com/questions/how-to-upload-image-to-twitter-using-pftwitterutils-signrequest

я понял, что я подписывал мой правильно запросить синтаксический анализ, но конечная точка ожидает запроса POST multipart/form-data. После правильного форматирования запроса я смог сделать действительный запрос на конечную точку media/upload и получить значение media_id.

Ниже мой последний рабочий код:

NSURL *mediaURL = [NSURL URLWithString:@"https://upload.twitter.com/1.1/media/upload.json"]; 

UIImage *imageToUpload = [UIImage ...] 

NSData *imageData = UIImageJPEGRepresentation(imageToUpload, 1.0); 

NSMutableURLRequest *mediaRequest = [NSMutableURLRequest requestWithURL:mediaURL]; 
[mediaRequest setHTTPMethod:@"POST"]; 

NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[mediaRequest addValue:contentType forHTTPHeaderField:@"Content-Type"]; 

// body 
NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"media\"; filename=\"image.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:imageData]; 
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

[mediaRequest setHTTPBody:body]; 

[[PFTwitterUtils twitter] signRequest:mediaRequest]; 

NSLog(@"Sending twitter request..."); 
[NSURLConnection sendAsynchronousRequest:mediaRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
    NSString *mediaIdString; 
    if (data && !connectionError) { 
     NSError *jsonSerializationError; 
     NSDictionary *mediaDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonSerializationError]; 
     if (!jsonSerializationError) { 
      mediaIdString = mediaDict[@"media_id_string"]; 
     } else { 
      NSLog(@"JSON serialization error: %@", jsonSerializationError); 
     } 
    } else { 
     NSLog(@"Error hitting media/upload endpoint: %@", connectionError); 
    } 

    // add that media_id to a tweet using the statuses/update endpoint 
}]; 

Полезного Twitter API Документация Ссылки:

https://dev.twitter.com/rest/public/uploading-media

https://dev.twitter.com/rest/reference/post/media/upload

Я надеюсь, что этот пост является полезным для других разработчиков, использующих Разбор .com.

+0

Не работает для меня, я преобразовал его быстрым и я не думаю, что я сделал ошибки :( –

+0

You должен задать новый вопрос, может быть, Parse и Twitter изменили свои API-интерфейсы? – JAL

+0

Спасибо за ответ, я продолжал делать это, но не перед тем, как попробовать снова с новым умом. Он действительно работал, но я не знал, что вам нужно использовать изображение в статусе, чтобы увидеть его в твиттере, и я ошибочно печатал ответ вместо данных. –

0

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

func post (tweetString: String, tweetImage: NSData) { 

    let uploadUrl = NSURL(string: "https://upload.twitter.com/1.1/media/upload.json") 

    let uploadRequest = NSMutableURLRequest(URL: uploadUrl!) 
    uploadRequest.HTTPMethod = "POST" 

    let stringBoundary = "---------------------------14737809831466499882746641449" 
    let contentType = "multipart/form-data; boundary=\(stringBoundary)" 
    uploadRequest.addValue(contentType, forHTTPHeaderField:"Content-Type") 

    let body = NSMutableData() 
    body.appendData("--\(stringBoundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    body.appendData("Content-Disposition: form-data; name=\"media\"; filename=\"a.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    body.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    body.appendData(tweetImage) 
    body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    body.appendData("--\(stringBoundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    uploadRequest.HTTPBody = body 

    PFTwitterUtils.twitter()!.signRequest(uploadRequest) 

    NSURLConnection.sendAsynchronousRequest(uploadRequest, queue: NSOperationQueue.mainQueue(), 
     completionHandler: { (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in 

      print(NSString(data: data!, encoding: NSUTF8StringEncoding)) 
      // Here you need to post the status 

    }) 

Я создал суть со всей реализации, никто не должен тратить часы, как я сделал https://gist.github.com/ralcr/94361dcf32a9780db214

Смежные вопросы