定期的に最新の天気図を壁紙にするプログラム

# はじめに
私事ですが、来月実施される気象予報士試験を受験します。(学科は受かっているのであとは実技だけ……)
受験に向けて天気図に慣れておきたいと思っていますが、定期的に天気図アプリや気象庁のホームページをチェックするのは~~面倒で~~よく忘れてしまいます。
そこで、パソコンを起動するたびに気象庁のHPから天気図のPDFを取り込んで、それを画像ファイルに変換して壁紙に設定するプログラムを作成しました。
壁紙なら毎日見るっしょ。

(2020年10月追記)
気象予報士試験、無事合格しました。壁紙を天気図にすることは大変有効であることが証明されたので(N=1)、是非お試しください。

(2021年3月14日追記)
気象庁のHPの構成が一部変わったため天気図のURLが変更されました。
それに合わせてコードに記載している天気図のURLを修正しました。

環境：Windows10 + Python3.7

# フォルダ構成
プロジェクトフォルダの構造は、以下のようにしています。
・tenkizu_kabegami.pyは、天気図を取得して壁紙にするプログラムのコードです。
・tenkizu_kabegami.batは、tenkizu_kabegami.pyを実行させるためのbatファイルです。
・tenkizu_kabegami.vbsは、tenkizu_kabegami.batを実行させるためのファイルです。
　batをそのまま起動すると黒い画面が出てしまうので、それを出さないようにvbsを使用します。
・tenkizu_pdfは、天気図をPDFファイルとして保管するフォルダです。
・tenkizu_pngは、天気図をpngファイルとして保管するフォルダです。
・popplerは、PDFを画像ファイルにするときに必要なものらしいです。

```
プロジェクトフォルダ
├── tenkizu_kabegami.py
├── tenkizu_kabegami.bin
├── tenkizu_kabegami.vbs
├── tenkizu_pdf
│   └── (天気図をPDFファイルとして保管)
├── tenkizu_png
│   └── (天気図をpngファイルとして保管)
└── poppler
    ├── bin
    ├── include
    ├── lib
    └── share
```

#手順
- pdf2imageをpipでインストール
- popplerを準備<br>
　1. 以下のホームページからpoppler-0.XX.0_x86をダウンロード<br>
　　http://blog.alivate.com.au/poppler-windows/<br>
　2. ダウンロードしたファイル(7z形式)を解凍して、名前を「poppler」にした上で作業フォルダにコピー。
- コードを書く<br>
　次節の通り、tenkizu_kabegami.pyを作る。
- batファイルを作る<br>
　1. 作業フォルダでメモ帳を開き、`python tenkizu_kabegami.py`と書いて保存して閉じる。<br>
　2. ↑のメモ帳の名前をtenkizu_kabegami.batに変える(拡張子をbatにする)。
- vbsファイルを作る<br>
　1. 作業フォルダでメモ帳を開き、<br>
```Set ws = CreateObject("Wscript.Shell")```<br>
```ws.run "cmd /c tenkizu_kabegami.bat", vbhide```<br>
  　と書いて保存して閉じる。<br>
　2. ↑のメモ帳の名前をtenkizu_kabegami.vbsに変える(拡張子をvbsにする)
- 以下のホームページを参考に、作成したvbsファイルを定期実行するようタスクスケジューラに登録する。<br>
[Windowsタスクスケジューラで定期的にプログラムを実行する方法](https://tonari-it.com/windows-task-schdeuler/)<br>
 「プログラム/スクリプト」に↑で作ったvbsファイルの絶対パスを入力してください。<br>
【注意】タスクスケジューラを設定するときには作業フォルダを指定しないとうまく動きません。「プログラム/スクリプト」を入力する画面にある「開始(オプション)」にプロジェクトフォルダのパスを記載してください。以下のホームページ参照。<br>
[タスクスケジューラで作業フォルダを指定する方法](https://delightmode.com/win-taskscheduler/)<br>
    - 定期実行のタイミングは、毎日0時、6時、12時、18時+ログインorスタートアップ時がおすすめ。<br>
    - これは、天気図の更新が毎日5:30、11:30、17:30、23:30頃であるが、多少前後することがあるため。



#コード
以下のようにスクリプトを書きました。
tenkizu_kabegami.pyとしてディレクトリに保管します。
天気図のpdfや画像ファイルが増え続けるのが嫌な人はこれらを削除するコードを適当に付け加えておいてください。

```tenkizu_kabegami.py
#プロジェクトフォルダにtenkizu_pdfとtenkizu_pngのフォルダがあるかチェックする。なければ作る。
import os
if not os.path.isdir("tenkizu_pdf"):
    os.mkdir("tenkizu_pdf")

if not os.path.isdir("tenkizu_png"):
    os.mkdir("tenkizu_png")

#天気図のファイル名称を設定する。形式はASAS+日+時刻+UTC_+月(英3字)+年(西暦)。
"""
・日付や時刻などはいずれも天気図を作成するのに用いた観測データの観測時刻。日本時間ではなく協定世界時なので注意。
・天気図は日本時間の3時、9時、15時、21時に観測されたものが、約2時間30分後に発表されます。
・例えば日本時間の2020年7月5日6:00にこのプログラムを実行すると、日本時間7月5日3:00(協定世界時7月4日18：00)の
　天気図が取得されるため、「ASAS041800UTC_JUL2020.pdf」になります。
・本当はアンダバーではなく半角スペース、月略称の後にピリオドが入るのですがファイル名にこれらを入れるとよくなさそうなので少し変更。
・ASASはAnalysis Surface ASiaの略です。
"""
import datetime
now = datetime.datetime.now()
now_minutes = now.hour * 60 + now.minute
time_tenkizu = now - datetime.timedelta(minutes = now_minutes \
                    - int((now_minutes+30)/360)*360+180,hours = 9)
tenkizu_name = time_tenkizu.strftime("ASAS%d%H00UTC_%b%Y").upper()

#気象庁のHPから天気図のPDFをダウンロードして、tenkizu_pdfに保管。
import urllib.request
url = "https://www.data.jma.go.jp/fcd/yoho/data/wxchart/quick/ASAS_MONO.pdf"
pdf_name = "tenkizu_pdf/" + tenkizu_name + ".pdf"
urllib.request.urlretrieve(url,pdf_name)

#PDFをpngに変換。
#popplerを実行させるために、os.environにpopplerを追加することで一時的にpathを通します。
import pdf2image
from pathlib import Path
poppler_dir = "poppler/bin"
os.environ["PATH"] += os.pathsep + str(poppler_dir)
image = pdf2image.convert_from_path(pdf_name, grayscale=True, size=1920)
image[0].save("tenkizu_png/" + tenkizu_name + '.png')

#pngファイルを壁紙にします。
import ctypes
image_name = str(os.getcwd())+"/tenkizu_png/" + tenkizu_name + '.png'
ctypes.windll.user32.SystemParametersInfoW(20, 0, image_name, 0)
```
#まとめ
これで毎日新しい天気図を見ることができるはずです。気象予報士試験合格待ったなし。

#参考にしたホームページ
- PythonでPDFを画像ファイル（JPEG、PNG）に変換する方法<br>
https://gammasoft.jp/blog/convert-pdf-to-image-by-python/
- Python3でWindowsの壁紙を変更する<br>
https://qiita.com/lobmto/items/6d3649e6c00b98553ca2
- バッチファイルを実行する時に黒いコマンドプロンプト画面を表示しない方法<br>
https://amaotolog.com/pc-benri/33
- Windowsタスクスケジューラで定期的にプログラムを実行する方法<br>
https://tonari-it.com/windows-task-schdeuler/
- タスクスケジューラで作業フォルダを指定する方法<br>
https://delightmode.com/win-taskscheduler/