方言を話すおしゃべり猫型ロボット『ミーア』をリリースしました(こちらをクリック)

【効率化】Pythonで時間帯に応じてウェブサイトを自動で開く方法。起床したらニュースサイトが開かれている状態に

この記事は約10分で読めます。

前回、こちらの医師ポイ活半自動化の記事で、pythonで特定のウェブサイトを特定時間に自動で開く方法について解説した。

今回は、このプログラムを少し拡張して、朝・夕の2つの時間帯に特定のURLを開く方法について記載する。個人的には

  • ポイ活プログラムは、特に医師向けのweb講演会は平日の19時前後から始まることが多いので、その時間帯に開いて、そのままweb講演会もクリックしたいので夕方にURL群を開きたい。
  • 一方で、朝はニュース記事や株の情報などをチェックしたいので、こうしたURLは朝に開きたい。

と思っているので、そのようにプログラムを作成した。

朝と夕方に特定のURLを開くpythonスクリプト

今回のpythonコードはこちら。

open_websites.py

Python
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]はスクリプトの名前で、残りの要素はコマンドラインから渡される引数。

今回のスクリプトの場合、

Zsh
python3 open_websites.py morning

とコマンドラインにmorningという引数を追加すると、このmorningという引数は下記実行関数のsys.argv[1]に該当するので、if文の条件分岐で、open_websites(morning_urls)が実行される。

つまり、朝に開きたいURL群だけが開かれることになる。

Python
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が開く。

Zsh
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
<?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
<?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ファイルの中身を解説

  1. Label
    • com.user.openeveningurls: このキーは、この特定のLaunchdジョブに一意な名前を設定しする。他のジョブと区別するために使用される。
  2. ProgramArguments
    • この配列は、実行するプログラムとその引数を指定する。
    • /usr/local/bin/python3: 使用するPythonインタープリタの絶対パス。ターミナルのwhich python3コマンドで表示されるパス
    • /Users/ky/dev/automate/open_websites.py: 実行するスクリプトの絶対パス。
    • evening: スクリプトに渡されるコマンドライン引数。これにより、スクリプトは「夕方のURL」リストを開くように動作する。
  3. StartCalendarInterval
    • ジョブがいつ実行されるべきかを定義する。
    • Hour: ジョブが実行される時刻(19時)。
    • Minute: ジョブが実行される分(0分)。

ProgramArgumentsの配列で、eveningとコマンドライン引数を指定できるので、これによってopen_websites.pyの夜のURLのみが開かれるようになる。

Launchdジョブのタスクを有効化

最後に作成したLaunchdジョブを有効化する

Zsh
launchctl load ~/Library/LaunchAgents/com.user.openmorningurls.plist
launchctl load ~/Library/LaunchAgents/com.user.openeveningurls.plist

ちなみに、ジョブを停止したい時には、unloadする。

Zsh
launchctl unload ~/Library/LaunchAgents/com.user.openmorningurls.plist
launchctl unload ~/Library/LaunchAgents/com.user.openevenningurls.plist

ちなみに、launchd ジョブを一回で再起動する、つまりアンロードしてからロードする直接的なコマンドは存在しないが、&& 演算子を使用して unloadload コマンドを組み合わせることで事実上可能。

Zsh
launchctl unload ~/Library/LaunchAgents/com.user.openmorningurls.plist && launchctl load ~/Library/LaunchAgents/com.user.openmorningurls.plist

例えば、朝のジョブを5時に設定していたけれども、やっぱり7時に変更したいとなって、.plistファイルの起動時間を変更した時などにこのコマンドを使う。

実行コマンドが長いので、自分の場合は、AlfredというランチャーアプリのSnippetsに「lauchd」というキーワードで開くように登録している。

https://www.alfredapp.com/

完成!

これで、朝5時に朝のウェブサイトが開き、夜7時になると夜のウェブサイトが開けるようになった。

朝起きてPCをスリープ状態からONにした時には、5時以降の起床の場合にはすでに朝のウェブサイト(ニュースや株サイトなど)が開かれた状態になるので、チェックするだけで良い。

素敵なライフハック生活を!

コメント

タイトルとURLをコピーしました