前回、こちらの医師ポイ活半自動化の記事で、pythonで特定のウェブサイトを特定時間に自動で開く方法について解説した。
今回は、このプログラムを少し拡張して、朝・夕の2つの時間帯に特定のURLを開く方法について記載する。個人的には
- ポイ活プログラムは、特に医師向けのweb講演会は平日の19時前後から始まることが多いので、その時間帯に開いて、そのままweb講演会もクリックしたいので夕方にURL群を開きたい。
- 一方で、朝はニュース記事や株の情報などをチェックしたいので、こうしたURLは朝に開きたい。
と思っているので、そのようにプログラムを作成した。
朝と夕方に特定のURLを開くpythonスクリプト
今回のpythonコードはこちら。
open_websites.py
import webbrowser
import sys
def open_websites(urls):
for idx, url in enumerate(urls):
if idx == 0:
webbrowser.open(url)
else:
webbrowser.open_new_tab(url)
# 朝のURL
morning_urls = [
"https://nikkei225jp.com/",
"そのほかのURL",
"そのほかのURL"
]
# 夕方のURL
evening_urls = [
"https://medical.nikkeibp.co.jp/",
"そのほかのURL",
"そのほかのURL"
]
if __name__ == "__main__":
if len(sys.argv) > 1:
if sys.argv[1] == "morning":
open_websites(morning_urls)
elif sys.argv[1] == "evening":
open_websites(evening_urls)
今回は、新しくwebサイトを開くwebbrowserモジュールに追加して、sysモジュールを導入した。
sysモジュールとは?
sys
モジュールはPythonの標準ライブラリの一部で、Pythonインタプリタとその環境(システム)に関連する関数や変数を提供する。特に、コマンドライン引数の処理に使われる。
コマンドライン引数とは、プログラムが起動されるときにコマンドライン(ターミナルやコマンドプロンプトなど)からプログラムに渡される引数のこと。
sys.argvの使用
sys
モジュール内のargv
は、コマンドライン引数を含むリスト。argv[0]
はスクリプトの名前で、残りの要素はコマンドラインから渡される引数。
今回のスクリプトの場合、
python3 open_websites.py morning
とコマンドラインにmorningという引数を追加すると、このmorningという引数は下記実行関数のsys.argv[1]に該当するので、if文の条件分岐で、open_websites(morning_urls)が実行される。
つまり、朝に開きたいURL群だけが開かれることになる。
if __name__ == "__main__":
if len(sys.argv) > 1:
if sys.argv[1] == "morning":
open_websites(morning_urls)
elif sys.argv[1] == "evening":
open_websites(evening_urls)
eveningの場合も同様で、下記コマンドを実行すると夕方のみのURLが開く。
python3 open_websites.py evening
これで、1つのpythonファイルで朝と夕方のウェブサイトを開くのを出し分けることができるようになった。次は、これをlaunchdエージェントを使って、それぞれの特定の時間に実行できるようにする。
Launchdシステムに.plistファイルを作成
今回もLaunchdシステムを使って、Macがスリープ状態でもpythonスクリプトを実行できるようにする。
起動時間帯ごとに複数の.plistファイルを作成
今回は、朝のウェブサイトは5:00に、夜のウェブサイトは19:00に開くように設定したいと思う。
macOSのlaunchd
システムを使用する際、一つのplist
ファイルで複数の異なる起動時間を設定し、それぞれ異なるコマンドライン引数を指定することはできない。launchd
は各plist
ファイルで単一のジョブを定義し、それぞれのジョブには固有のスケジュールが設定されるため。
というわけで、今回は朝用の.plistと夜用の.plistファイルを、~/Library/LaunchAgents/
ディレクトリ内に用意する。
朝用の.plist:com.user.openmorningurls.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.openmorningurls</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/python3</string>
<string>/Users/ky/dev/automate/open_websites.py</string>
<string>morning</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>5</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</dict>
</plist>
夜用の.plist:com.user.openeveningurls.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.openeveningurls</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/python3</string>
<string>/Users/ky/dev/automate/open_websites.py</string>
<string>evening</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>19</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</dict>
</plist>
.plistファイル中に解説
夜用の.plistファイルの中身を解説
- Label
com.user.openeveningurls
: このキーは、この特定のLaunchdジョブに一意な名前を設定しする。他のジョブと区別するために使用される。
- ProgramArguments
- この配列は、実行するプログラムとその引数を指定する。
- /usr/local/bin/python3: 使用するPythonインタープリタの絶対パス。ターミナルのwhich python3コマンドで表示されるパス
/Users/ky/dev/automate/open_websites.py
: 実行するスクリプトの絶対パス。evening
: スクリプトに渡されるコマンドライン引数。これにより、スクリプトは「夕方のURL」リストを開くように動作する。
- StartCalendarInterval
- ジョブがいつ実行されるべきかを定義する。
Hour
: ジョブが実行される時刻(19時)。Minute
: ジョブが実行される分(0分)。
ProgramArgumentsの配列で、eveningとコマンドライン引数を指定できるので、これによってopen_websites.pyの夜のURLのみが開かれるようになる。
Launchdジョブのタスクを有効化
最後に作成したLaunchdジョブを有効化する
launchctl load ~/Library/LaunchAgents/com.user.openmorningurls.plist
launchctl load ~/Library/LaunchAgents/com.user.openeveningurls.plist
ちなみに、ジョブを停止したい時には、unloadする。
launchctl unload ~/Library/LaunchAgents/com.user.openmorningurls.plist
launchctl unload ~/Library/LaunchAgents/com.user.openevenningurls.plist
ちなみに、launchd
ジョブを一回で再起動する、つまりアンロードしてからロードする直接的なコマンドは存在しないが、&&
演算子を使用して unload
と load
コマンドを組み合わせることで事実上可能。
launchctl unload ~/Library/LaunchAgents/com.user.openmorningurls.plist && launchctl load ~/Library/LaunchAgents/com.user.openmorningurls.plist
例えば、朝のジョブを5時に設定していたけれども、やっぱり7時に変更したいとなって、.plistファイルの起動時間を変更した時などにこのコマンドを使う。
実行コマンドが長いので、自分の場合は、AlfredというランチャーアプリのSnippetsに「lauchd」というキーワードで開くように登録している。
完成!
これで、朝5時に朝のウェブサイトが開き、夜7時になると夜のウェブサイトが開けるようになった。
朝起きてPCをスリープ状態からONにした時には、5時以降の起床の場合にはすでに朝のウェブサイト(ニュースや株サイトなど)が開かれた状態になるので、チェックするだけで良い。
素敵なライフハック生活を!
コメント