Автоматическая подача с использованием WebBrowser без URL-адреса

Я работаю над WebCrawler, написанным на С#, используя System.Windows.Forms.WebBrowser. Я пытаюсь загрузить файл с веб-сайта и сохранить его на локальном компьютере. Что еще более важно, я бы хотел, чтобы это было полностью автоматизировано. Загрузка файла может быть запущена нажатием кнопки, которая вызывает функцию javascript, которая испускает загрузку с отображением "Вы хотите открыть или сохранить этот файл?". Диалог. Я определенно не хочу, чтобы вручную нажимал "Сохранить как" и набрал имя файла.

Мне известны функции загрузки HttpWebRequest и WebClients, но поскольку загрузка начинается с javascript, теперь я знаю URL-адрес файла. Fyi, javascript - это функция doPostBack, которая меняет некоторые значения и отправляет форму.

Ive попытался сосредоточиться на сохранении в диалоговом окне WebBrowser, чтобы автоматизировать его там без особого успеха. Я знаю, что это способ заставить загрузку сохранять вместо запроса сохранить или открыть, добавив заголовок в http-запрос, но я не знаю, как указать путь к файлу для загрузки.

+6
17 июл. '09 в 20:09
источник поделиться
4 ответа

Я думаю, вы должны помешать диалогу загрузки даже показывать. Здесь может быть способ сделать это:

  • Код Javascript заставляет ваш элемент управления WebBrowser перемещаться по определенному URL-адресу (что вызовет появление диалогового окна загрузки)

  • Чтобы предотвратить управление веб-браузером от фактического перехода на этот URL-адрес, присоедините обработчик событий к событию навигации.

  • В вашем навигационном событии вам нужно будет проанализировать, действительно ли это действительное действие навигации, которое вы хотите остановить (является ли этот URL-адрес загрузки, возможно, проверьте расширение файла, должен быть распознаваемый формат). Для этого используйте WebBrowserNavigatingEventArgs.Url.

  • Если это правильный Url, остановите навигацию, установив свойство WebBrowserNavigatingEventArgs.Cancel.

  • Продолжайте загружать себя с помощью классов HttpWebRequest или WebClient

Посмотрите эту страницу для получения дополнительной информации о мероприятии:
http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.navigating.aspx

+5
17 июл. '09 в 20:26
источник

Аналогичное решение доступно на http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/d338a2c8-96df-4cb0-b8be-c5fbdd7c9202/?prof=required

Эта работа отлично, если есть прямой URL-адрес, включая загрузку имени файла.

Но когда-нибудь URL-адрес генерирует файл динамически. Таким образом, у URL-адреса нет имени файла, но после запроса URL-адреса какой-либо веб-сайт создаст файл динамически, а затем откроется диалог открытия/сохранения.

например, некоторая ссылка генерирует файл PDF на лету.

Как обращаться с таким типом URL?

+3
18 авг. '10 в 2:42
источник

Взгляните на статью Эрики Чинчио на http://www.codeproject.com/Tips/659004/Download-of-file-with-open-save-dialog-box

Я успешно использовал его для загрузки динамически генерируемых PDF-адресов.

+1
18 сент. '15 в 14:02
источник

Предполагая, что System.Windows.Forms.WebBrowswer был использован для доступа к защищенной странице с защищенной ссылкой, которую вы хотите загрузить:

Этот код извлекает фактическую ссылку, которую вы хотите загрузить, используя веб-браузер. Этот код необходимо будет изменить для вашего конкретного действия. Важной частью является поле documentLinkUrl, которое будет использоваться ниже.

var documentLinkUrl = default(Uri);
browser.DocumentCompleted += (object sender, WebBrowserDocumentCompletedEventArgs e) =>
{
    var aspForm = browser.Document.Forms[0];
    var downloadLink = browser.Document.ActiveElement
        .GetElementsByTagName("a").OfType<HtmlElement>()
        .Where(atag => 
            atag.GetAttribute("href").Contains("DownloadAttachment.aspx"))
        .First();

    var documentLinkString = downloadLink.GetAttribute("href");
   documentLinkUrl = new Uri(documentLinkString);
}
browser.Navigate(yourProtectedPage);

Теперь, когда защищенная страница была переадресована веб-браузером, и ссылка на скачивание была приобретена, этот код загружает ссылку.

private static async Task DownloadLinkAsync(Uri documentLinkUrl)
{
    var cookieString = GetGlobalCookies(documentLinkUrl.AbsoluteUri);
    var cookieContainer = new CookieContainer();
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler) { BaseAddress = documentLinkUrl })
    {
        cookieContainer.SetCookies(this.documentLinkUrl, cookieString);
        var response = await client.GetAsync(documentLinkUrl);
        if (response.IsSuccessStatusCode)
        {
            var responseAsString = await response.Content.ReadAsStreamAsync();
            // Response can be saved from Stream

        }
    }
}

Приведенный выше код основывается на методе GetGlobalCookies от Erika Chinchio, который можно найти в превосходной статье, предоставленной @Pedro Leonardo (доступно здесь),

[System.Runtime.InteropServices.DllImport("wininet.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName,
    System.Text.StringBuilder pchCookieData, ref uint pcchCookieData, int dwFlags, IntPtr lpReserved);

const int INTERNET_COOKIE_HTTPONLY = 0x00002000;

private string GetGlobalCookies(string uri)
{
    uint uiDataSize = 2048;
    var sbCookieData = new System.Text.StringBuilder((int)uiDataSize);
    if (InternetGetCookieEx(uri, null, sbCookieData, ref uiDataSize,
            INTERNET_COOKIE_HTTPONLY, IntPtr.Zero)
        &&
        sbCookieData.Length > 0)
    {
        return sbCookieData.ToString().Replace(";", ",");
    }
    return null;
}
+1
10 мая '16 в 15:10
источник

Посмотрите другие вопросы по меткам или Задайте вопрос