如何获取ios中的twitter个人资料图片?

我写了下面的代码:

NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1.1/users/show.json"]; NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:username, @"screen_name" ,[[controller.engine accessToken] secret]]; TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:params requestMethod:TWRequestMethodGET]; [request performRequestWithHandler: ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { if (responseData) { NSDictionary *user = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:NULL]; NSString *profileImageUrl = [user objectForKey:@"profile_image_url"]; NSLog(@"%@",profileImageUrl); } }]; 

但我总是最终得到一个Bad authentication错误。 我觉得我失去了一些东西。 任何人都请检查我的代码? 或提供任何build议来检索Twitter用户个人资料图片?

谢谢

你有没有考虑过使用第三方的Twitter引擎呢? 我用FHSTwitterEngine取得了相当的成功,似乎正在积极的开发中。

拉个人资料图片,你会做这样的事情:

 [[FHSTwitterEngine sharedEngine]permanentlySetConsumerKey:@"<consumer_key>" andSecret:@"<consumer_secret>"]; [[FHSTwitterEngine sharedEngine]showOAuthLoginControllerFromViewController:self withCompletion:^(BOOL success) { if (success) { UIImage *profileImg = [[FHSTwitterEngine sharedEngine] getProfileImageForUsername:@"<username>" andSize:size]; } }]; 

请注意,您应该login您的iOS设备才能使用此function:

 - (void)signIniwthTwitter { if ([TWTweetComposeViewController canSendTweet]) { // Set up the built-in twitter composition view controller. TWTweetComposeViewController *tweetViewController = [[TWTweetComposeViewController alloc] init]; // Create the completion handler block. [tweetViewController setCompletionHandler:^(TWTweetComposeViewControllerResult result) { [self dismissModalViewControllerAnimated:YES]; }]; // Present the tweet composition view controller modally. [self presentModalViewController:tweetViewController animated:YES]; } else { [self getTwitterAccountDetails]; } } - (void) getTwitterAccountDetails { [DejalBezelActivityView activityViewForView:self.navigationController.navigationBar.superview]; self.view.userInteractionEnabled = NO; self.connectionstatusLabel.text = @"Getting user details...."; // Create an account store object. ACAccountStore *accountStore = [[ACAccountStore alloc] init]; // Create an account type that ensures Twitter accounts are retrieved. ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; // Request access from the user to use their Twitter accounts. [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { #pragma unused (error) if(granted) { // Get the list of Twitter accounts. NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; // For the sake of brevity, we'll assume there is only one Twitter account present. // You would ideally ask the user which account they want to tweet from, if there is more than one Twitter account present. if ([accountsArray count] > 0) { // Grab the initial Twitter account to tweet from. ACAccount *twitterAccount = [accountsArray objectAtIndex:0]; NSLog(@"Account details %@",twitterAccount); _userid = [[twitterAccount valueForKey:@"properties"] valueForKey:@"user_id"]; _screenName = [twitterAccount valueForKey:@"username"]; NSLog(@"user id %@",_userid); [self getProfileDetailsFromTwitter]; } } }]; } - (void) getProfileDetailsFromTwitter { self.connectionstatusLabel.text = @"Getting user profile details...."; NSURL *twitterURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.twitter.com/1/users/show.json?user_id=%@&include_entities=true",_userid]]; TWRequest *postRequest = [[TWRequest alloc] initWithURL:twitterURL parameters:nil requestMethod:TWRequestMethodGET]; // Perform the request created above and create a handler block to handle the response. [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSString *output; if ([urlResponse statusCode] == 200) { // Parse the responseData, which we asked to be in JSON format for this request, into an NSDictionary using NSJSONSerialization. NSError *jsonParsingError = nil; NSDictionary *publicTimeline = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonParsingError]; NSLog(@"Twiiter Profile Deatils %@",publicTimeline); _twitterUserProfileDetails = [[MobileYakUser alloc]init]; _twitterUserProfileDetails.firstName = [publicTimeline objectForKey:@"name"]; _twitterUserProfileDetails.lastName = [publicTimeline objectForKey:@"name"]; output = [NSString stringWithFormat:@"HTTP response status: %i\nPublic timeline:\n%@", [urlResponse statusCode], publicTimeline]; NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/users/profile_image/"]; NSMutableDictionary *params = [[NSMutableDictionary alloc]init]; [params setValue:_screenName forKey:@"screen_name"]; [params setValue:@"original" forKey:@"size"]; TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:params requestMethod:TWRequestMethodGET]; [request performRequestWithHandler: ^(NSData *imageresponseData, NSHTTPURLResponse *imageFetchurlResponse, NSError *imageerror) { #pragma unused (imageFetchurlResponse,imageerror) if (imageresponseData) { self.connectionstatusLabel.text = @"Getting user profile image...."; UIImage *image = [UIImage imageWithData:imageresponseData]; _twitterUserProfileDetails.profileImage = image; self.connectionstatusLabel.text = @"Please fill up following fields for login"; self.view.userInteractionEnabled = YES; [DejalActivityView removeView]; } }]; } else { output = [NSString stringWithFormat:@"HTTP response status: %i\n", [urlResponse statusCode]]; } }]; } 

这是我过去试过的

 [PFTwitterUtils logInWithBlock:^(PFUser *user, NSError *error) { if (!user) { NSLog(@"Uh oh. The user cancelled the Twitter login."); [[NSNotificationCenter defaultCenter] postNotificationName:notificationUserLoginFailed object:error]; return; } else { // TODO find a way to fetch details with Twitter.. NSString * requestString = [NSString stringWithFormat:@"https://api.twitter.com/1.1/users/show.json?screen_name=%@", user.username]; NSURL *verify = [NSURL URLWithString:requestString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:verify]; [[PFTwitterUtils twitter] signRequest:request]; NSURLResponse *response = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if ( error == nil){ NSDictionary* result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; _NSLog(@"%@",result); [user setObject:[result objectForKey:@"profile_image_url_https"] forKey:@"picture"]; // does this thign help? [user setUsername:[result objectForKey:@"screen_name"]]; NSString * names = [result objectForKey:@"name"]; NSMutableArray * array = [NSMutableArray arrayWithArray:[names componentsSeparatedByString:@" "]]; if ( array.count > 1){ [user setObject:[array lastObject] forKey:@"last_name"]; [array removeLastObject]; [user setObject:[array componentsJoinedByString:@" " ] forKey:@"first_name"]; } [user saveInBackground]; } [[NSNotificationCenter defaultCenter] postNotificationName:notificationUserDidLogin object:nil]; return; } }]; 

这是profile_image_url_https;)

我们可以在不使用Twitter SDK的情况下访问个人资料图片。在iOS中使用社交框架,我们可以使用它。

我使用ACAccounts而不是像MGTwitterEngine等Twitter的IOS SDK …….将使用在iPhone设置提供的Twitter帐户。

  if(!accountStore) accountStore = [[ACAccountStore alloc] init]; ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [accountStore requestAccessToAccountsWithType:accountType options:NULL completion:^(BOOL granted, NSError *error) { if (granted) { // Step 2: Create a request NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; self.twitterAccount = [accountsArray objectAtIndex:0]; // NSString *userID = [[twitterAccount valueForKey:@"properties"] valueForKey:@"user_id"]; NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/users/show.json"]; NSDictionary *params = @{@"screen_name" : twitterAccount.username }; SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:url parameters:params]; // Attach an account to the request [request setAccount:[accountsArray lastObject]]; // Step 3: Execute the request [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { if (responseData) { if (urlResponse.statusCode >= 200 && urlResponse.statusCode < 300) { [self performSelectorOnMainThread:@selector(twitterdetails:) withObject:responseData waitUntilDone:YES]; } else { NSLog(@"The response status code is %d", urlResponse.statusCode); } } }]; } else { dispatch_async(dispatch_get_main_queue(), ^{ [self dismissError:@"Please set up your twitter account in iphone settings"]; }); } }]; -(void)twitterdetails:(NSData *)responseData { NSError* error = nil; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData //1 options:NSJSONReadingAllowFragments error:&error]; NSString *name = [json objectForKey:@"name"]; NSString *scrnm = [json objectForKey:@"screen_name"]; NSString *twitterid = [json objectForKey:@"id"]; NSString *prof_img = [json objectForKey:@"profile_image_url"]; NSString *location = [json objectForKey:@"location"]; } 

试试这个,它是使用fabricSDK获取用户configuration文件的最新版本

  -(void)usersShow:(NSString *)userID { NSString *statusesShowEndpoint = @"https://api.twitter.com/1.1/users/show.json"; NSDictionary *params = @{@"user_id": userID}; NSError *clientError; NSURLRequest *request = [[[Twitter sharedInstance] APIClient] URLRequestWithMethod:@"GET" URL:statusesShowEndpoint parameters:params error:&clientError]; if (request) { [[[Twitter sharedInstance] APIClient] sendTwitterRequest:request completion:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (data) { // handle the response data eg NSError *jsonError; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; NSLog(@"%@",[json description]); } else { NSLog(@"Error code: %ld | Error description: %@", (long)[connectionError code], [connectionError localizedDescription]); } }]; } else { NSLog(@"Error: %@", clientError); } }