# 毎月壁紙を自動で変えたい！

# Qiitaはじめました
いろんな調べごとでお世話になってたQiita, まさかの初投稿です。
うまく書けるかドキドキです。
備忘として、やったことをメモしていければなーと思います。

# 毎月壁紙を自動で変えたい！
いろんなところで配布されているカレンダー入りの壁紙、かわいくて使いたいけど手動で毎月変えるのが面倒なので、Pythonを使って自動で変えるプログラムを作ってみました。
今回は[東京ディズニーリゾート](https://www.tokyodisneyresort.jp/tdr/wallpaper.html)で配布している壁紙を使いたいと思います。
初めてのPythonでしたが意外と簡単にできました。

# 環境
- Windows10
- Python 3.9.6

# はじめに
まず初めに、画像をダウンロードするコードを書いてみます。
といっても、[コピペ](https://note.nkmk.me/python-download-web-images/)です。
※この辺のお勉強はこれから頑張ります。。。

~~~python3
	import os
	import pprint
	import time
	import datetime
	import urllib.error
	import urllib.request
	
	def download_file(url, dst_path):
	    try:
	        with urllib.request.urlopen(url) as web_file:
	            data = web_file.read()
	            with open(dst_path, mode='wb') as local_file:
	                local_file.write(data)
	    except urllib.error.URLError as e:
	        print(e)
~~~

# URL
ダウンロードしたい壁紙のURLを確認します。

> https://media2.tokyodisneyresort.jp/home/tdr/wallpaper2021/08/wallpaper_202108_1.jpg

どうやら、"~/wallpaper **yyyy**/**mm**/wallpaper_**yyyymm**_1.jpg" の書式のようです。
現在の西暦と月を引用できればURLはわかりそうです。
なので、まずは今日の日付を取得しました。

~~~python3
	#--- import Today's date ---
	dt_now = datetime.datetime.now()
	print(dt_now.strftime('%Y/%m/%d'))
~~~

~~~
$ python wallpaper_test.py
2021/08/30
~~~

今日の日付が取れました。
西暦取得時に、4桁取る場合は **Y** を大文字にし、
下2桁だけでよい場合は、**y** を小文字で書けば良いみたいです。

~~~python3
	print(dt_now.strftime('%y/%m/%d'))
~~~

~~~
$ python wallpaper_test.py
21/08/30
~~~

これを使って、URLを作っていきます。
URLを基に、取得した西暦と月を当てはめていきます。

~~~python3
	#--- url make ---
	dsite1 = 'https://media2.tokyodisneyresort.jp/home/tdr/wallpaper'+dt_now.strftime('%Y/%m/')
	dsite2 = 'wallpaper_'+dt_now.strftime('%Y%m')+'_1.jpg'
	url = dsite1+dsite2
	print('url: '+url)
~~~

~~~
$ python wallpaper_test.py
2021/08/30
url: https://media2.tokyodisneyresort.jp/home/tdr/wallpaper2021/08/wallpaper_202108_1.jpg
~~~

うまく作れてそうです。

# 格納先指定
ダウンロード後に画像を格納するパスを指定します。
`dst_path ` でパスを指定する際、パスを文字列として扱うために **r** または **R** を先頭につけます。
これがないと、\U や \a が[エスケープシーケンス](https://www.gixo.jp/blog/12406/)とみなされてしまうため、エラーが発生します。
パスの最後には、保存する画像のファイル名まで指定します。
 
~~~python3
	#--- path make ---
	dst_path = r'C:\Users\ayk_f\wallpaper\wallpaper_'+dt_now.strftime('%Y%m')+'_1.jpg'
	print('path: '+dst_path)
~~~

~~~
$ python wallpaper_test.py
2021/08/30
url: https://media2.tokyodisneyresort.jp/home/tdr/wallpaper2021/08/wallpaper_202108_1.jpg
path: C:\Users\ayk_f\wallpaper\wallpaper_202108_1.jpg
~~~

パスがつくれました。

# 壁紙ダウンロード
作ったURLと格納先を使って、今月の壁紙をダウンロードします。

~~~python3
	#--- wallpaper download ---
	download_file(url, dst_path)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/579c65e4-d2b1-3258-9d9a-daad8aa4c3c1.png)

ダウンロードできました！


# 壁紙設定
壁紙のダウンロードまで完了したので、次は壁紙を設定します。

~~~python3
	import ctypes
	ctypes.windll.user32.SystemParametersInfoW(20, 0, dst_path, 0)
~~~

これも基本[コピペ](https://qiita.com/lobmto/items/6d3649e6c00b98553ca2)です。壁紙が格納されている絶対パスを指定します。
これで、うまく壁紙が変更できました！


# Windowsタスクスケジューラの設定
壁紙ダウンロードから設定までできたので、Windowsのタスクスケジューラで毎月1日に実行するようにします。
基本は[この記事](https://qiita.com/kawa-Kotaro/items/4005a43eb686eae41448)の通りです。

参考までに、設定方法を貼っておきます。

### 1. 基本タスクの作成
タスクスケジューラを起動し、「基本タスクの作成」を選択
選択後、タスク名を設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/9fe8caa8-f824-ebd9-9516-277f0e89d1cd.png)

### 2. トリガーの設定
Monthly（毎月）を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/114aceb3-40e7-b75e-3209-c44326742418.png)

### 3. トリガーの詳細設定
開始日と時間を設定。
今日の日付（2021/8/30）の朝9:00から開始することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/6385db1a-d5e9-621b-919b-132d6ed16436.png)

スケジュールを実行する月を選択。
毎月なので、全部選択です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/3444ab68-640a-944c-8084-df78937f4437.png)

何日に実行するかを決めます。
とりあえず毎月1日に実行しようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/171ed6a7-0496-5960-0953-102ac802462d.png)

### 4. 操作の設定
もちろん、「Start a program」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/f0effdea-8827-0a15-9971-083221b16e52.png)

実行するプログラムを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/1381d69d-8e1d-a85d-3212-a59d5f0cfda1.png)

①実行するコード（.py）を選択し、絶対パスを入力
②実行するコード名（.py）を入力
　※①で選択したファイル名と同一です。
③python3が格納されている絶対パスを入力
　絶対パスは以下のコマンドで確認することができます。

~~~
$ py --list-path
Installed Pythons found by C:\Windows\py.exe Launcher for Windows *
~~~


### 5. 完了
チェックボックスを有効化し、完了です。
これでWindowsスケジュールに追加されるので、毎月1日に壁紙が変わるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/ef32d6af-c470-7201-d48d-33cfaaf467e3.png)



# ちなみに
ちなみに、PCの日付を変えたらほかの月の壁紙もダウンロードできました。

~~~
$ python wallpaper_test.py
2021/07/30
url: https://media2.tokyodisneyresort.jp/home/tdr/wallpaper2021/07/wallpaper_202107_1.jpg
path: C:\Users\ayfukui\Box\wallpaper\wallpaper_202107_1.jpg
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953283/e9eac518-7ff3-5951-0b4f-9665f47da9bf.png)

「Date modified」が 2021/7/30 になっているのが確認でき、無事に壁紙も変わりました。


# さいごに
初めてのPythonにはじめてのQiitaでした。
プログラミング自体もかなーーーーり久しぶりでしたが、意外と何とかなりました。
9/1にきちんと壁紙が変わるか楽しみです。
毎月の壁紙URLが変わってしまうとうまく動かないので、エラー画面とか出たほうがいいのかな～。と思ったり。
うまく動いてなさそうならまた考えます。

# 追記
使ってみていくつか課題が見つかったので、次の記事でまとめました。（2021/9/13）

https://qiita.com/ayk_f/items/40eca2f7376a2b04ce4c


# 参考サイト
- [PythonでWeb上の画像などのファイルをダウンロード（個別・一括） - note.nkmk.me](https://note.nkmk.me/python-download-web-images/)
- [【Python】エラー：unicode error “unicodeescape”の原因と解決方法 - OFFICE54](https://office54.net/python/python-unicode-error)
- [Pythonで現在時刻・日付・日時を取得 - note.nkmk.me](https://note.nkmk.me/python-datetime-now-today/)
- [Python3でWindowsの壁紙を変更する - Qiita](https://qiita.com/lobmto/items/6d3649e6c00b98553ca2)
- [#WindowsタスクスケジューラでPythonを走らせる - Qiita](https://qiita.com/kawa-Kotaro/items/4005a43eb686eae41448)
- [Markdown記法 サンプル集 - Qiita](https://qiita.com/tbpgr/items/989c6badefff69377da7)
- [【Python】Windowsタスクスケジューラで定期的に自動実行する方法（EXEファイル） - OFFICE54](https://office54.net/python/app/windows-taskscheduler-exe)