8

Twitter API for ios 5を使用して、すべてのユーザーフォロワーとフォローしているユーザー名をNSDictionary...

しかし、私は障害にぶつかりました。Twitter APIを使用してこれを行う方法がわかりません...しかし、私の主な問題は、最初にユーザーのユーザー名を取得することです。ユーザーのユーザー名さえ知らないときに、このユーザーのフォロワーを見つけるためにAPIリクエストを作成するにはどうすればよいですか?

Twitterユーザーのフォロワーを増やしてフォローする例を教えてもらえますか?

PS:私はすでにTwitterフレームワークを追加し、インポートしました

4

3 に答える 3

30

これは、AppleのTwitterAPIとTwitter独自のAPIを組み合わせたものです。コードを読んだら、それはかなり簡単です。Twitterアカウントの「友達」(これはユーザーがフォローしている人の用語です)を取得する方法のサンプルコードを提供します。これは、フォロワーを取得する方法を開始するのに十分なはずです。アカウント。

まず、AccountsTwitterフレームワークを追加します。

それでは、Twitterアカウントをユーザーのデバイスに表示してみましょう。

#import <Accounts/Accounts.h>

-(void)getTwitterAccounts {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    // Create an account type that ensures Twitter accounts are retrieved.
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    // let's request access and fetch the accounts
    [accountStore requestAccessToAccountsWithType:accountType
                            withCompletionHandler:^(BOOL granted, NSError *error) {
                                // check that the user granted us access and there were no errors (such as no accounts added on the users device)
                                if (granted && !error) {
                                    NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];
                                    if ([accountsArray count] > 1) {
                                        // a user may have one or more accounts added to their device
                                        // you need to either show a prompt or a separate view to have a user select the account(s) you need to get the followers and friends for 
                                    } else {
                                        [self getTwitterFriendsForAccount:[accountsArray objectAtIndex:0]];
                                    }
                                } else {
                                    // handle error (show alert with information that the user has not granted your app access, etc.)
                                }
    }];
}

これで、 GET friends/idsコマンドを使用してアカウントの友達を取得できます。

#import <Twitter/Twitter.h>

-(void)getTwitterFriendsForAccount:(ACAccount*)account {
    // In this case I am creating a dictionary for the account
    // Add the account screen name
    NSMutableDictionary *accountDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:account.username, @"screen_name", nil];
    // Add the user id (I needed it in my case, but it's not necessary for doing the requests)
    [accountDictionary setObject:[[[account dictionaryWithValuesForKeys:[NSArray arrayWithObject:@"properties"]] objectForKey:@"properties"] objectForKey:@"user_id"] forKey:@"user_id"];
    // Setup the URL, as you can see it's just Twitter's own API url scheme. In this case we want to receive it in JSON
    NSURL *followingURL = [NSURL URLWithString:@"http://api.twitter.com/1/friends/ids.json"];
    // Pass in the parameters (basically '.ids.json?screen_name=[screen_name]')
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:account.username, @"screen_name", nil];
    // Setup the request
    TWRequest *twitterRequest = [[TWRequest alloc] initWithURL:followingURL
                                                parameters:parameters
                                             requestMethod:TWRequestMethodGET];
    // This is important! Set the account for the request so we can do an authenticated request. Without this you cannot get the followers for private accounts and Twitter may also return an error if you're doing too many requests
    [twitterRequest setAccount:account];
    // Perform the request for Twitter friends
    [twitterRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                if (error) {
                    // deal with any errors - keep in mind, though you may receive a valid response that contains an error, so you may want to look at the response and ensure no 'error:' key is present in the dictionary
                }
                NSError *jsonError = nil;
                // Convert the response into a dictionary
                NSDictionary *twitterFriends = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONWritingPrettyPrinted error:&jsonError];
                // Grab the Ids that Twitter returned and add them to the dictionary we created earlier
                [accountDictionary setObject:[twitterFriends objectForKey:@"ids"] forKey:@"friends_ids"];
                NSLog(@"%@", accountDictionary);
    }];
}

アカウントのフォロワーが必要な場合も、ほぼ同じです... URLを使用して、GET followers/idshttp://api.twitter.com/1/followers/ids.formatで見つかった必要なパラメーターを渡すだけです。

これがあなたに良いスタートを切ることを願っています。

アップデート:

コメントで指摘されているように、更新されたAPI呼び出しを使用する必要があります。https://api.twitter.com/1.1/followers/list.json

于 2012-07-22T14:24:59.967 に答える
2
  1. runmadの投稿に関するコメントを参照すると、「[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array」のエラーの原因は、シミュレーターで Twitter アカウントを設定していないことです。ユーザー名と Twitter が提供する一時パスワードを使用して Twitter に署名する必要があります。

  2. エラーの他の原因は、「キー エラーの setObject、キー ID が nil です」です。コードの下のそのタイプを克服するには: -

-(void)getTwitterAccounts {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    // Create an account type that ensures Twitter accounts are retrieved.
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    // let's request access and fetch the accounts
    [accountStore requestAccessToAccountsWithType:accountType
                            withCompletionHandler:^(BOOL granted, NSError *error) {
                                // check that the user granted us access and there were no errors (such as no accounts added on the users device)
                                if (granted && !error) {
                                    NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];
                                    if ([accountsArray count] > 1) {
                                        // a user may have one or more accounts added to their device
                                        // you need to either show a prompt or a separate view to have a user select the account(s) you need to get the followers and friends for
                                    } else {
                                        [self getTwitterFriendsForAccount:[accountsArray objectAtIndex:0]];
                                    }
                                } else {
                                    // handle error (show alert with information that the user has not granted your app access, etc.)
                                }
                            }];
}

-(void)getTwitterFriendsForAccount:(ACAccount*)account {
    // In this case I am creating a dictionary for the account
    // Add the account screen name
    NSMutableDictionary *accountDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:account.username, @"screen_name", nil];
    // Add the user id (I needed it in my case, but it's not necessary for doing the requests)
    [accountDictionary setObject:[[[account dictionaryWithValuesForKeys:[NSArray arrayWithObject:@"properties"]] objectForKey:@"properties"] objectForKey:@"user_id"] forKey:@"user_id"];
    // Setup the URL, as you can see it's just Twitter's own API url scheme. In this case we want to receive it in JSON
    NSURL *followingURL = [NSURL URLWithString:@"https://api.twitter.com/1.1/followers/list.json"];
    // Pass in the parameters (basically '.ids.json?screen_name=[screen_name]')
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:account.username, @"screen_name", nil];
    // Setup the request
    TWRequest *twitterRequest = [[TWRequest alloc] initWithURL:followingURL
                                                    parameters:parameters
                                                 requestMethod:TWRequestMethodGET];
    // This is important! Set the account for the request so we can do an authenticated request. Without this you cannot get the followers for private accounts and Twitter may also return an error if you're doing too many requests
    [twitterRequest setAccount:account];
    // Perform the request for Twitter friends
    [twitterRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if (error) {
            // deal with any errors - keep in mind, though you may receive a valid response that contains an error, so you may want to look at the response and ensure no 'error:' key is present in the dictionary
        }
        NSError *jsonError = nil;
        // Convert the response into a dictionary
        NSDictionary *twitterFriends = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONWritingPrettyPrinted error:&jsonError];
        
        NSLog(@"%@", twitterFriends);
    }];
}

輸入

輸入

注:- TWRequest は非推奨になりました。代わりに、次のスニペットを使用することもできます。

ACAccountStore *accountStore = [[ACAccountStore alloc] init];
 ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
 [accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error){
 if (granted) {
 NSArray *accounts = [accountStore accountsWithAccountType:accountType];
 // Check if the users has setup at least one Twitter account
 if (accounts.count > 0)
 {
 ACAccount *twitterAccount = [accounts objectAtIndex:0];

 for(ACAccount *t in accounts)
 {
 if([t.username isEqualToString:twitterAccount.username])
 {
 twitterAccount = t;
 break;
 }
 }

 SLRequest *twitterInfoRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/followers/list.json"] parameters:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%@", twitterAccount.username], @"screen_name", @"-1", @"cursor", nil]];
 [twitterInfoRequest setAccount:twitterAccount];
 // Making the request
 [twitterInfoRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
 dispatch_async(dispatch_get_main_queue(), ^{
 // Check if we reached the reate limit
 if ([urlResponse statusCode] == 429) {
 NSLog(@"Rate limit reached");
 return;
 }
 // Check if there was an error
 if (error) {
 NSLog(@"Error: %@", error.localizedDescription);
 return;
 }
 // Check if there is some response data
 if (responseData) {
 NSError *error = nil;
 NSArray *TWData = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error];
 NSLog(@"TWData : %@", TWData);

 }
 });
 }];
 }
 } else {
 NSLog(@"No access granted");
 }
 }];
于 2014-12-31T12:08:16.243 に答える
1

FHSTwitterEngineを使用する

#import "FHSTwitterEngine.h"

SystemConfiguration.frameworkを追加

次のコードを viewDidLoad に記述します (oauth ログイン用)。

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:@"Xg3ACDprWAH8loEPjMzRg" andSecret:@"9LwYDxw1iTc6D9ebHdrYCZrJP4lJhQv5uf4ueiPHvJ0"];
[[FHSTwitterEngine sharedEngine]setDelegate:self];


 - (void)showLoginWindow:(id)sender {
UIViewController *loginController = [[FHSTwitterEngine sharedEngine]loginControllerWithCompletionHandler:^(BOOL success) {
    NSLog(success?@"L0L success":@"O noes!!! Loggen faylur!!!");
    [[FHSTwitterEngine sharedEngine]loadAccessToken];
    NSString *username = [FHSTwitterEngine sharedEngine].authenticatedUsername;
    NSLog(@"user name is :%@",username);
    if (username.length > 0) {
        [self listResults];
    }
}];
     [self presentViewController:loginController animated:YES completion:nil];
}
 - (void)listResults {

NSString *username = [FHSTwitterEngine sharedEngine].authenticatedUsername;
NSMutableDictionary *   dict1 = [[FHSTwitterEngine sharedEngine]listFriendsForUser:username isID:NO withCursor:@"-1"];

//  NSLog(@"====> %@",[dict1 objectForKey:@"users"] );        // Here You get all the data
NSMutableArray *array=[dict1 objectForKey:@"users"];
for(int i=0;i<[array count];i++)
{
    NSLog(@"names:%@",[[array objectAtIndex:i]objectForKey:@"name"]);
}
}
于 2014-07-18T11:54:41.407 に答える