代码之家  ›  专栏  ›  技术社区  ›  JAL

如何使用Parse.com和PFTwitterUtils将媒体添加到Tweet?

  •  0
  • JAL  · 技术社区  · 10 年前

    我正试着打 media/upload 端点将图像上传到twitter。我正在用Parse.com的 PFTwitterUtils 班将推文发布到 statuses/update 工作得很好,但 媒体/上传 端点始终返回身份验证错误:

    {
        "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];
    }];
    
    2 回复  |  直到 10 年前
        1
  •  0
  •   JAL    10 年前

    我找到了这个旧的Parse.com论坛帖子,它解释了如何上传一张现在已弃用的图片 statuses/update_with_media 端点: https://parse.com/questions/how-to-upload-image-to-twitter-using-pftwitterutils-signrequest

    我意识到我用parse正确地签署了我的请求,但端点需要一个 multipart/form-data POST请求。正确格式化请求后,我能够向 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

    我希望这篇文章对使用Parse.com平台的其他开发人员有用。

        2
  •  0
  •   Cristi Băluță    9 年前

    这是移植到swift的代码,它可以工作,但请记住,您需要在状态更新中使用图像,否则不会在twitter上显示。

    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