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

Источник: http://csharphelper.com/blog/2017/01/download-astronomy-picture-day-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *