NASA OPEN APで取得した12月3日の"巨大なブラックホールに飛び込む"スーパーコンピューターでの可視化”画像

NASA OPEN APで取得した12月3日の"巨大なブラックホールに飛び込む"スーパーコンピューターでの可視化”画像

無事に当初の目的であった3I/ATLASの写真をNASA OPEN APIから取得することに成功した筆者であるが、本日(12月3日)もダブルクリックしてみると"巨大なブラックホールに飛び込む"視点をスーパーコンピューターで可視化した画像であるそうだ。太陽の400万倍というとてつもない質量を持つブラックホールに向かってカメラを突っ込むとこのような視覚になるとのこと、恐ろしくも興味深い。

インストールするツールが多くなるとローカルドライブは少しずつ削られていく。圧迫され、ドライブの容量を見るのが嫌になってくるころには買い替え検討も頭をよぎる。やはり、様々なクラウドの利便性を活かしたい。OSの垣根を越え、PC/モバイルの垣根も越えた環境に依存しないクラウド環境にストックした宇宙写真を集めておきたくなる。

OneDriveへの保存は1行追加の簡単カスタマイズ

Windowsの場合は、OS標準のOneDriveに保存するようにPowerShellのコードを変更するだけだ。筆者のOneDriveのPATHは、C:\Users\user\OneDrive\であるが汎用性のある"$env:OneDrive\$today.jpg"にして、もうひとつInvoke-WebRequestを追加する。

Invoke-WebRequest -Uri $imageUrl -OutFile "$today.jpg"
Invoke-WebRequest -Uri $imageUrl -OutFile ""$env:OneDrive\$today.jpg""

こうすることで、スクリプト実行フォルダ内とOneDrive内に西暦日時.JPGが保存される。OneDriveの方は、自動的にオンラインに保存される仕組みだ。1行のコードの追加で、アプリやスマホでシームレスに宇宙画像を眺める機会も増やせる。

  • ローカルのOneDriveフォルダ内に生成された西暦日時.JPG

    ローカルのOneDriveフォルダ内に生成された西暦日時.JPG

  • クラウドのOneDriveフォルダ内にアップロードされた西暦日時.JPG

    クラウドのOneDriveフォルダ内にアップロードされた西暦日時.JPG

PythonとGoogle Drive APIでGoogleドライブ保存

マルチクラウドな世界である。用途によってクラウドも使い分けたいところだ。翻訳にGoogle Cloud APIを稼働させてみた筆者だが、Google Drive APIはリクエスト数が数回や数十回程度であれば気にすることなく使える。こちらの連載を参考にPythonコードが最新版のPydrive2で動作するよう生成AIと問答を重ねてみた。

gdrive2.py

from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive
from datetime import datetime

def main():
    gauth = GoogleAuth()
    gauth.LocalWebserverAuth()  # OAuth認証(ブラウザが開く)
    drive = GoogleDrive(gauth)

    # 今日の日付ファイル名 (251203.jpg)
    today_filename = f"{datetime.now():%y%m%d}.jpg"

    file = drive.CreateFile({'title': today_filename})
    file.SetContentFile(today_filename)  # ローカルにある同名ファイルを指定
    file.Upload()
    print(f"アップロード完了。ファイルID: {file['id']}")

if __name__ == '__main__':
    main()

settings.yaml

client_config_backend: file
client_config_file: client_secrets.json

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

oauth_scope:
  - https://www.googleapis.com/auth/drive.file

Google CloudでGoogle Drive APIを有効にしOAuth同意画面を構築、テストユーザーに自身のGmailを登録する。その際、表示されるjsonファイルをダウンロードしclient_secrets.jsonとして、上記gdrive2.pyとsettings.yamlと同一フォルダに保存しておく。Pythonを実行すると、Googleのユーザー認証を通してcredentials.jsonが生成されて、無事にGoogleドライブにアップロードされた。

  • クラウドのGoogle Drive内にアップロードされた西暦日時.JPG

    クラウドのGoogle Drive内にアップロードされた西暦日時.JPG

一回でOneDriveとGoogleDriveに保存できるように統合する

同じフォルダ内にPowerShellスクリプト(PS1)とPythonファイル(py)を入れておけば、一回のクリックで今日の一枚を表示、OneDriveとGoogleドライブへのダブル送信も可能なはずである。PowerShellのPS1ファイルにPythonファイル呼び出しの

python .\gdrive2.py

のみを追加する。

$url = "https://api.nasa.gov/planetary/apod?api_key=●●●●●●●●●●●●●●●●●●"
$response = Invoke-RestMethod -Uri $url
$imageUrl = $response.url
$explanation = $response.explanation

#NASAの今日の一枚(APOD)URL作成
$today = Get-Date -Format "yyMMdd"
$pageUrl = "https://apod.nasa.gov/apod/ap$today.html"

# Google翻訳APIキー
$googleApiKey = "●●●●●●●●●●●●●●●●●●"
$googleUri = "https://translation.googleapis.com/language/translate/v2?key=$googleApiKey"
# 翻訳リクエストのボディ(Basicモデル)
$body = @{
    q = $explanation
    source = "en"
    target = "ja"
    format = "text"
    model = "base"
} | ConvertTo-Json

# 翻訳API呼び出し
$translationResponse = Invoke-RestMethod -Uri $googleUri -Method Post -Body $body -ContentType "application/json"
$translatedText = $translationResponse.data.translations[0].translatedText

if ($imageUrl) {
    Write-Host "画像をダウンロード中..."
    Invoke-WebRequest -Uri $imageUrl -OutFile "$today.jpg"
    Invoke-WebRequest -Uri $imageUrl -OutFile "$env:OneDrive\$today.jpg"
    python .\gdrive2.py #同一フォルダ内のpythonスクリプト呼び出し
    Write-Host "画像を保存しました。"
}

# 結果表示
Write-Host "NASAの今日の一枚(APOD)ページはこちら: $pageUrl"
Write-Host "今日のNASA画像のURLはこちら: $imageUrl"
Write-Host "今日のNASA画像の説明(翻訳):"
Write-Host $translatedText
Read-Host "終了するには、Enterキーを押してね"
  • PowerShellスクリプトを実行することで

    PowerShellスクリプトを実行することで

  • GoogleドライブとOneDriveに取得画像が保存される

    GoogleドライブとOneDriveに取得画像が保存される

当初、同じ形式の西暦画像ファイル名を書き出さなければならないところPythonでのファイル生成のフォーマットを%Y%m%dとしていたために、20251203.jpgと出力していた。本来、%y%m%dでなければ251203.jpgにならないのだが、これが意外と気がつかない。

20251203.jpg 251203.jpg

脳は視覚から入るいろんな情報を補完して伝達しているというが、西暦画像ファイルがあるのになぜ、FileNotFoundのエラーが出るのか?Pythonの環境なのか?と小一時間悩んでしまった。すべてバイブコーディングならば、そんな単純なミスはないのだろうが、数字が並ぶ西暦日付ファイルは同じであるという"先入観"。コードだけでなく日常のいたるところに潜む罠であると痛感しながらも、雄大な天体画像で瞬時に気分転換だ。