web-dev-qa-db-ja.com

Rubyのopen-uriとcookie

あるopen-uri呼び出しからのCookieを保存し、次の呼び出しに渡したいと思います。これを行うための適切なドキュメントが見つからないようです。これを行う正しい方法を教えていただければ幸いです。
注:w3.orgは実際のURLではありませんが、より短いです。ここではクッキーが重要なふりをします。

h1 = open("http://www.w3.org/")
h2 = open("http://www.w3.org/People/Berners-Lee/", "Cookie" => h1.FixThisSpot)

2つの否定の後で更新:これは修辞的な質問として意図されていませんでしたが、私はそれが可能であることを保証します。 タンブルウィード後の更新 :(答え)を参照してください、それは可能です。しばらく時間がかかりましたが、機能します。

23
dlamblin

誰かが知っているだろうと思っていましたが、open-uriでは一般的に行われていないと思います。プライバシー、有効期限、正しいドメイン、正しいパスのいずれもチェックしない醜いバージョンは次のとおりです。

h1 = open("http://www.w3.org/")
h2 = open("http://www.w3.org/People/Berners-Lee/",
          "Cookie" => h1.meta['set-cookie'].split('; ',2)[0])

はい、動作します。いいえ、きれいではなく、推奨事項に完全に準拠しておらず、複数のCookieを(そのまま)処理していません。

明らかに、HTTPは非常に単純なプロトコルであり、open-uriを使用するとほとんどの場合に使用できます。私が本当に知る必要があるのは、h1リクエストからCookieを取得して、それをh2リクエストに渡す方法だと思います(私がすでに知っていて示した部分)。ここで驚くべきことは、基本的にopen-uriを使用しないように言って答えたいと思った人の数であり、そのうちの1人だけが次のリクエストに渡される1つのリクエストでCookieセットを取得する方法を示しました。

30
dlamblin

「Cookie」ヘッダーを追加する必要があります。

Open-uriがこれを実行できるかどうかはわかりませんが、Net :: HTTPを使用して実行できます。

# Create a new connection object.
conn = Net::HTTP.new(site, port)

# Get the response when we login, to set the cookie.
# body is the encoded arguments to log in.
resp, data = conn.post(login_path, body, {})
cookie = resp.response['set-cookie']

# Headers need to be in a hash.
headers = { "Cookie" => cookie }

# On a get, we don't need a body.
resp, data = conn.get(path, headers)
13

MatthewSchinckelに感謝します。あなたの答えは本当に役に立ちました。 Net :: HTTPを使用して成功しました

        # Create a new connection object.
          site = "google.com"
          port = 80
          conn = Net::HTTP.new(site, port)

        # Get the response when we login, to set the cookie.
        # body is the encoded arguments to log in.
          resp, data = conn.post(login_path, body, {})
          cookie = resp.response['set-cookie']

        # Headers need to be in a hash.
          headers = { "Cookie" => cookie }

        # On a get, we don't need a body.
          resp, data = conn.get(path, headers)

          puts resp.body
4
Amal Kumar S

達成しようとしていることに応じて、 webrat をチェックしてください。通常はテストに使用されますが、ライブサイトにアクセスすることもあり、リクエスト間のCookieの保存やリダイレクトの追跡など、Webブラウザが行う多くのことを実行します。

2
John F. Miller

open-uriを使用している場合は、リクエストの送信時にCookieヘッダーを読み取り、追加するときにメタヘッダーを解析して、独自のCookieサポートをロールする必要があります。 httpclient http://raa.Ruby-lang.org/project/httpclient/ または代わりにmechanizeのようなものを使用することを検討してください http://mechanize.rubyforge.org/ Cookieサポートが組み込まれています。

1
ADAM

標準に準拠したCookieの処理が必要な場合に備えて、RFC2109およびRFC2965のCookiejar実装がここにあります。

https://github.com/dwaite/cookiejar

0
Darwin