首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Swift访问Twitter

使用Swift访问Twitter
EN

Stack Overflow用户
提问于 2015-02-26 04:50:32
回答 2查看 2.9K关注 0票数 1

我正在使用更快的库访问我的Swift iOS 8应用程序:https://github.com/mattdonnelly/Swifter中的Twitter。问题是我从Twitter上得到了401个未经授权的错误。我仔细检查了可能的原因:

  1. 用户密钥/秘密是错误的
  2. 确保不使用API v1 (使用1.1)

这两个问题都得到了解决(根据Twitter文档),我仍然面临着这个问题。我想这和我的身份验证有关。我试图在设备上不使用ACAccount访问公共提要。

这是我的代码:

代码语言:javascript
复制
// MARK: Twitter
    var swifter: Swifter

    required init(coder aDecoder: NSCoder) {
        self.swifter = Swifter(consumerKey: "KEY", consumerSecret: "SECRET")
        super.init(coder: aDecoder)
    }

    func getTwitterTimeline() {
        let failureHandler: ((NSError) -> Void) = {
            error in
            self.alertWithTitle("Error", message: error.localizedDescription)
        }

        self.swifter.getStatusesUserTimelineWithUserID("erhsannounce", count: 20, sinceID: nil, maxID: nil, trimUser: true, contributorDetails: false, includeEntities: true, success: {
            (statuses: [JSONValue]?) in

            if statuses != nil {
                self.tweets = statuses!
            }

        }, failure: failureHandler)
    }

    func alertWithTitle(title: String, message: String) {
        var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }

更新:我一直在开发应用程序,试图实现只使用应用程序(而不是基于用户的) auth和访问令牌来读取公共时间线的功能。

我更新了代码,只使用访问令牌和应用程序。但还是没起作用。

代码语言:javascript
复制
required init(coder aDecoder: NSCoder) {
        let accessToken = SwifterCredential.OAuthAccessToken(key: "KEY", secret: "SECRET")
        let credential = SwifterCredential(accessToken: accessToken)

        self.swifter = Swifter(consumerKey: "cKEY", consumerSecret: "cSECRET", appOnly: true)
        swifter.client.credential = credential
        super.init(coder: aDecoder)
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-26 12:41:18

更新02-03-2015

您需要使用App身份验证与服务器进行身份验证,而不是传递OAuth令牌。

此外,在传入用户的屏幕名时,您也没有正确地请求使用userId的状态。您需要获得用户名的用户id,然后请求状态‘。

完整的工作守则如下:

代码语言:javascript
复制
required init(coder aDecoder: NSCoder) {
    self.swifter = Swifter(consumerKey: "cKEY", consumerSecret: "cSECRET", appOnly: true)
    super.init(coder: aDecoder)

    self.swifter.authorizeAppOnlyWithSuccess({ (accessToken, response) -> Void in
        self.twitterIsAuthenticated = true
    }, failure: { (error) -> Void in
        println("Error Authenticating: \(error.localizedDescription)")
    })
}

@IBAction func getUserButtonPressed(sender: UIButton?) {
    if (self.twitterIsAuthenticated) {
        self.getTwitterUserWithName("erhsannounce")
    } else {
        // Authenticate twitter again.
    }
}

func getTwitterUserWithName(userName: String) {
    self.swifter.getUsersShowWithScreenName(userName, includeEntities: true, success: { (user) -> Void in
        if let userDict = user {
            if let userId = userDict["id_str"] {
                self.getTwitterStatusWithUserId(userId.string!)
            }
        }
        }, failure: failureHandler)
}

func getTwitterStatusWithUserId(idString: String) {
    let failureHandler: ((error: NSError) -> Void) = {
        error in
        println("Error: \(error.localizedDescription)")
    }

    self.swifter.getStatusesUserTimelineWithUserID(idString, count: 20, sinceID: nil, maxID: nil, trimUser: true, contributorDetails: false, includeEntities: true, success: {
        (statuses: [JSONValue]?) in

        if statuses != nil {
            self.tweets = statuses
        }

        }, failure: failureHandler)
}

看起来,您似乎没有与服务器进行身份验证。

从您的代码中,我可以看到您正在使用OAuth身份验证初始化,但没有调用身份验证函数。

代码语言:javascript
复制
swifter.authorizeWithCallbackURL(callbackURL, success: {
    (accessToken: SwifterCredential.OAuthAccessToken?, response: NSURLResponse) in

    // Handle success

    },
    failure: {
        (error: NSError) in

        // Handle Failure

    })

将其添加进来,然后调用您的getTwitterTimeline()。

我希望这能帮到你

票数 0
EN

Stack Overflow用户

发布于 2021-04-05 16:30:44

我将演示如何(在2021年)不需要每次签到。请遵循以下步骤(将YOURAPPNAME替换为您的应用程序名称):

  1. 在身份验证设置下,在twitter开发人员门户上添加YOURAPPNAME://作为回调URL。为此,您需要启用3条腿的OAuth,并将其添加到回调URLS中。你也需要输入一个网站网址,但它可以是任何东西(我有https://www.google.com)。还要确保(如果你想发推特),你可以改变应用程序的权限,在设置中读取和写入
  2. 在您的podfile中,请确保您有以下行:
代码语言:javascript
复制
pod 'Swifter' , :git => 'https://github.com/mattdonnelly/Swifter.git'

不要只使用豆荚‘更快’,因为有另一个项目叫做更快,不是由床垫,不会工作。

  1. 在中单击您的项目,选择info选项卡。在底部,您将看到URL类型。展开它并单击加号。在URL方案中输入YOURAPPNAME (如果应用程序名为" demoApp“,输入demoApp而不是demoApp:// )
  2. 如果您的应用程序委托还没有使用open函数(标准是否定的,但我的标准是因为我有google登录,在我的情况下,我不需要做任何事情),在您的应用程序委托中导入更快的并添加这个函数:
代码语言:javascript
复制
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        
    Swifter.handleOpenURL(url, callbackURL: URL(string: "YOURAPPNAME://")!)
        
    return true
}
  1. 在您的视图控制器中,您需要首先授权twitter,然后您可以做任何事情(tweet、查找提要等)。您可以使用swifter.authorize完成此操作,这将打开一个浏览器。对于那些在第一次之后不需要这个的人来说,这就是swifter.verifyAccountCredentials出现的地方。要找到CONSUMER_KEY和CONSUMER_SECRET,请访问twitter门户的键和令牌区域。
代码语言:javascript
复制
import Swifter
import AuthenticationServices

class ViewController: UIViewController, ASWebAuthenticationPresentationContextProviding {
    func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
        return self.view.window!
    }
    
    var swifter: Swifter!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if UserDefaults.standard.string(forKey: "twitterOAuthToken") == nil {
            swifter = Swifter(consumerKey: CONSUMER_KEY, consumerSecret: CONSUMER_SECRET)
            if let url = URL(string: "YOURAPPNAME://") {
                swifter.authorize(withProvider: self, callbackURL: url) { (token, response) in
                    UserDefaults.standard.set(token?.key, forKey: "twitterOAuthToken")
                    UserDefaults.standard.set(token?.secret, forKey: "twitterOAuthSecret")
                    print("signed in!!")
                }
            }
            
        } else {
            swifter = Swifter(consumerKey: CONSUMER_KEY, consumerSecret: CONSUMER_SECRET, oauthToken: UserDefaults.standard.string(forKey: "twitterOAuthToken") ?? "", oauthTokenSecret: UserDefaults.standard.string(forKey: "twitterOAuthSecret") ?? "")
            swifter.verifyAccountCredentials(includeEntities: nil, skipStatus: nil, includeEmail: nil) { (json) in
                print("signed in!")
            } failure: { (error) in
                self.swifter = Swifter(consumerKey: CONSUMER_KEY, consumerSecret: CONSUMER_SECRET)
                if let url = URL(string: "YOURAPPNAME://") {
                    self.swifter.authorize(withProvider: self, callbackURL: url) { (token, response) in
                        UserDefaults.standard.set(token?.key, forKey: "twitterOAuthToken")
                        UserDefaults.standard.set(token?.secret, forKey: "twitterOAuthSecret")
                        print("signed in!!")
                    }
                }
            }
        }
        
        
        
       let button = UIButton()
        button.layer.backgroundColor = #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1)
        button.frame = CGRect(x: 200, y:0, width: 200, height: 200)
        button.center = view.center
        button.addTarget(self, action: #selector(tweet), for: .touchUpInside)
        view.addSubview(button)

    }
    
    @objc func tweet() {
        swifter.postTweet(status: "wild") { (json) in
            print("tweeted!")
        } failure: { (error) in
            print("tweet failed")
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28734678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档