На регулярной основе мне приходится делать следующее вручную в веб-браузере:
- Перейдите на веб-сайт https.
- Вход в веб-форму.
- Нажмите на ссылку, чтобы загрузить большой файл (135 МБ).
Я бы хотел автоматизировать этот процесс с помощью .NET.
Несколько дней назад я разместил этот вопрос здесь. Благодаря фрагменту кода Rubens Farias я теперь могу выполнять вышеуказанные шаги 1 и 2. После шага 2 я могу прочитать HTML-код страницы, содержащей URL-адрес загружаемого файла (используя afterLoginPage = reader .ReadToEnd ()). Эта страница отображается только в том случае, если вход в систему предоставлен, поэтому шаг 2 проверен на успешность.
Теперь у меня вопрос, как, конечно, как выполнить шаг 3. Я пробовал кое-что, но безрезультатно, доступ к файлу был закрыт, несмотря на успешный предыдущий вход в систему.
Чтобы прояснить ситуацию, я опубликую приведенный ниже код, разумеется, без фактической информации для входа и сайтов. В конце переменная afterLoginPage содержит HTML-код страницы после входа в систему, содержащей ссылку на файл, который я хотел бы загрузить. Эта ссылка также начинается с https.
Dim httpsSite As String = "https://www.test.test/user/login"
' enter correct address
Dim formPage As String = ""
Dim afterLoginPage As String = ""
' Get postback data and cookies
Dim cookies As New CookieContainer()
Dim getRequest As HttpWebRequest = DirectCast(WebRequest.Create(httpsSite), HttpWebRequest)
getRequest.CookieContainer = cookies
getRequest.Method = "GET"
Dim wp As WebProxy = New WebProxy("[our proxies IP address]", [our proxies port number])
wp.Credentials = CredentialCache.DefaultCredentials
getRequest.Proxy = wp
Dim form As HttpWebResponse = DirectCast(getRequest.GetResponse(), HttpWebResponse)
Using response As New StreamReader(form.GetResponseStream(), Encoding.UTF8)
formPage = response.ReadToEnd()
End Using
Dim inputs As New Dictionary(Of String, String)()
inputs.Add("form_build_id", "[some code I'd like to keep secret]")
inputs.Add("form_id", "user_login")
For Each input As Match In Regex.Matches(formPage, "<input.*?name=""(?<name>.*?)"".*?(?:value=""(?<value>.*?)"".*?)? />", RegexOptions.IgnoreCase Or RegexOptions.ECMAScript)
If input.Groups("name").Value <> "form_build_id" And _
input.Groups("name").Value <> "form_id" Then
inputs.Add(input.Groups("name").Value, input.Groups("value").Value)
End If
Next
inputs("name") = "[our login name]"
inputs("pass") = "[our login password]"
Dim buffer As Byte() = Encoding.UTF8.GetBytes( _
[String].Join("&", _
Array.ConvertAll(Of KeyValuePair(Of String, String), String)(inputs.ToArray(), _
Function(item As KeyValuePair(Of String, String)) (item.Key & "=") + System.Web.HttpUtility.UrlEncode(item.Value))))
Dim postRequest As HttpWebRequest = DirectCast(WebRequest.Create(httpsSite), HttpWebRequest)
postRequest.CookieContainer = cookies
postRequest.Method = "POST"
postRequest.ContentType = "application/x-www-form-urlencoded"
postRequest.Proxy = wp
' send username/password
Using stream As Stream = postRequest.GetRequestStream()
stream.Write(buffer, 0, buffer.Length)
End Using
' get response from login page
Using reader As New StreamReader(postRequest.GetResponse().GetResponseStream(), Encoding.UTF8)
afterLoginPage = reader.ReadToEnd()
End Using