سؤال

أحاول تغيير استخدام UserAgent من عنصر التحكم WebBrowser في تطبيق WinForms.

لقد حققت هذا بنجاح باستخدام التعليمات البرمجية التالية:

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

المشكلة الوحيدة هي أن هذا يعمل مرة واحدة فقط. عندما أحاول تشغيل طريقة التغيير () للمرة الثانية لا يعمل. يبقى مضبوطا على القيمة الأولى التي تم تغييرها. هذا مزعج للغاية وجربت كل شيء ولكنها لن تغير أكثر من مرة.

هل يعرف أي شخص بمهارة مختلفة وأكثر مرونة؟

شكرا

هل كانت مفيدة؟

المحلول

لست متأكدا مما إذا كان يجب عليك فقط نسخ / لصق من موقع الكتروني, ، لكنني أفضل ترك الإجابة هنا، بدلا من الرابط. إذا كان أي شخص يمكن أن يوضح في التعليقات، سأكون ملزما كثيرا.

أساسا، يجب عليك تمديد فئة WebBrowser.

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

ملاحظة: لاستخدام الطريقة أعلاه، ستحتاج إلى إضافة مرجع كوم إلى "عناصر تحكم الإنترنت ل Microsoft".

يذكر أن نهجك أيضا، وينص على أن عنصر التحكم WebBrowser يبدو أنه ذاكرة التخزين المؤقتة من سلسلة وكيل المستخدم هذا، لذلك لن يغير وكيل المستخدم دون إعادة تشغيل العملية.

نصائح أخرى

أسهل طريقة:

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

أيضا، هناك خيار تحديث في الوظيفة (وفقا ل MSDN.). لقد عملت بشكل جيد بالنسبة لي (يجب عليك تعيينه قبل تغيير أي مستخدم مستخدم). ثم يمكن تغيير رمز السؤال مثل هذا:

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

أود أن أضيف إلى إجابة @ Jean Azzopardi.

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

هذا الحل عمل أفضل بالنسبة لي. تسبب استخدام RenoVigating في مشكلات غريبة أخرى بالنسبة لي، مثل محتوى المتصفح تختفي فجأة، وأحيانا لا يزال الحصول على متصفح غير مدعوم. مع هذه التقنية، كان لدى جميع الطلبات في Fiddler وكيل المستخدم الصحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top