Скачать астрономическую картину дня в 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.
