2016-11-03 14 views
3

私はPinterest SDKのリンクをダウンロードするためにPinterest SDKを使用しています(サーバから戻ってくるサンプルリンク:https://www.pinterest.com/r/pin/186195765822871832/4801566892554728205/77314e40aeb26c0dc412e9cfa82f8dccc401fdb2b9806a3fe17ba8bafdb50510)。クッキーを使用してNSURLSesssion GETリクエストを作成する方法

約5日前、私はNSURLSesssionで、Pinterestからプルダウンした同様のリンクにアクセスしようとすると404エラーが発生しました。

友人は、Pinterestは現在そのリンクにアクセスするにはCookieが必要であると信じていると語っています。

私はクッキーを使用してPinterestから200応答を返すようにセッションを設定できますか?

更新されたコードは:

import UIKit 
import PlaygroundSupport 


var url = URL(string: "https://www.pinterest.com/r/pin/186195765822871832/4801566892554728205/77314e40aeb26c0dc412e9cfa82f8dccc401fdb2b9806a3fe17ba8bafdb50510") 

var getSourceURLFromPinterest: URLSessionDataTask? = nil 
let sessionConfig: URLSessionConfiguration = URLSessionConfiguration.default 

sessionConfig.timeoutIntervalForRequest = 30.0 
sessionConfig.timeoutIntervalForResource = 30.0 

let cookieJar = HTTPCookieStorage.shared 
let cookieHeaderField = ["Set-Cookie": "key=value, key2=value2"] 
let cookies = HTTPCookie.cookies(withResponseHeaderFields: cookieHeaderField, for: url!) 
HTTPCookieStorage.shared.setCookies(cookies, for: url, mainDocumentURL: url) 

let session = URLSession(configuration: sessionConfig) 
getSourceURLFromPinterest = session.dataTask(with: url! as URL) { (data: Data?, response: URLResponse?, error: Error?) -> Void in 

     if error != nil { 
     print("error is \(error)") 
    } 
    if response == nil { 
    print("no response") 

    } else if let _ = data { 

     //Config Request 
     let request = NSMutableURLRequest(
      url: (response?.url)!, 
      cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, 
      timeoutInterval: 30.0) 
     request.httpMethod = "HEAD" 

     var statusCode = Int() 
     let session = URLSession.shared 
     let checkURLForResponse = session.dataTask(with: request as URLRequest) {urlData, myResponse, responseError in 
      if let httpResponse = myResponse as? HTTPURLResponse { 
       statusCode = httpResponse.statusCode 
           switch statusCode { 
       case _ where statusCode < 500 && statusCode > 299 && statusCode != 405: //whitelisted 405 to exclude Amazon.com false errors 
        print("status code \(statusCode) for \(url)") 
       default: 
        break; 
       } 
      } else { print("***NO httpResponse for \(url)") } 
     } 
     checkURLForResponse.resume() 
    } 
} 
getSourceURLFromPinterest!.resume() 

PlaygroundPage.current.needsIndefiniteExecution = true 

答えて

1

他の回答は一般的にはうまくいくかもしれませんが、私にとってはこれがPinterestのサーバーからの応答を得るためにリクエストをコーディングする方法です。見る、私は私が考えてやっているがPinterestののサーバーで可能なバグに関連して、特に何のことに注意してください。https://github.com/pinterest/ios-pdk/issues/124

私は私の個人的なPinterestのセッションIDから、私はそれが、私の遊び場クッキーに追加

var cookieSession = String() 
var cookieCSRFToken = String() 

var myWebServiceUrl = URL(string: "https://www.pinterest.com/r/pin/186195765821344905/4801566892554728205/a9bb098fcbd6b73c4f38a127caca17491dafc57135e9bbf6a0fdd61eab4ba885") 

let requestOne = URLRequest(url: myWebServiceUrl!) 
let sessionOne = URLSession.shared 

let taskOne = sessionOne.dataTask(with: requestOne, completionHandler: { (data, response, error) in 
    if let error = error { 
     print("ERROR: \(error)") 
    } 
    else { 
     print("RESPONSE: \(response)") 

     if let data = data, let dataString = String(data: data, encoding: .utf8) { 
      print("DATA: " + dataString) 
     } // end: if 

     var cookies:[HTTPCookie] = HTTPCookieStorage.shared.cookies! as [HTTPCookie] 
     print("Cookies Count = \(cookies.count)") 
     for cookie:HTTPCookie in cookies as [HTTPCookie] { 

      // Get the _pinterest_sess ID 
      if cookie.name as String == "_pinterest_sess" { 
       //var cookieValue : String = "CookieName=" + cookie.value as String 
       cookieSession = cookie.value as String 
       print(cookieSession) 
      } 

      // Get the csrftoken 
      if cookie.name as String == "csrftoken" { 
       cookieCSRFToken = cookie.value 
       print(cookieCSRFToken) 
      } 
     } // end: for 

    } // end: if 
}) 
taskOne.resume() 

var requestTwo = URLRequest(url: myWebServiceUrl!) 

cookieSession = "XXXXXXXX" 

cookieCSRFToken = "JHDylCCKKNToE4VXgofq1ad3hg06uKKl" 

var cookieRequest = "_auth=1; _b=\"AR4XTkMmqo9JKradOZyuMoSWcMdsBMuBHHIM21wj2RPInwdkbl2yuy56yQR4iqxJ+N4=\"; _pinterest_pfob=disabled; _pinterest_sess=\"" + cookieSession + "\"; csrftoken=" + cookieCSRFToken as String 


requestTwo.setValue(cookieRequest as String, forHTTPHeaderField: "Cookie") 


let taskTwo = sessionOne.dataTask(with: requestTwo, completionHandler: { (data, response, error) in 
    if let error = error { 
     print("ERROR: \(error)") 
    } 
    else { 
     print("RESPONSE: \(response)") 

    } // end: if 
}) 
taskTwo.resume() 

PlaygroundPage.current.needsIndefiniteExecution = true 
0

あなたは、次のようにクッキーベースのセッションを設定することができます。助けが必要な場合は教えてください。以下は単なる例に過ぎません。

let session: URLSession = URLSession.shared 
    session.dataTask(with: myUrlRequest { urlData, response, responseError in 

     let httpRes: HTTPURLResponse = (response as? HTTPURLResponse)! 
     let cookies:[HTTPCookie] = HTTPCookie.cookies(withResponseHeaderFields: httpRes.allHeaderFields as! [String : String], for: httpRes.url!) 
     HTTPCookieStorage.shared.setCookies(cookies, for: response?.url!, mainDocumentURL: nil) 
     if responseError == nil { 

     }else { 

     } 
    }.resume() 

編集してもよろしいですか?以下の内容がうまくいかない場合は、私にお知らせください。

+0

おかげコメントそれは空の配列のように見える? – GarySabo

+0

更新されたコードを投稿できますか? – KrishnaCA

+0

もちろん、これは私の最新の試みでした... – GarySabo

0

サーバーで認証を行うと、サーバーは応答のヘッダーで受信したCookieを提供します。あなたはそれを抽出して、クッキーの共有ストレージ内のクッキーとして設定することができます。だから、毎回あなたが電話をかける、それらのドメインのために、クッキーを共有してチェックし、有効であれば、それはあなたにあるようになることでしょう。この中

let resp: HTTPURLResponse = (response as? HTTPURLResponse)! 
    let cookies:[HTTPCookie] = HTTPCookie.cookies(withResponseHeaderFields: resp.allHeaderFields as! [String : String], for: resp.url!) 
    HTTPCookieStorage.shared.setCookies(cookies, for: response?.url!, mainDocumentURL: nil) 

cookiesはでクッキーが含まれている配列になります配列。応答には複数のCookieが含まれる場合があります。

サードパーティのフレームワークを使用してAlamofireのようなHTTPリクエストを管理している場合は、Cookie管理そのものに気を取られます。

+0

ありがとうございますが、私のクッキーの配列が空です – GarySabo

関連する問題