Frage

Ich versuche, den Useragenten des WebBrowser-Steuerelement in einer WinForms-Anwendung zu ändern.

Ich habe erreicht dies erfolgreich durch den folgenden Code:

[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 laufen funktioniert es nicht. Es bleibt auf dem ersten veränderten Wert gesetzt. Das ist sehr ärgerlich, und ich habe alles versucht, aber es wird einfach nicht mehr ändern als einmal.

Kennt jemand einen anderen, flexibleren Ansatz?

Danke

War es hilfreich?

Lösung

Ich bin nicht sicher, ob ich von einem Website , aber ich würde eher die Antwort hier lassen, statt einen Link. Wenn jemand in den Kommentaren klären, werde ich sehr dankbar.

Im Grunde 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: die Methode verwenden oben Sie einen COM-Verweis auf „Microsoft Internet Controls“ müssen hinzufügen

Er erwähnt Ihren Ansatz zu, und stellt fest, dass das WebBrowser-Steuerelement scheint dieses User-Agent-String cachen, so wird es nicht den User-Agent ändern, den Prozess ohne Neustart.

Andere Tipps

Der einfachste Weg:

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

Außerdem gibt es eine Refresh-Option in der Funktion (nach MSDN ). Es funktionierte gut für mich (Sie sollten es vor jedem User-Agent ändern gesetzt). Dann wird die Frage Code geändert werden könnte wie folgt:

[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);
}

Ich möchte @Jean Azzopardi Antwort hinzuzufügen.

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 funktioniert am besten für mich. Mit dem renavigating anderen seltsamen Problemen für mich verursachte, wie der Browser Inhalt plötzlich verschwinden, und manchmal noch nicht unterstützten Browser zu bekommen. Mit dieser Technik werden alle Anforderungen in Fiedler hatte den richtigen User Agent.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top