2015-02-23 98 views
4

我正在尝试发布图像,并使用Twitters新的Twitterkit与自定义UI进行推文发布。他们提供的唯一文件是如何用他们的观点来做。使用twitterkit将图像发布到Twitter上

所以我可以找出如何做到这一点,不带图像

NSMutableDictionary *message = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[params objectForKey:@"description"],@"status",@"true",@"wrap_links", nil]; 

NSURLRequest* request = [twAPIClient URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:message error:nil]; 

[twAPIClient sendTwitterRequest:request completion:^(NSURLResponse* response, NSData* data, NSError* connectionError){ 



}]; 

但他们URLRequestWithMethod方法心不是可变的。我将如何添加图像。你曾经这样做与SLRequest

[postRequest addMultipartData:UIImageJPEGRepresentation(image, 0.5) withName:@"media" type:@"image/jpeg" filename:@"image.png"]; 

回答

7

我已经想通了。

首先你需要将图像发布到twitter。

NSString *media = @"https://upload.twitter.com/1.1/media/upload.json"; 

NSData *imageData = UIImageJPEGRepresentation(image, 0.9); 

NSString *imageString = [corgiData base64EncodedStringWithOptions:0];    

NSURLRequest *request = [client URLRequestWithMethod:@"POST" URL:media parameters:@{@"media":imageString} error:&requestError]; 

[[[Twitter sharedInstance] APIClient] sendTwitterRequest:request completion:^(NSURLResponse *urlResponse, NSData *data, NSError *connectionError) { 


}]; 

然后在响应对象中使用media_id_string并将其添加到我的问题中的代码参数。

所以

NSMutableDictionary *message = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[params objectForKey:@"description"],@"status",@"true",@"wrap_links",mediaIDString, @"media_ids", nil]; 

NSURLRequest* request = [twAPIClient URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:message error:nil]; 

[twAPIClient sendTwitterRequest:request completion:^(NSURLResponse* response, NSData* data, NSError* connectionError){ 

NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&parsingError]; 

}]; 

注意media_ids对象,它是第一次请求

NSMutableDictionary *message = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[params objectForKey:@"description"],@"status",@"true",@"wrap_links",[responseDict objectForKey:@"media_id_string"], @"media_ids", nil]; 

所以你可以把该完成的块里面,它会发布图片和鸣叫的响应。

+0

嗨,什么是'corgiData'和'client'变量? – 2015-05-10 13:43:28

2

夫特

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

    let uploadUrl = "https://upload.twitter.com/1.1/media/upload.json" 
    let updateUrl = "https://api.twitter.com/1.1/statuses/update.json" 
    let imageString = tweetImage.base64EncodedStringWithOptions(NSDataBase64EncodingOptions()) 
    let request = Twitter.sharedInstance().APIClient.URLRequestWithMethod("POST", 
     URL: uploadUrl, parameters: ["media": imageString], error: nil) 
    Twitter.sharedInstance().APIClient.sendTwitterRequest(request, completion: { (urlResponse, data, connectionError) -> Void in 

     if let mediaDict = self.nsdataToJSON(data!) { 
      let validTweetString = TweetValidator().validTween(tweetString) 
      let message = ["status": validTweetString, "media_ids": mediaDict["media_id_string"]] 
      let request = Twitter.sharedInstance().APIClient.URLRequestWithMethod("POST", 
       URL: updateUrl, parameters: message, error:nil) 

       Twitter.sharedInstance().APIClient.sendTwitterRequest(request, completion: { (response, data, connectionError) -> Void in 
      }) 
     } 
    }) 
} 

func nsdataToJSON (data: NSData) -> AnyObject? { 
    do { 
     return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) 
    } catch let myJSONError { 
     print(myJSONError) 
    } 
    return nil 
} 
3

如约2016年4月,织物的TwitterKit 2.0(或更高版本)公开了一个新的方法uploadMedia以覆盖所述媒体上传部分。这里是一些适用于我的objc代码。

(earlier) 
self.userID = [[Twitter sharedInstance] sessionStore].session.userID; 

- (void)tweetImage:(UIImage*)image { 
     NSAssert([NSThread currentThread].isMainThread && self.userID, @"Twitterkit needs main thread, with self.userID set"); 
     if (!self.userID) 
      return; 
     NSString *tweetStr = @"Look at me! I'm tweeting! #hashtag"; 

     TWTRAPIClient *twitterClient = [[TWTRAPIClient alloc] initWithUserID:self.userID]; 
     NSData *imgData = UIImageJPEGRepresentation(image, 0.6f); 
     if (!imgData) { 
      NSAssert(false, @"ERROR: could not make nsdata out of image"); 
      return; 
     } 
     [twitterClient uploadMedia:imgData contentType:@"image/jpeg" completion:^(NSString * _Nullable mediaID, NSError * _Nullable error) { 
      if (error) { 
       NSAssert(false, @"ERROR: error uploading collage to twitter"); 
       return; 
      } 

      NSError *urlerror = nil; 
      NSURLRequest *request = [twitterClient URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:@{ @"status":tweetStr, @"media_ids":mediaID } error:&urlerror]; 
      if (urlerror) { 
       NSAssert(false, @"ERROR creating twitter URL request: %@", urlerror); 
       return; 
      } 
      [twitterClient sendTwitterRequest:request completion:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 
       if (!connectionError && ((NSHTTPURLResponse*)response).statusCode != 200) { 
        DDLogInfo(@"TwitterHelper tweetImage: non-200 response: %d. Data:\n%@", (int)((NSHTTPURLResponse*)response).statusCode, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
       } 
      }]; 
     }]; 
    } 
+0

非常感谢:D – Claudio 2017-10-30 17:11:54

0

斯威夫特3最新

1)检查登录完成与否

let store = Twitter.sharedInstance().sessionStore 
if let store = store.session() { 
    print("signed in as \(String(describing: store.authToken))"); 
    print("signed in as \(String(describing: store.authTokenSecret))"); 
    let postImage = UIImage(named: "testImage") 
    let imageData = UIImagePNGRepresentation(postImage!) as Data? 

    self.post(tweetString: "Test post image", tweetImage: (imageData! as NSData) as Data, withUserID: store.userID) 
} 
else { 
    Twitter.sharedInstance().logIn(completion: { (session, error) in 
     if (session != nil) { 
      print("login first time in twitter as \(String(describing: session?.userName))"); 
     } else { 
      print("error: \(String(describing: error?.localizedDescription))"); 
     } 
    }) 
} 

2)上传图片文字

func post(tweetString: String, tweetImage: Data ,withUserID :String) { 

     let uploadUrl = "https://upload.twitter.com/1.1/media/upload.json" 
     let updateUrl = "https://api.twitter.com/1.1/statuses/update.json" 
     let imageString = tweetImage.base64EncodedString(options: NSData.Base64EncodingOptions()) 


     let client = TWTRAPIClient.init(userID: withUserID) 

     let requestUploadUrl = client.urlRequest(withMethod: "POST", url: uploadUrl, parameters: ["media": imageString], error: nil) 

     client.sendTwitterRequest(requestUploadUrl) { (urlResponse, data, connectionError) -> Void in 
      if connectionError == nil { 
       if let mediaDict = self.nsDataToJSON(data: (data! as NSData) as Data) as? [String : Any] { 
        let media_id = mediaDict["media_id_string"] as! String 
        let message = ["status": tweetString, "media_ids": media_id] 

        let requestUpdateUrl = client.urlRequest(withMethod: "POST", url: updateUrl, parameters: message, error: nil) 

        client.sendTwitterRequest(requestUpdateUrl, completion: { (urlResponse, data, connectionError) -> Void in 
         if connectionError == nil { 
          if let _ = self.nsDataToJSON(data: (data! as NSData) as Data) as? [String : Any] { 
           print("Upload suceess to Twitter") 
          } 
         } 

        }) 
       } 
      } 
     } 
    } 

注意:安装文件荚荚'TwitterKit'

进口TwitterKit