Как получить данные пользователя с помощью twitter api v1.1 (ошибка Twitter 215)

Я использовал twitter api, предоставленный твиттером, чтобы получить информацию, но не удалось выполнить его, даже попытался передать данные аутентификации как секретный ключ потребителя, потребительский ключ, токен, но результат тот же.
Я могу войти и получить токен аутентификации Twitter, но не смог получить информацию о пользователе. Ниже код используется мной (я использую механизм MGtwitter):

NSMutableURLRequest *request =[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.twitter.com/1.1/users/show.json?screen_name=%@",username]]];

NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil ];

NSString *returnString = [[NSString alloc]initWithData:returnData encoding:NSUTF8StringEncoding];
    NSError *err = nil;

twitterLogin = [NSJSONSerialization JSONObjectWithData:[returnString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&err];

Ошибка показана ниже:

errors = (
{
    code = 215;
    message = "Bad Authentication data";
} );

Ответ 1

Сначала вам нужно Authenticate ваш запрос (получить разрешение).

второй, см. эти шаги:

1.Загрузить FHSTwitterEngine Twitter Library.

2. Добавьте папку FHSTwitterEngine "в проект и #import "FHSTwitterEngine.h".

3.add SystemConfiguration.framework в ваш проект.

Использование: 1. в [ViewDidLoad] добавить следующий код.

UIButton *logIn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    logIn.frame = CGRectMake(100, 100, 100, 100);
    [logIn setTitle:@"Login" forState:UIControlStateNormal];
    [logIn addTarget:self action:@selector(showLoginWindow:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:logIn];

[[FHSTwitterEngine sharedEngine]permanentlySetConsumerKey:@"<consumer_key>" andSecret:@"<consumer_secret>"];
    [[FHSTwitterEngine sharedEngine]setDelegate:self];

и не забывайте импортировать делегат FHSTwitterEngineAccessTokenDelegate.

  1. вам нужно получить разрешение для вашего запроса со следующим методом, который будет отображаться в окне входа в систему:
- (void)showLoginWindow:(id)sender {
    [[FHSTwitterEngine sharedEngine]showOAuthLoginControllerFromViewController:self withCompletion:^(BOOL success) {
        NSLog([email protected]"L0L success":@"O noes!!! Loggen faylur!!!");
    }];
}

когда появится окно входа в систему, введите свой твиттер Username и Password в Authenticate ваш запрос.

  1. добавьте в код следующие методы:
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[FHSTwitterEngine sharedEngine]loadAccessToken];
    NSString *username = [[FHSTwitterEngine sharedEngine]loggedInUsername];// self.engine.loggedInUsername;
    if (username.length > 0) {
        lbl.text = [NSString stringWithFormat:@"Logged in as %@",username];
        [self listResults];


    } else {
        lbl.text = @"You are not logged in.";
    }

}
- (void)storeAccessToken:(NSString *)accessToken {
    [[NSUserDefaults standardUserDefaults]setObject:accessToken forKey:@"SavedAccessHTTPBody"];
}

- (NSString *)loadAccessToken {
    return [[NSUserDefaults standardUserDefaults]objectForKey:@"SavedAccessHTTPBody"];
}

4. Теперь вы готовы получить свой запрос со следующим методом (в этом методе я создал поиск Twitter для некоторого Hashtag, чтобы получить screen_name):

- (void)listResults {

    dispatch_async(GCDBackgroundThread, ^{
        @autoreleasepool {
            [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

        // the following line contains a FHSTwitterEngine method wich do the search.

            dict = [[FHSTwitterEngine sharedEngine]searchTweetsWithQuery:@"#iOS" count:100 resultType:FHSTwitterEngineResultTypeRecent unil:nil sinceID:nil maxID:nil];
          // NSLog(@"%@",dict);
            NSArray *results = [dict objectForKey:@"statuses"];

          //  NSLog(@"array text = %@",results);
            for (NSDictionary *item in results) {
                NSLog(@"text == %@",[item objectForKey:@"text"]);
                NSLog(@"name == %@",[[item objectForKey:@"user"]objectForKey:@"name"]);
                NSLog(@"screen name == %@",[[item objectForKey:@"user"]objectForKey:@"screen_name"]);
                NSLog(@"pic == %@",[[item objectForKey:@"user"]objectForKey:@"profile_image_url_https"]);
            }

            dispatch_sync(GCDMainThread, ^{
                @autoreleasepool {
                    UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"Complete!" message:@"Your list of followers has been fetched" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                    [av show];
                    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
                }
            });
        }
    });
}

Это все. Я просто получил имя_экран из поискового запроса, вы можете получить временную шкалу для пользователя, используя следующие методы:

// statuses/user_timeline
- (id)getTimelineForUser:(NSString *)user isID:(BOOL)isID count:(int)count;
- (id)getTimelineForUser:(NSString *)user isID:(BOOL)isID count:(int)count sinceID:(NSString *)sinceID maxID:(NSString *)maxID; 

вместо метода поиска выше.

Примечание: см. FHSTwitterEngine.h, чтобы узнать, какой метод вам нужно использовать. Примечание. Чтобы получить <consumer_key> и <consumer_secret>, вам нужно посетить эту ссылку  для регистрации вашего приложения в Twitter.

Ответ 2

Получите решение после возврата MKAlatrash, чтобы получить профиль пользователя, следуя определенным шагам в коде:

[[FHSTwitterEngine sharedEngine]getProfileImageForUsername:username andSize:FHSTwitterEngineImageSizeNormal];

перейдите к определению этой функции и замените if... else, если part

if ([userShowReturn isKindOfClass:[NSError class]]) {
        return [NSError errorWithDomain:[(NSError *)userShowReturn domain] code:[(NSError *)userShowReturn code] userInfo:[NSDictionary dictionaryWithObject:request forKey:@"request"]];
        NSLog(@"user show return %@",userShowReturn);
    } else if ([userShowReturn isKindOfClass:[NSDictionary class]]) {
        return userShowReturn;
        NSString *url = [userShowReturn objectForKey:@"profile_image_url"]; // normal

        if (size == 0) { // mini
            url = [url stringByReplacingOccurrencesOfString:@"_normal" withString:@"_mini"];
        } else if (size == 2) { // bigger
            url = [url stringByReplacingOccurrencesOfString:@"_normal" withString:@"_bigger"];
        } else if (size == 3) { // original
            url = [url stringByReplacingOccurrencesOfString:@"_normal" withString:@""];
        }

        id ret = [self sendRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];

        if ([ret isKindOfClass:[NSData class]]) {
            return [UIImage imageWithData:(NSData *)ret];
        }

        return ret;
    }

Это действительно помогло спасибо