C#で記述されたwindows.formアプリケーションでWebブラウザーコントロールを使用しています。特定のサイトにアクセスした後、WebbrowersコントロールからCookieを削除するメソッドを記述したいと思います。残念ながら、私はそれを正確に行う方法を知りません、そしてインターネットで多くの助けを見つけませんでした。
誰かが実際にこれを行った経験があるとすれば、それは見かけよりトリッキーである可能性があるため、単なる仮説ではありませんが、わかりません。
int count = webBrowser2.Document.Cookie.Length;
webBrowser2.Document.Cookie.Remove(0,count);
上記のコードのようなものが機能すると思いますが、機能しないと思います。誰もがこのクッキー全体にいくつかの光を当てることができますか?
JavaScriptを有効にしている場合は、このコードスニペットを使用して、Webブラウザーが現在オンになっているサイトのCookieをクリアできます。
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.Host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
このブックマークレット から派生し、Cookieをクリアします。
私はここからソリューションを変更しました: http://mdb-blog.blogspot.ru/2013/02/c-winforms-webbrowser-clear-all-cookies.html
実際には、安全でないコードは必要ありません。ここに私のために働くヘルパークラスがあります:
public static class WinInetHelper
{
public static bool SupressCookiePersist()
{
// 3 = INTERNET_SUPPRESS_COOKIE_PERSIST
// 81 = INTERNET_OPTION_SUPPRESS_BEHAVIOR
return SetOption(81, 3);
}
public static bool EndBrowserSession()
{
// 42 = INTERNET_OPTION_END_BROWSER_SESSION
return SetOption(42, null);
}
static bool SetOption(int settingCode, int? option)
{
IntPtr optionPtr = IntPtr.Zero;
int size = 0;
if (option.HasValue)
{
size = sizeof (int);
optionPtr = Marshal.AllocCoTaskMem(size);
Marshal.WriteInt32(optionPtr, option.Value);
}
bool success = InternetSetOption(0, settingCode, optionPtr, size);
if (optionPtr != IntPtr.Zero) Marshal.Release(optionPtr);
return success;
}
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool InternetSetOption(
int hInternet,
int dwOption,
IntPtr lpBuffer,
int dwBufferLength
);
}
プロセスの最初のどこかでSupressCookiePersistを呼び出し、ブラウザを閉じたときにEndBrowserSessionでCookieをクリアします。以下に説明します。 Facebook multi account
すべてのCookieを削除するための解決策を見つけました。 URLにある例は、アプリケーション(プロセス)の起動時にCookieを削除します。
http://mdb-blog.blogspot.com/2013/02/c-winforms-webbrowser-clear-all-cookies.html
ソリューションは InternetSetOption 関数を使用して、すべてのコンテンツをクリアするようにWEBBROWSERに通知します。
int option = (int)3/* INTERNET_SUPPRESS_COOKIE_PERSIST*/;
int* optionPtr = &option;
bool success = InternetSetOption(0, 81/*INTERNET_OPTION_SUPPRESS_BEHAVIOR*/, new IntPtr(optionPtr), sizeof(int));
if (!success)
{
MessageBox.Show("Something went wrong !>?");
}
これは、MSDN INTERNET_OPTION_SUPPRESS_BEHAVIOR に記載されている特定のプロセスのCookieのみをクリアすることに注意してください。
プロセス全体で動作を抑制するために使用される汎用オプション。
安全でないコードや手動のマーシャリングを必要としない、他の提案された回答のバリアント:
private static void SuppressCookiePersistence()
{
int flag = INTERNET_SUPPRESS_COOKIE_PERSIST;
if (!InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SUPPRESS_BEHAVIOR, ref flag, sizeof(int)))
{
var ex = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
throw ex;
}
}
const int INTERNET_OPTION_SUPPRESS_BEHAVIOR = 81;
const int INTERNET_SUPPRESS_COOKIE_PERSIST = 3;
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, ref int flag, int dwBufferLength);
これを使ってみてください:
System.IO.File.Delete(Environment.SpecialFolder.Cookies.ToString() + "cookiename");
internet Explorerに基づくWebブラウザーコントロールなので、IE= Cookieを削除すると、WebブラウザーCookieも削除されます。 this 回答で、次のように試すことができます。
System.Diagnostics.Process.Start("CMD.exe","/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.Host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
Webブラウザーコントロールは、開発者として制御できない複数のサイトからなるページを表示しますか、それともWebブラウザーコントロールを使用して、アプリケーション内で作成されたカスタムHTMLページを表示しますか?
前者の場合、Cookieはそれらを設定するドメインに直接関連付けられているため、これらのCookieを削除するには、ユーザーのCookieディレクトリを監視し、作成された新しいCookieを削除する必要があります。
後者の場合は、サーバー側のスクリプト(アプリケーションで使用可能な場合)またはJavaScriptを使用して、いつでもCookieを削除するカスタムページにWebブラウザーコントロールを送信できます。
WebブラウザーC#でセッションを破棄する方法を見つけた素晴らしい時間の後、私はコードを使用して成功しました:
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.Host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
上記のトピックでジョーダンミルンがどのように言っているか。
私のアプリケーションでは、webbrowser1.navigate( "xxx");を使用する必要があります。
c#プロパティを使用する場合、ここでは機能しません。
この情報がお役に立てば幸いです。
私はこのコードを使用しており、JavaScriptなしで機能します。 JavaScriptと同じことをしますが、VB.NETで行います。また、ナビゲーションは必要ありません。
For Each cookie As String In Document.Cookie.Split(";"c)
Dim domain As String = "." + url.Host
While domain.Length > 0
Dim path As String = url.LocalPath
While path.Length > 0
Document.Cookie = cookie.Split("="c)(0).Trim & "= ;expires=Thu, 30-Oct-1980 16:00:00 GMT;path=" & path & ";domain=" & domain
path = path.Substring(0, path.Length - 1)
End While
Select Case domain.IndexOf(".")
Case 0
domain = domain.Substring(1)
Case -1
domain = ""
Case Else
domain = domain.Substring(domain.IndexOf("."))
End Select
End While
Next
JavaScriptとの唯一の本当の違いは、単にcookie=value
を期限切れにするのではなく、=
を検索してcookie=
を期限切れにすることです。これは、価値のないCookieを期限切れにするために重要です。
落とし穴:
ReadyState = WebBrowserReadyState.Complete
までDocument
にアクセスしないでください。アクセスしない場合、DocumentはNothingになり、逆参照によって例外がスローされます。View Cookies Add-On を備えたFirefoxは、特定のWebページのデバッグに大いに役立ちました。