آموزشبرنامه نویسیپایتونتکنولوژی

نحوه استفاده از NASA API برای دریافت تصاویر

نحوه استفاده از NASA API برای دریافت تصاویر

سازمان ملی هوانوردی و فضایی (ناسا) تصاویر نجومی شگفت انگیزی را از طریق سرویس تصویر نجوم ارائه می دهد. در این آموزش ، ما قصد داریم از API ناسا و کتابخانه nasa.py برای دریافت تصاویر استفاده کنیم.

API مجموعه دستورالعمل ها و استانداردهایی است که برای دسترسی به یک برنامه وب استفاده می شود. API ابزاری بسیار مفید است که به ما امکان می دهد اطلاعات را به صورت عمومی به اشتراک بگذاریم.

چگونه با استفاده از API ناسا یک عکس نجوم دریافت کنیم؟

در برنامه زیر ، ما قصد داریم عکس نجوم روز (APOD) را با استفاده از Open API NASA دریافت کنیم.

نحوه استفاده از NASA API برای دریافت تصاویر

این برنامه فقط پرونده های تصویری را بارگیری می کند. اگر برای تاریخ امروز هیچ پرونده تصویری در دسترس نباشد ، به سادگی پیامی را چاپ می کند و می گوید: “تصویر موجود نیست”.

اگر فایل تصویری موجود باشد ، در سیستم محلی بارگیری می شود. سپس ، برنامه ما تصویر را از سیستم محلی واکشی می کند و آن را به همراه اطلاعات اضافی (به عنوان مثال ، آدرس اینترنتی) نمایش می دهد.

در مرحله بعدی ، از کاربر می پرسد که می خواهد اطلاعات عکس را به چه صورتی دریافت کند. اگر کاربر بخواهد توضیح صوتی را بشنود ، ما از کتابخانه Google Text to Speech (GTTS) برای تبدیل توضیح متن به یک فایل صوتی و پخش آن استفاده خواهیم کرد.

مرحله 1: فراخوانی کتابخانه های مورد نیاز

#Import required libraries:
import nasapy
import os
from datetime import datetime
import urllib.request
from IPython.display import Image,display,Audio
from gtts import gTTS

nasapy: ما قصد داریم از کتابخانه nasapy برای دسترسی به اطلاعات ارائه شده توسط  NASA’s API استفاده کنیم.

کتابخانه os: برای ذخیره تصویر در یک دایرکتوری خاص ، ما از کتابخانه os استفاده می کنیم.

datetime: ما هنگام ارسال درخواست به NASA API برای دسترسی به اطلاعات از یک تاریخ استفاده می کنیم. برای دریافت تاریخ در یک قالب خاص ، ما از کتابخانه datetime استفاده خواهیم کرد.

urllib: تصویری که از NASA API می گیریم به شکل یک URL خواهد بود ، بنابراین برای واکشی آن از urllib استفاده می کنیم.

Ipython: باید تصویر را با استفاده از کتابخانه Ipython در یک دفترچه jupyter نمایش دهیم. ما همچنین توضیح صوتی تصویر را با استفاده از ماژول صوتی دریافت خواهیم کرد.

gtts: ما برای تبدیل توضیح متن تصویر به یک فایل صوتی از کتابخانه Google Text to Speech استفاده می کنیم.

مرحله 2: یک شی از کلاس Nasa ایجاد کنید

در اینجا ، ما قصد داریم یک متغیر به نام nasa ایجاد کنیم. ما از کتابخانه nasapy و کلید api که یکی از متد های کتابخانه است استفاده کرده و برای بدست آوردن اطلاعات نجومی از متد Nasa استفاده میکنیم.

k = "523p5hPYHGzafYGLCkqa54kKMTV2vbP0XcPxkcLm"

nasa = nasapy.Nasa(key = k)

مرحله 3: تاریخ را در قالب مورد نیاز دریافت کنید

برای بدست آوردن تصویر در تاریخ دلخواه ، باید تاریخ دلخواه را در یک قالب خاص بنویسیم. قالب مورد نیاز تاریخ با استفاده از تابع datetime.today () YYYY-MM-DD است. بنابراین ، ما باید این tuple را با استفاده از تابع strftime(%Y-%m-%d) به رشته تبدیل کنیم.

d = datetime.today().strftime('%Y-%m-%d')

مرحله 4: دریافت اطلاعات از API NASA

#Get the image data:

apod = nasa.picture_of_the_day(date=d, hd=True)

متغییر apod یک فرهنگ لغت از کلیدها و مقادیر مختلف است. بیایید نگاهی به کلیدهای این متغیر بیندازیم:

  • date
  • title
  • copyright
  • explanation
  • url
  • hdurl
  • media_type
  • service_version

مرحله 5: نمایش تصویر و سایر اطلاعات

if(apod["media_type"] == "image"):
    #POINT B:
    #Displaying hd images only:

    if("hdurl" in apod.keys()):

        #POINT C:
        #Saving name for image:
        title = d + "_" + apod["title"].replace(" ","_").replace(":","_") + ".jpg"

        #POINT D:
        #Path of the directory:
        image_dir = "./Astro_Images"

        #Checking if the directory already exists?
        dir_res = os.path.exists(image_dir)

        #If it doesn't exist then make a new directory:
        if (dir_res==False):
            os.makedirs(image_dir)

        #If it exist then print a statement:
        else:
            print("Directory already exists!\n")     

        #POINT E:
        #Retrieving the image:
        urllib.request.urlretrieve(url = apod["hdurl"] , filename = os.path.join(image_dir,title))        

        #POINT F:
        #Displaying information related to image:      
        if("date" in apod.keys()):
            print("Date image released: ",apod["date"])
            print("\n")
        if("copyright" in apod.keys()):
            print("This image is owned by: ",apod["copyright"])
            print("\n")
        if("title" in apod.keys()):
            print("Title of the image: ",apod["title"])
            print("\n")
        if("explanation" in apod.keys()):
            print("Description for the image: ",apod["explanation"])
            print("\n")
        if("hdurl" in apod.keys()):
            print("URL for this image: ",apod["hdurl"])
            print("\n")       

        #POINT G:
        #Displaying main image:
        display(Image(os.path.join(image_dir,title)))     

        #Point H:
        #Text to Speech Conversion:
        #Take input from user:
        print("\n")
        choice = input("Press * to hear the audio explanation : ")
        if(choice=="*"):
            #Text to be converted:
            mytext = apod["explanation"]

            #mytext="Good Evening Pratik."
           #Creating an object:
            myobj = gTTS(text=mytext, lang="en", slow=False)             

            #Generating audio file name:
            audio_title = d + "_" + apod["title"] + ".mp3"        

            #Save the converted file:
            myobj.save(os.path.join(image_dir,audio_title)) 

            #Name of sound file:
            sound_file = os.path.join(image_dir,audio_title)

            # Playing the converted file 
            display(Audio(sound_file, autoplay=True))

#POINT I:
#If media type is not image:
else:
    print("Sorry, Image not available!")

توضیح خط به خط کدها

نمایش تصاویر:
  • اول از همه ، ما فقط قصد داریم تصاویر را نمایش دهیم.
  • بعد ، فقط تصاویر با کیفیت بالا را دریافت میکنیم. بنابراین اگر تصویر ما دارای تعریف استانداردی نباشد وارد حلقه نمی شویم.
  • اکنون ، ما باید نوع خاصی از ساختار نام را برای ذخیره تصاویر حفظ کنیم. در اینجا ، ما از تاریخ تصویر و به دنبال عنوان تصویر و پس از آن پسوند تصویر استفاده خواهیم کرد.
  • همچنین ما با استفاده از یک علامت سمی کولون (;) فاصله را جایگزین می کنیم.
ایجاد فهرست:
  • اکنون باید یک دایرکتوری خاص برای ذخیره تصاویر داشته باشیم. ما با استفاده از کتابخانه os یک فهرست ایجاد می کنیم. برای بررسی وجود دایرکتوری یا نبودن آن ، ما از تابع .exist () استفاده می کنیم. اگر فهرست وجود ندارد ، پس ما آن را با استفاده از تابع .makedirs () ایجاد می کنیم.
  • اکنون ما با استفاده از url بازیابی شده در متغیر apod تصویر را واکشی می کنیم. برای واکشی تصویری از عملکرد request.urlretrieve () استفاده می کنیم.
  • ما همچنین از path.join () برای ذخیره تصویر در فهرست جدید ایجاد شده با نام عنوان مشخص شده استفاده می کنیم.
  • ما از apod [“hdurl”] برای بارگیری تصویر استفاده می کنیم.
نمایش سایر اطلاعات:

اکنون که تصویر و سایر اطلاعات ما نمایش داده می شود ، از کاربر می پرسیم که آیا می خواهد توضیحات تصویر را بشنود یا خیر. اگر کاربر * را فشار دهد ، ما از کتابخانه Google Text to Speech (gtts)  برای تبدیل متن به فایل صوتی استفاده خواهیم کرد.

ما یک متغیر ایجاد می کنیم که متن را برای تبدیل به گفتار دریافت میکند. سپس ما این اطلاعات را در پوشه خاصی با پسوند .mp3 ذخیره می کنیم. سپس از تابع Audio () برای پخش فایل صوتی در نوت بوک jupyter استفاده می کنیم.

اگر نوع رسانه تصویری نباشد ، ما یک پیام کوتاه چاپ می کنیم که می گوید: “تصویر موجود نیست”.

بارگیری تصاویر نجوم برای طیف وسیعی از تاریخ ها

اکنون که می دانیم چگونه یک تصویر را برای یک تاریخ خاص بارگیری و نمایش دهیم ، وقت آن است که کارها را کمی جلوتر ببریم. ما برای محدوده ای از تاریخ ، تصاویر را بارگیری کرده و یک تصویر تصادفی از بارگیری های خود نمایش می دهیم. در زیر می فهمیم که چگونه میتوان این کار را انجام داد.

مرحله 1: فراخوانی کتابخانه ها

کتابخانه های مورد نیاز را فراخانی کنید. این ها همان کتابخانه هایی هستند که قبلاً استفاده کرده بودیم.

#These are the same libraries we used previously.
#Import required libraries:
import nasapy
import os
import pandas as pd
import urllib.request
from IPython.display import Image,display

مرحله 2: ایجاد یک شی از کلاس Nasa

در اینجا ما قصد داریم یک متغیر به نام nasa ایجاد کنیم. ما از کتابخانه nasapy و کلید api ثبت شده خود nasapy استفاده کرده و مجدد برای بدست آوردن اطلاعات نجومی از متد Nasa استفاده میکنیم.

#Initialize Nasa class by creating an object:
k = "523p5hPYHGzafYGLCkqa54kKMTV2vbP0XcPxkcLm"
nasa = nasapy.Nasa(key = k)

مرحله 3: لیستی از تاریخ ها را دریافت کنید

ما می خواهیم برای بیشتر از یک تاریخ بیش از یک تصویر دریافت کنیم. بنابراین ، ما از تابع date_range () و کتابخانه pandas استفاده می کنیم. این عملکرد لیستی از تاریخ ها را در قالب مورد نیاز به ما می دهد.

ما قصد داریم 5 تصویر را بارگیری کنیم ، اما شما می توانید با تغییر مقادیر ، هر تعداد را که می خواهید بارگیری کنید.

#Get a list of dates:
dates = pd.date_range(end = '2020-08-15', periods=5)

مرحله 4: داده ها را دریافت کنید

در حالت قبلی ، ما فقط یک تصویر داشتیم. اما در اینجا ، ما قصد داریم چند تصویر را بارگیری کنیم. برای انجام این کار ، ما در حال ایجاد یک لیست خالی برای ذخیره تمام مقادیر برای همه تصاویر به عنوان دیکشنری هستیم.

#Empty list to store dictionary keys and values:
data = []

#Getting all the data:
for d in dates:
    apod = nasa.picture_of_the_day(d, hd=True)
    if apod['media_type'] == 'image':
        if 'hdurl' in apod.keys():
            data.append({'date':apod['date'], 'title': apod['title'],'hdurl': apod['hdurl']})

مرحله 5: پوشه ای را برای دریافت تصاویر قرار دهیم

اکنون ما می خواهیم مانند گذشته دایرکتوری را برای ذخیره تصاویر ایجاد کنیم.

#Path of the directory:
image_dir = "AAA_Images_1"
#Checking if the directory already exists?
dir_res = os.path.exists(image_dir)

#If it doesn't exist then make a new directory:
if (dir_res==False):
    os.makedirs(image_dir)
#If it exist then print a statement:
else:
    print("Directory already exists!\n")

مرحله 6: بارگیری تصاویر

اکنون که تمام اطلاعات تصویر و فهرست را بدست آورده ایم ، قصد داریم تصاویر را بارگیری کنیم. ما برای دسترسی در تمام داده های لیست خود از حلقه for استفاده می کنیم.

#Retrieving the image:    
for img in data: 
    #Creating title for image:
    title = img["date"]+"_"+img["title"].replace(" ","_").replace(":","_")+".jpg"
    #Downloading the image:
    urllib.request.urlretrieve(img['hdurl'],
os.path.join(image_dir,title))

مرحله 7: لیستی از تصاویر را دریافت کنید

اکنون که همه تصاویر را بارگیری کردیم ، زمان نمایش آنها فرا رسیده است. تصاویر زیادی در فهرست وجود دارد ، بنابراین می توانیم با استفاده از کد زیر لیستی از تصاویر را بدست آوریم.

#Get a list of images:
astro_images = os.listdir(image_dir)

مرحله 8: نمایش یک تصویر

اکنون می توانیم با استفاده از Image () تصویری را به راحتی نمایش دهیم. ما برای پیدا کردن محل تصویر از os.path.join () استفاده می کنیم. در اینجا ما می خواهیم 1 تصویر را از لیست تصاویر موجود نمایش دهیم.

#Displaying an image:
Image(os.path.join(image_dir, astro_images[1]))

مرحله 9: نمایش یک تصویر تصادفی از لیست

ما می توانیم از کتابخانه random پایتون استفاده کنیم تا تصویری تصادفی از لیست تصاویر موجود بدست آوریم.

#Get random image:
import random
Image(os.path.join(image_dir, astro_images[random.randint(0,len(astro_images)-1)]))

موفق باشید.

علی پازکی

علاقه مند به برنامه نویسی ، علم امنیت و همچنین مسائل علمی ? همیشه درحال یادگیری♾

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا