gpt4 book ai didi

ios - 使用 SLRequest 在推文中发布图片 - 图片未显示

转载 作者:可可西里 更新时间:2023-11-01 17:16:19 25 4
gpt4 key购买 nike

我正在尝试使用 SLRequest 以编程方式将图像(从 iOS 设备)上传到用户的 Twitter 帐户。推文文本已上传到推文中,但图片从未出现。响应状态码为200。

显然基础工作正常,否则推文根本不会显示在用户的流中,我已经检查过图像已找到并且 (NSData) 变量包含预期的字节数。

查看以下代码 - 正如您从注释掉的代码中看到的那样,我尝试了各种不同的修改但均未成功...感谢任何想法/帮助!

- (void) postToTwitter:(NSString *)postMessage withImageNamed:(NSString *)imageName {

// Get Twitter account
ACAccountStore *smAccount = [[ACAccountStore alloc] init];
ACAccountType *smType = [smAccount accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

NSDictionary *postOptions = nil;

// Attempt to post the postMessage
[smAccount requestAccessToAccountsWithType:smType options:postOptions completion:^(BOOL accessGranted, NSError *error) {

// Access code block

if (accessGranted) {

NSLog(@"Access permitted");

NSArray *smAccountList = [smAccount accountsWithAccountType:smType];

if ([smAccountList count] > 0) {

// Get the first Twitter account
ACAccount *postingAccount = [smAccountList lastObject];

// Create the post request
//SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update.json"] parameters:[NSDictionary dictionaryWithObject:postMessage forKey:@"status"]];
//SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://upload.twitter.com/1.1/media/upload.json"] parameters:nil];
SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update.json"] parameters:nil];

// Add image to post
// TODO - Check which to use >
UIImage *postImage = [UIImage imageNamed:imageName];
//UIImage *postImage = [UIImage imageWithContentsOfFile:imageName];
//NSData *imageData = UIImageJPEGRepresentation (postImage, 0.5f); // Set compression

NSData *imageData = UIImagePNGRepresentation(postImage);

//[postRequest addMultipartData:imageData withName:@"media" type:@"image/png" filename:@"image.png"];
[postRequest addMultipartData:imageData withName:@"media[]" type:@"multipart/form-data" filename:@"image.png"];

// Add text
[postRequest addMultipartData:[postMessage dataUsingEncoding:NSUTF8StringEncoding] withName:@"status" type:@"multipart/form-data" filename:nil];

// Execute the post
[postRequest setAccount:postingAccount];
[postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

// Post code block
if (error) {

NSLog(@"Post failed - %@", error);

if (_delegate && [_delegate respondsToSelector:@selector(didNotPost:)])
[_delegate didNotPost:self];
} else {

NSLog(@"Post complete");

if (_delegate && [_delegate respondsToSelector:@selector(didPost:)])
[_delegate didPost:self];
}
}];
}
} else {

NSLog(@"Access denied - %@", error);

if (_delegate && [_delegate respondsToSelector:@selector(didNotPost:)])
[_delegate didNotPost:self];
}


} ];
}

这是响应:

(lldb) po urlResponse
<NSHTTPURLResponse: 0x7fb9bf80> { URL: https://api.twitter.com/1.1/statuses/update.json } { status code: 200, headers {
"Cache-Control" = "no-cache, no-store, must-revalidate, pre-check=0, post-check=0";
"Content-Disposition" = "attachment; filename=json.json";
"Content-Encoding" = gzip;
"Content-Length" = 751;
"Content-Type" = "application/json;charset=utf-8";
Date = "Thu, 02 Apr 2015 17:14:20 GMT";
Expires = "Tue, 31 Mar 1981 05:00:00 GMT";
"Last-Modified" = "Thu, 02 Apr 2015 17:14:20 GMT";
Pragma = "no-cache";
Server = "tsa_b";
"Set-Cookie" = "lang=en";
Status = "200 OK";
"Strict-Transport-Security" = "max-age=631138519";
"x-access-level" = "read-write";
"x-connection-hash" = 6f61f3c96ba990931cca3fa950a42b38;
"x-content-type-options" = nosniff;
"x-frame-options" = SAMEORIGIN;
"x-response-time" = 51;
"x-transaction" = b2c77803db7e996d;
"x-tsa-request-body-time" = 426;
"x-twitter-response-tags" = BouncerCompliant;
"x-xss-protection" = "1; mode=block";
} }

最佳答案

在我发布这篇文章时,update_with_media 已被弃用。虽然它现在可以正常工作,但将来可能会突然停止 - 这可能会导致您的应用将来无法正常工作。

在大量阅读 Twitter 的 API 文档后,我设法在不使用“update_with_media”的情况下使其工作。

上传图片(或视频)涉及的过程是:

  1. Use /media/upload.json SLRequest to first upload the media (image or video). Use nil parameters and add the image using "addMultipartData" method of SLRequest.

  2. Call performRequestWithHandler on that SLRequest.

  3. Wait for response from twitter to get the "Media ID" from the responseData (convert the data into JSON format) and retrieve "media_id_string" into an NSString.

  4. Initiate another SLRequest with /statuses/update.json and attach the Media ID (key:media_ids) into the parameters dictionary together with the status text (key:status).

NSDictionary *parameters = @{@"status": @"See my image:",
@"media_ids": mediaID };
  1. Call performRequestWithHandler on the second SLRequest to submit the tweet.

有关详细代码,请参阅我的教程博客:http://xcodenoobies.blogspot.my/2016/01/how-to-using-slrequest-to-upload-image.html

关于ios - 使用 SLRequest 在推文中发布图片 - 图片未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29419001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com