Скачать астрономическую картину дня в C#
Каждый день веб-страница
Давным-давно я написал программу для загрузки Астрономической картины дня, но в какой-то момент она перестала работать из-за того, как сайт управлял своей безопасностью. Изображения были сохранены с обычными URL http, но теперь они хранятся с URL-адресами https. В этом примере показано, как загрузить изображения с новым URL-адресом.
При загрузке программы выполняется следующий код.
// Загрузите астрономическую картину дня. private void Form1_Load(object sender, EventArgs e) { Cursor = Cursors.WaitCursor; wbrApotd.Visible = false; const string url = "http://antwrp.gsfc.nasa.gov/apod/"; try { // Загрузите веб-страницу. wbrApotd.Navigate(url); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error navigating to " + url); } }
В этом коде хранится URL-адрес веб-сайта «Астрономическая картинка дня» в переменной. Затем он вызывает метод WebBrowser элемента формы Navigate, чтобы заставить элемент управления загружать веб-страницу.
Когда веб-страница завершила загрузку, WebBrowser запускает событие DocumentCompleted и выполняет следующий код.
// Загружена веб-страница. Получите изображение APOTD. private void wbrApotd_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { HtmlDocument doc = wbrApotd.Document; string src = doc.Images[0].GetAttribute("src"); Image img = GetPicture(src); picApotd.Image = img; Cursor = Cursors.Default; Console.WriteLine(doc.Images[0].GetAttribute("src")); }
Этот код получает объект HtmlDocument загруженной веб-страницы. Он находит первый объект документа Image и использует его метод GetAttribute, чтобы получить свойство src изображения, которое является URL-адресом, где находится изображение. Он вызывает метод GetPicture для загрузки изображения с его URL-адреса и отображает его в PictureBox с именем picApotd.
В следующем коде показан метод GetPicture.
// Загрузите файл из Интернета. // Получить изображение по заданному URL. private Image GetPicture(string url) { try { WebClient web_client = new WebClient(); // Используйте одно из следующих. //ServicePointManager.SecurityProtocol = // SecurityProtocolType.Tls12; ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; MemoryStream image_stream = new MemoryStream(web_client.DownloadData(url)); return Image.FromStream(image_stream); } catch (Exception ex) { MessageBox.Show("Error downloading picture " + url + '\n' + ex.Message); return null; } }
Этот метод создает новый WebClient. Затем он устанавливает ServicePointManager.SecurityProtocol в 3072. Это говорит серверу использовать протокол безопасности TLS1.2. К сожалению, этот протокол не является частью перечисления SecurityProtocolType в версиях .NET Framework до 4.5, и этот пример был написан на C# 2008. Чтобы обойти это, код генерирует значение 3072 в тип SecurityProtocolType.
Если вы используете более новую версию .NET Framework, используйте значение закомментированного Tls12.