it-swarm.com.de

Ändern des Benutzeragenten des WebBrowser-Steuerelements

Ich versuche, den UserAgent des WebBrowser-Steuerelements in einer Winforms-Anwendung zu ändern.

Ich habe dies mit folgendem Code erfolgreich erreicht:

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(
    int dwOption, string pBuffer, int dwBufferLength, int dwReserved);

const int URLMON_OPTION_USERAGENT = 0x10000001;

public void ChangeUserAgent()
{
    List<string> userAgent = new List<string>();
    string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";

    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}

Das einzige Problem ist, dass dies nur einmal funktioniert. Wenn ich versuche, die ChangeUserAgent () -Methode zum zweiten Mal auszuführen, funktioniert dies nicht. Es bleibt auf den ersten geänderten Wert gesetzt. Das ist ziemlich ärgerlich und ich habe alles versucht, aber es wird sich nicht mehr als einmal ändern.

Kennt jemand einen anderen, flexibleren Ansatz?

Vielen Dank

44
Proximo

Ich bin mir nicht sicher, ob ich einfach von einer Website kopieren/einfügen soll, aber ich möchte die Antwort lieber hier lassen, anstatt einen Link. Wenn jemand in Kommentaren klarstellen kann, bin ich sehr dankbar.

Grundsätzlich müssen Sie die WebBrowser-Klasse erweitern.

public class ExtendedWebBrowser : WebBrowser
{
    bool renavigating = false;

    public string UserAgent { get; set; }

    public ExtendedWebBrowser()
    {
        DocumentCompleted += SetupBrowser;

        //this will cause SetupBrowser to run (we need a document object)
        Navigate("about:blank");
    }

    void SetupBrowser(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        DocumentCompleted -= SetupBrowser;
        SHDocVw.WebBrowser xBrowser = (SHDocVw.WebBrowser)ActiveXInstance;
        xBrowser.BeforeNavigate2 += BeforeNavigate;
        DocumentCompleted += PageLoaded;
    }

    void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

    }

    void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
        ref object postData, ref object headers, ref bool cancel)
    {
        if (!string.IsNullOrEmpty(UserAgent))
        {
            if (!renavigating)
            {
                headers += string.Format("User-Agent: {0}\r\n", UserAgent);
                renavigating = true;
                cancel = true;
                Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);
            }
            else
            {
                renavigating = false;
            }
        }
    }
}

Hinweis: Um die oben beschriebene Methode zu verwenden, müssen Sie einen COM-Verweis auf "Microsoft Internet Controls" hinzufügen.

Er erwähnt auch Ihren Ansatz und gibt an, dass das WebBrowser-Steuerelement diese Zeichenfolge des Benutzeragenten zu zwischenspeichern scheint, sodass der Benutzeragent nicht geändert wird, ohne den Prozess neu zu starten.

35
Jean Azzopardi

Der einfachste Weg:

webBrowser.Navigate("http://localhost/run.php", null, null,
                    "User-Agent: Here Put The User Agent");
62
Constantin

Es gibt auch eine Aktualisierungsoption in der Funktion (gemäß MSDN ). Es hat bei mir gut funktioniert (Sie sollten es einstellen, bevor ein Benutzeragent geändert wird). Dann könnte der Fragencode so geändert werden:

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(
    int dwOption, string pBuffer, int dwBufferLength, int dwReserved);

const int URLMON_OPTION_USERAGENT = 0x10000001;
const int URLMON_OPTION_USERAGENT_REFRESH = 0x10000002;

public void ChangeUserAgent()
{
    string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";

    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT_REFRESH, null, 0, 0);
    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}
19
natenho

Ich möchte die Antwort von @Jean Azzopardi ergänzen.

void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
        ref object postData, ref object headers, ref bool cancel)
{
    // This alone is sufficient, because headers is a "Ref" parameters, and the browser seems to pick this back up.
    headers += string.Format("User-Agent: {0}\r\n", UserAgent);
}

Diese Lösung hat am besten für mich funktioniert. Die Verwendung des Renavigierens verursachte andere seltsame Probleme für mich, wie das plötzliche Verschwinden des Browserinhalts und manchmal immer noch nicht unterstützter Browser. Mit dieser Technik hatten alle Anfragen in Fiddler den richtigen User Agent.

4
harsimranb