Ответ на пост «408 км над Землёй»1
Ой, да поверни телефон просто.
Исторические данные от NASA
Я ранее писал статью А вы знали что у NASA есть API?
В ней я описал как реализовал автоматическое наполнение телеграм канала https://t.me/daily_nasa "астрономической картинкой дня от NASA" с описанием на русском а также со ссылкой на загрузку картинки в HD, позже я реализовал добавление в этот канал статей на тему астрономии из http://hubblesite.org/ и тоже на русском, все круто но меня парило то, что каналу моему меньше года, а NASA публикует данные уже очень много лет, по этому я решил взяться в реализацию отображения исторических данных за выбранный период в телеграм, как? смотрите ниже.
Идея была такой, есть телеграм бот, после нажатия старт в нем отображается красивый календарь, где можно выбрать год, месяц, и день, после выбора мы получаем за этот день картинку / видео и описание (APOD в общем)
Сейчас это выглядит так:
Поклацать можете тут - https://t.me/DailyNasaCalendarbot
Реализовал все опять же таки на Python, так вот:
Те кто читал мои статьи ранее знают, что я не такой уж и фанат "изобретать велосипеды" (разве что иногда) по этому я подумал что писать красивый календарь самому будет долговато, выход? я решил поискать его на GitHub, и я нашел - https://github.com/artembakhanov/python-telegram-bot-calenda...
Отличная библиотека, которая ставится одной командой:
python3 -m pip install python-telegram-bot-calendar
Вопрос, как прикрутить это к NASA API ?
1 - Заходим в примеры (examples) и смотрим скрипт simple_pytelegrambotapi.py
Тут есть блок:
В result в конечном счете приходит год, месяц и день который вы выбрали на календаре, в примерно таком формате 2022-03-04
и это отлично, ибо все что нам остается, это записать этот result в запрос к NASA API, а именно:
В итоге остается только распарсить data, сформировать сообщение и отправить в телеграм, чуть более подробней про это тут:
А вы знали что у NASA есть API?
Продолжение поста «А вы знали что у NASA есть API?»
Ссылка на бот - https://t.me/DailyNasaCalendarbot
Ссылка на канал - https://t.me/daily_nasa
UPD:
Сейчас данные можно получать с Июля 1995 года по сегодня. В боте еще есть некоторые недоработки, но я ими займусь как только отловлю все баги, если вы случайно нарветесь на какой-то баг, или у вас будут какие-то предложения пишите их в комментарии, все приму во внимание😁
Особенности API от NASA
Ранее я писал статью А вы знали что у NASA есть API?, где я рассказал как создал канал, куда ежедневно и автоматически публикуются картина дня от NASA с описанием на русском. На мое удивление подписалось около 300 человек чему я рад, все работало как нужно, но cегодня я проснулся и публикации не увидел, подумал "что не так?"
Оказалось, что Json который NASA возвращает динамический, и мой скрипт из-за отсутствия определенного поля навернулся😁 пофиксить не проблема, но мне стало интересно, а что NASA мне послал? а оказалось что вернулось красивое видео на несколько секунд:
Дак еще и с описанием😁 я не мог такое игнорировать, и решил что подписчики должны тоже видеть эту красоту, но я столкнулся с несколькими проблемами:
1 - Видео, это просто ссылка на Youtube, а я не хочу чтобы в телеграмме для просмотра видео подписчики шли в Youtube, и так много ссылок, зачем еще одна.
2 - Если я буду добавлять описание + ссылку на Youtube будет выглядеть не так красиво (нуу не так как я задумал то есть😁) что мне тоже не очень понравилось
3 - Мне нужно было быстрое решение, но быстрых решений я пока не видел, и понимал что нужно более детально не только изучить документацию ну и поиграться с кодом, чтобы сделать все красиво.
По этому что? я решил сделать чуть более туго, но безотказно (но это не точно)
Получаем Json , понимаем что там ссылка на видео в Youtube, в итоге просто скачиваем его, формируем пост с описанием, потом отправляем в телегу этот видос, щас расскажу как:
1 - Как скачать видео с Youtube (я по прежнему использую Python):
Есть классная библиотека - pytube, в итогу нам от NASA API в поле url приходитссылка на ютуб видео, и мы его просто подставляем куда нужно:
первая строка это импорт библиотеки
url - думаю вы поняли, сюда ссылка на видео
dest - путь к директории куда будет сохранено видео
в четвертой строке, мы скармливаем библиотеке ссылку на видео, в streams.get_highest_resolution() мы выбираем самое лучшее качество, а download скачивает нам видео в нужную нам директорию
Потом я захотел чтобы я мог эти видео отдельно скачивать, тут мне помог nginx, по факту благодаря конфигурации примерно такого вида:
Можно обратится к серверу по доменному имени + имени видео, и будет возможность его скачать с так сказать собственного хранилища (нуу, такая у меня хотелка была)
Усе? нет, нужно же видео загружать в телеграм еще, и тут мне помогла моя хотелка )
на Python используя библиотеку requests пишем такую тему:
requests.post(f'https://api.telegram.org/bot<Токен вашего бота>/sendVideo?chat_id=<Ид канала>&caption=<Сообщение для видео>&video=<А ТУТ ПРОСТО ССЫЛКА НА ВИДЕО ИЗ ВАШЕГО "ХРАНИЛИЩА">&parse_mode=HTML')
что тут происходит можете читануть в предыдущей статье (там в начале ссылка) из нового тут вместо sendPhoto sendVideo, ну и добавлен параметр video, куда мы просто передаем ссылку на видео с нашего хранилища (если что, ссылку на ютуб туда передать нельзя, телеграм вас пошлет куда подальше)
и вуаля, в итоге что у нас есть:
1 - Если получили ссылку на видео в ютуб, cкачиваем видео наше хранилище.
2 - Отправляем в телеграм это видео, указывая ему ссылку на наше видео с нашего хранилища + описание.
Done😁
Подводные камни что приходят сразу на ум:
1 - Если NASA API вернет видео больше 50МБ, API телеги нас пошлет
2 - Когда сохраняете видео, лучше дополнительным параметром в методе download(dest) измените имя загружаемого файла на какое-то свое даже рандомное, ибо кто знает как там они его назовут, вдруг это навернет вам сервер или поломает скрипт 😂.
Ну и шаг с хранилищем можете опустить, это больше мне для себя любимого.
Мой канал: https://t.me/daily_nasa
если что не пугайтесь, там теперь льются еще данные из hubblesite.org