【问题标题】:Trouble with creating tweet programmatically以编程方式创建推文的问题
【发布时间】:2015-09-27 14:20:48
【问题描述】:

我使用 Fabric (fabric.io) 将其与 Twitter 集成,登录和身份验证工作正常,但我需要通过代码创建和发送推文,而 Twitter 工具包只允许您使用可视化作曲家。

经过大量试验和错误后,我使用他们的文档作为基础编写了这段代码(docs.fabric.io/ios/twitter/access-rest-api.html#constructing-a-twitter-request-manually)

    @IBAction func send(sender: UIButton) {
    self.tweetText.resignFirstResponder()
    let client = TWTRAPIClient()
    let statusesShowEndpoint = "https://api.twitter.com/1.1/statuses/update.json"
    let params = ["status": "Vamos ver se vai?"] //this is just test parameter
    var clientError : NSError?

    let request = Twitter.sharedInstance().APIClient.URLRequestWithMethod("POST", URL: statusesShowEndpoint, parameters: params, error: &clientError)
   /* println(request.allHTTPHeaderFields)
    println(request.HTTPMethod)
    println(request.URL)*/

    client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
        if (connectionError == nil) {
            var jsonError : NSError?
            let json : AnyObject? = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &jsonError)
        }
        else {
            println("Error: \(connectionError)")
        }
    }


}

但我收到以下错误:

错误:可选(错误域=TwitterAPIErrorDomain 代码=220“请求 失败:禁止 (403)" UserInfo=0x7aa35c70 {NSLocalizedFailureReason=Twitter API 错误:您的凭据不 允许访问此资源。 (代码 220), NSErrorFailingURLKey=https://api.twitter.com/1.1/statuses/update.json, NSLocalizedDescription=请求失败:禁止 (403)})

如您所见,我尝试调试以查看标头是否符合 Twitter 的 REST API 并且它们没问题

     Optional([Content-Length: 32, 
Authorization: OAuth oauth_timestamp="1443339227",oauth_version="1.0",
    oauth_consumer_key="deleted",
    oauth_signature="deleted",
    oauth_token="deleted",
    oauth_nonce="9ACAF7BE-E789-46A5-9B3B-5F5AB02EFB85",
    oauth_signature_method="HMAC-SHA1", Accept-Encoding: gzip, Content-Type: application/x-www-form-urlencoded;charset=UTF-8, User-Agent: Fabric/X.Y.Z (Really Long Tweets/1; iPhone Simulator; iOS 8.4; Scale/2.00) TwitterKit/1.11.1])
    Optional("POST")
    Optional(https://api.twitter.com/1.1/statuses/update.json)

我尝试使用他们为您提供的可视化作曲家来查看问题是否出在我的应用程序上,但它工作正常并在我的 Twitter 时间轴上发布,所以我认为它不可能是 API 密钥,权限类型(它具有读写权限)或凭据。 我尝试更改此代码,使其发出 GET 请求并且它有效,我认为问题出在 POST 和 REST API 上,有些不匹配

我需要以编程方式进行此操作,因为我需要获取一个大文本,将其分解并一次以多条推文的形式发送,否则我将使用他们的作曲家并完成它

【问题讨论】:

  • 您应该检查您的凭据,因为在尝试以用户身份发布时通常会引发错误 220,而实际上是作为应用发布。
  • 好的,所以我调试了我的客户端并尝试获取它正在使用的用户 ID,但它是 nil,所以它没有正确验证。现在我只需要尝试学习如何使用 TWTRAPIClient initWithUserID: 正确,有帮助吗?

标签: ios swift twitter httprequest twitter-oauth


【解决方案1】:

好的,所以我发现了问题。 问题出在

let client = TWTRAPIClient()

这创建了一个未经过身份验证的访客客户端。您需要传递用户 ID,以便对用户进行身份验证,所以这是新代码(它正在工作)

@IBAction func send(sender: UIButton) {
    self.tweetText.resignFirstResponder()
    let store = Twitter.sharedInstance().sessionStore
    if let userid = store.session()?.userID {
        let client = TWTRAPIClient(userID: userid)
        let statusesShowEndpoint = "https://api.twitter.com/1.1/statuses/update.json"
        let params = ["status": "Terceiro teste?"]
        var clientError : NSError?

        let request = client.URLRequestWithMethod("POST", URL: statusesShowEndpoint, parameters: params, error: &clientError)
        client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
            if (connectionError == nil) {
                var jsonError : NSError?
                let json : AnyObject? = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &jsonError)
            }
            else {
                println("Error: \(connectionError)")
            }
        }
    } 
}

【讨论】:

  • 我们如何发布带有文字的图片?
  • @VinayPodili 这正是我现在正在努力解决的问题。您必须先上传您的媒体,然后使用media_id
  • 这应该标记为答案,我看过很多帖子,没有人谈论传递用户ID。完美的@Leandro,谢谢
  • sendTweet 方法也可用于带有图像和视频的推文。喜欢图片 - client.sendTweet(withText: String, image: UIImage, completion: TWTRSendTweetCompletion)
  • 花了 3 个小时才发现这篇文章。正确答案。谢谢你的朋友。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多