24

ある 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つの反対の後に更新:これは修辞的な質問として意図されたものではありませんが、可能であることを保証します. タンブルウィードの後の更新: (答え) を参照してください、それは可能です。かなり時間がかかりましたが、うまくいきます。

4

6 に答える 6

32

誰かが知っていると思っていましたが、一般的には行われていないと思い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リクエストに渡す方法だったと思いますh2(その部分はすでに知っていて示しました)。ここで驚くべきことは、基本的に を使用しないように答えたいと思っている人が何人いたかということです。そのopen-uriうちの 1 人だけが、1 つのリクエストで設定された Cookie を次のリクエストに渡す方法を示しました。

于 2009-09-02T00:48:47.840 に答える
13

「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)
于 2009-09-01T06:31:48.490 に答える
4

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
于 2010-12-14T13:54:38.460 に答える
2

達成しようとしていることに応じて、webratを確認してください。通常はテストに使用されることは知っていますが、ライブ サイトにもヒットする可能性があり、リクエスト間の Cookie の保存やリダイレクトに従うなど、Web ブラウザが行う多くのことを実行します。

于 2009-09-02T04:41:47.860 に答える
1

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

于 2009-09-01T06:28:19.137 に答える
0

RFC 2109 および RFC 2965 の Cookie jar の実装があり、標準準拠の Cookie 処理が必要な場合は、こちらを参照してください。

https://github.com/dwaite/cookiejar

于 2011-10-13T12:21:26.050 に答える