none
Cookieが取得できません RRS feed

  • 質問

  • こちらで設定したCookieを取得したいのですが、なぜかできません。
    <META http-equiv="Set-Cookie" content="Furtune=AKB; expires=Tue, 31-Dec-2030 23:59:59;">

    こちらのコードで実行しています。レンタルサーバーですると取得できません。
    試しにbingで実行すると、いくつか値は取得できるのですが

    HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create("http://www.bing.com/");
    webreq.CookieContainer = new CookieContainer();
    HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse();
    foreach (Cookie cook in webres.Cookies)
      Console.WriteLine("{0}, {1}", cook.Name, cook.Value);
    Stream st = webres.GetResponseStream();
    StreamReader sr = new StreamReader(st, Encoding.GetEncoding("shift_jis"));
    string html = sr.ReadToEnd();
    sr.Close();
    

    よろしくお願いいたします。

    2014年5月4日 22:53

回答

  • > WebBrowserを利用したら保存したCookieを含め取得できましたがwebページも表示されてしまいますね。

    Visible プロパティを false に設定すれば表示はされなくなるはずですが、それでは何か問題があるのですか?


    > Cookie値のみを取得したい場合は、WebBrowser内にJavaScriptで表示させてから
    > どのように取り出すのでしょうか?

    JavaScript は関係ないです。C# のコードで、ドキュメントの読み込みが終了したら(DocumentCompleted イベントで判断)、webBrowser1.Document.Cookie のようにして取得できるはずです。

    ただし、それで取得できるのは name1=value1; name2=value2; name3=value3 のように、名前と値のペアをセミコロンで区切った文字列のみです。

    また、webBrowser1.Document.Cookie では HttpOnly 属性のついたクッキーは取得できないので、それも含めて全て取得したいということであれば、別の手段が必要です。

    その方法の詳細は以下のページを見てください。これで取得できるのも名前と値のペアをセミコロンで区切ったクッキーの文字列のみです。

    WebBrowser で HttpOnly 属性の Cookie 取得
    http://surferonwww.info/BlogEngine/post/2012/08/13/how-to-get-cookies-with-httponly-attribute-in-webbrowser.aspx

    • 回答としてマーク kenta123 2014年5月5日 4:45
    2014年5月5日 4:17

すべての返信

  • META タグではなく、サーバー応答(HTTP のヘッダー)として Set-Cookie を返さないと HttpWebResponse の Cookies には入らないのでは?

    (META タグや JavaScript によって設定される Cookie は HTML や JavaScript を解釈した結果であって、HTTP の送受信しかしないこのクラスでは Cookie として解釈されないはず)

    2014年5月5日 0:51
    モデレータ
  • ちょっと試してみましたが、Azulean さんの言われるとおり、HttpWebResponse.Cookies に含まれてくるクッキーは、応答ヘッダの Set-Cookie: で送られてくるもののみで、meta タグで設定したクッキーは含まれませんでした。

    なので、質問者さんが示された例のように meta タグに設定されたものは HttpWebRequest / HttpWebResponse を利用したコードでは取得できません。

    ただ、meta タグに設定されたクッキーでも IE はクッキーとして認識するので、JavaScript では取得できますし、次回の要求時に要求ヘッダ Cookie: に含まれて Web サーバーに送信されます。・・・このあたりは Azulean さんも( )の中で言われているとおりだと思います。

    だからかどうかは分かりませんが、WebBrowser を利用すれば meta タグに設定したクッキーも取得できます。


    #bing のクッキーは、自分が見た限りですが、すべて応答ヘッダの Set-Cookie: で送られてくるもので、これらは当然すべて HttpWebResponse.Cookies で取得できます。




    • 編集済み SurferOnWww 2014年5月5日 1:49 一部追記
    2014年5月5日 1:31
  • ありがとうございます。

    この場合のCookieは、プログラムを終了したら消失してしまうのでしょうか?

    2014年5月5日 2:51
  • ありがとうございます。

    WebBrowserを利用したら保存したCookieを含め取得できましたがwebページも表示されてしまいますね。

    Cookie値のみを取得したい場合は、WebBrowser内にJavaScriptで表示させてから

    どのように取り出すのでしょうか?

    よろしくお願いいたします。

    2014年5月5日 2:57
  • > WebBrowserを利用したら保存したCookieを含め取得できましたがwebページも表示されてしまいますね。

    Visible プロパティを false に設定すれば表示はされなくなるはずですが、それでは何か問題があるのですか?


    > Cookie値のみを取得したい場合は、WebBrowser内にJavaScriptで表示させてから
    > どのように取り出すのでしょうか?

    JavaScript は関係ないです。C# のコードで、ドキュメントの読み込みが終了したら(DocumentCompleted イベントで判断)、webBrowser1.Document.Cookie のようにして取得できるはずです。

    ただし、それで取得できるのは name1=value1; name2=value2; name3=value3 のように、名前と値のペアをセミコロンで区切った文字列のみです。

    また、webBrowser1.Document.Cookie では HttpOnly 属性のついたクッキーは取得できないので、それも含めて全て取得したいということであれば、別の手段が必要です。

    その方法の詳細は以下のページを見てください。これで取得できるのも名前と値のペアをセミコロンで区切ったクッキーの文字列のみです。

    WebBrowser で HttpOnly 属性の Cookie 取得
    http://surferonwww.info/BlogEngine/post/2012/08/13/how-to-get-cookies-with-httponly-attribute-in-webbrowser.aspx

    • 回答としてマーク kenta123 2014年5月5日 4:45
    2014年5月5日 4:17
  • webBrowserは使ったことがなかったので、URLにセットしてDocumentプロパティをみたらNULLでしたので、どう取得するか不明でした。DocumentCompletedイベントがあるのですね。

    ありがとうございました。


    2014年5月5日 4:44