【问题标题】:Twitter OAuth and accessToken to GET statuses/user_timeline in Objective-CTwitter OAuth 和 accessToken 在 Objective-C 中获取状态/用户时间线
【发布时间】:2013-02-02 20:47:54
【问题描述】:

我正在尝试从 Twitter 获取 accessToken 值以便在我的应用程序中使用它(我需要使用 API v1.1 的身份验证模型来获取 GET statuses/user_timeline);我已经在 api.twitter.com 上注册了我的应用程序,在项目中导入了 AFOAuth1Client 类,这是简单的代码:

- (void)viewDidLoad
{
    self.twitterClient = [[AFOAuth1Client alloc] initWithBaseURL:
                                     [NSURL URLWithString:@"https://api.twitter.com/"] key:@"MYKEY" secret:@"MYSECRETKEY"];
    AFOAuth1Token *accessToken;

    [self.twitterClient acquireOAuthAccessTokenWithPath:@"oauth/request_token" requestToken:accessToken accessMethod:@"GET" success:^(AFOAuth1Token *accessToken) { // I have tried also accessMethod: @"POST"
        NSLog(@"Success: %@", accessToken);
    } failure:^(NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

不幸的是 XCode 给了我这个错误:

Error: Error Domain=AFNetworkingErrorDomain Code=-1011 "Expected status code in (200-299), got 401" UserInfo=0x79a14f0 {NSLocalizedRecoverySuggestion=Failed to validate oauth signature and token, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x7956390>

这里有什么问题?我需要在 api.twitter.com 上注册应用程序吗?这是正确的方法,或者,在 iOS 中使用 API v1.1 的 Twitter 身份验证模型 Get statuses/user_timeline 的更简单方法是什么?谢谢!

编辑:可能的航路点?

1) 在 dev.twitter.com 上注册一个新应用

2) 在 OAuth 设置中,读取 Consumer key 和 Consumer secret

3) 将默认应用访问类型设置为读取?或读/写?要求访问令牌?在....中使用这个值?

【问题讨论】:

    标签: objective-c twitter oauth afnetworking access-token


    【解决方案1】:

    Twitter 添加application only 模式已经有几天了。在这种模式下,您可以在没有用户上下文的情况下访问特定的 API 端点,即。您的用户不必进行身份验证。只有应用程序会偶尔进行一次身份验证以获得“承载令牌”,然后在每个请求中发送该令牌。

    以下代码获取不记名令牌,然后检索@barackobama 的公共时间线。

    STTwitterAPI *twitter = [STTwitterAPI twitterAPIApplicationOnlyWithConsumerKey:@""
                                                                    consumerSecret:@""];
    
    [twitter verifyCredentialsWithSuccessBlock:^(NSString *bearerToken) {
    
        NSLog(@"Access granted with %@", bearerToken);
    
        [twitter getUserTimelineWithScreenName:@"barackobama" successBlock:^(NSArray *statuses) {
            NSLog(@"-- statuses: %@", statuses);
        } errorBlock:^(NSError *error) {
            NSLog(@"-- error: %@", error);
        }];
    
    } errorBlock:^(NSError *error) {
        NSLog(@"-- error %@", error);
    }];
    

    请参阅STTwitter iOS 演示项目以获取工作示例(使用您自己的消费者密钥/秘密)。

    【讨论】:

    • 谢谢 Nicolas @nst,这太完美了!但是,“不记名令牌”有什么意义呢?这有一个速率限制,我可以找到分配给 GET statuses/home_timeline 的请求,仅应用程序身份验证在 15 分钟内为 300(还不够!)。因此,例如,我可能只有 300 个用户(或请求)在 15 分钟内从我的应用程序中调用 getUserTimelineWithScreenName,对吗?或者,更好的是,在特定时间内我的应用程序的每个用户可以做多少公共时间线请求?再次感谢您!
    • 我无法回答 Twitter 的意图。我只能说,从技术上讲,您可以查询application/rate_limit_status dev.twitter.com/docs/api/1.1/get/application/rate_limit_status 以了解速率限制。
    • @Huxley,你有没有找到关于速率限制问题的任何解决方案,因为我已经对此进行了测试,是的,它在 15 分钟内只允许 300 个请求,所以这个限制太少了。
    • 看来类方法已经更新为:+ (instancetype) twitterAPIAppOnlyWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret;
    • nst,我提到了那个演示。如何保存“访问令牌”和“访问令牌秘密”。另外我不知道如何检查它们是否经过验证,因此用户不必每次都登录。
    【解决方案2】:

    如果你有自己的消费代币,可以使用我写的STTwitter library

    STTwitterAPI *twitter =
      [STTwitterAPI twitterAPIWithOAuthConsumerName:@""
                                        consumerKey:@"your_key"
                                     consumerSecret:@"your_secret"
                                           username:@"username"
                                           password:@"password"];
    
    [twitter verifyCredentialsWithSuccessBlock:^(NSString *username) {
    
        NSLog(@"Access granted for %@", username);
    
        [twitter getUserTimelineWithScreenName:@"barackobama"
                                  successBlock:^(NSArray *statuses) {
            NSLog(@"-- statuses: %@", statuses);
        } errorBlock:^(NSError *error) {
            NSLog(@"-- error: %@", error);
        }];
    
    } errorBlock:^(NSError *error) {
        NSLog(@"-- error %@", error);
    }];
    

    如果您的令牌未启用“xAuth”,则您必须使用 PIN。 STTwitter 提供了简单的基于异步块的方法来询问用户。您还可以选择自动化 PIN 检索,请参阅 STTwitterDemo -[AppDelegate guessPIN:] 了解自动化流程。

    【讨论】:

    • 再次感谢你,@nst,我已经看过你漂亮的图书馆了!问题很简单:我只需要从单个 Twitter 帐户中以 JSON 格式检索 PUBLIC 状态/user_timeline,即可对其进行解析并填充 UITableView。我必须做什么?我已经在 dev.twitter.com 上注册了我的应用程序,现在我只有消费者密钥和消费者密钥,但是现在呢?我们是否需要为我的应用程序的每个用户请求授权,还是有其他方法?请你能点对点写出可能的解决方案吗?谢谢!
    • Twitter API 版本 1.1 要求对每个 API 调用进行身份验证 dev.twitter.com/blog/changes-coming-to-twitter-api 因此您可以 1) 要求用户登录(很痛苦,而且并非所有用户都有 Twitter 帐户)2) 嵌入或下载一些Twitter帐户凭据(危险) 3)在您的服务器上生成您自己的timeline.json 并从您的应用程序中调用它(需要维护一些服务器端的东西)。我个人可能会选择选项 3。
    • 咦,这么难!?我怀疑,每个用户都必须经过身份验证(对,并非所有人都有推特帐户!),但它可能吗?没有其他简单的方法来检索 PUBLIC 用户时间线(例如:RSS、提要)?我正在考虑现在使用未经身份验证模式的所有应用程序(我可以看到 2013 年 3 月之后不会有未经身份验证的 api 调用),他们真的会恐慌。谢谢!
    • “我们决定停止支持 XML、Atom 和 RSS”dev.twitter.com/docs/api/1.1/overview
    【解决方案3】:

    STTwitter 使用简单。我还添加了example,您可以获取公开的推特时间线

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-30
      • 2023-04-08
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多