如何在ios中获取推特个人资料图片?

时间:2013-09-20 13:09:39

标签: ios authentication 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错误。我觉得我错过了什么。有人请检查我的代码吗?或者提供任何建议来检索Twitter用户个人资料图片?

由于

6 个答案:

答案 0 :(得分:8)

您是否考虑过使用第三方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];
    }
}];

答案 1 :(得分:1)

这是我过去尝试过的

[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;
    }



}];

答案 2 :(得分:1)

请注意,您应该登录iOS设备以获取此功能:

- (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]];
        }

    }];
}

答案 3 :(得分:1)

答案 4 :(得分:0)

这是profile_image_url_https;)

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

我使用ACAccounts代替Twitter IOS SDK,如MGTwitterEngine等.......  将使用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"];
}

答案 5 :(得分:0)

试试这个,这是使用fabricSDK

获取用户个人资料的最新信息
  -(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 e.g.
                 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);
    }
}