以编程方式创建推文有困难

时间:2015-09-27 14:20:48

标签: ios swift twitter httprequest twitter-oauth

我已经使用Fabric(fabric.io)将它与Twitter集成,登录和Auth工作得很好,但我需要通过代码创建和发送推文,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上,有些东西不匹配

我需要制作这个程序化的因为我需要获得一个大文本,分解它并立即以几条推文的形式发送它,否则我只会使用他们的作曲家并完成它

1 个答案:

答案 0 :(得分:9)

好的,所以我发现了这个问题。 问题在于

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)")
            }
        }
    } 
}