👐

github actionsで無料で定期実行してみよう!

に公開

はじめに

「今日の予定を毎朝通知してほしい」、「今日の天気を教えてほしい」とか考えたことがあると思います。専用のアプリで通知機能があったとしてもいつも使うLINEやSlack,DiscordなどのSNSサービスに通知してくれる方が嬉しくないですか?-Ansewr:嬉しいです!!
そうなんです!
LINEなどのSNSであれば自分のルーティーンの中で確認できたりするのでかなり楽なんです!
それに、自らプログラムを書くことで好きなようにカスタマイズができるのも良いところですね
他にも定期実行してスクレイピングをしたりなど、できることはアイデア次第で色々あります!
それに今回紹介するgithub actionsの使い方はあくまで機能の一部に過ぎません。この記事を読んで気になった人はぜひ調べてみてね

前提

  • githubとDiscordのアカウントを持っていること
  • pythonを使いますが、コードの説明はほとんどしないのである程度理解のある方
  • 私自身github actionsもpythonも使いこなせているわけではありません。
    広い心で見てください

通知設定

私自身一番よく使う通知ができるSNSはLINEなのですがLINE notifyは2025年4月にサービスが終了してしまいました😭
そのため、Discordを使うことにします
pythonでDiscordに通知を送るには次の準備が必要です

  1. まずDiscordの左側のプラスボタンから自分用のサーバーの追加をします
  2. オリジナルの作成を選択した後に、自分と友達のためを選択します
  3. 最後にサーバー名とアイコンを自由に設定してサーバーの新規作成をします
  4. 好きなテキストチャンネルの歯車マークからチャンネルの編集を選択します
  5. 連携サービスからウェブホックを作成を押します
  6. するとSpidey Botという名前で新規作成されます
    名前やアイコン画像は好きに変更してもらって大丈夫です
  7. ウェブフックのURLはコピーなどしてちゃんと控えておいてください
    後ほど使います

これでDiscord側の設定は終了です
次にpythonからDiscordに通知ができるかを試します
requestsというライブラリを使用するので持っていない人は先にpip install requestsでインストールしてください
自分のパソコンにpip installしたくない場合には、仮想環境を使うか、Googleが提供している
Google Colaboratoryを使用して通知がちゃんとできるのかを確認してください
私はGoogle Colaboratoryを推奨します

test_notify.py
import requests

WEBHOOK_URL = "your webhook url"

message = "test"

# Discordにメッセージを送信
requests.post(WEBHOOK_URL, json={"content": message})

WEBHOOK_URLには先ほどDiscordでコピーしたウェブフックのurlを張り付けてください
このコードを動かして次のように指定したサーバーのチャンネルにメッセージが来ていたら成功です

github actionsで定期実行するメリット

定期実行したいと考えた時に一番簡単なのは自分のパソコンで定期実行してしまう方法だと思います
windowsであればタスクスケジューラ、macやLinuxであればcronなどを使うことで実現できます
ですが、pcを起動していないと実行できないというデメリットがあります
いつ、いかなるときでもpcを付けていられるほどお金持ちだったりすれば問題ないのですが、一般庶民には電気代は押さえたいものなので、どうしてもあまり魅力的には感じません
次に考えるのはHerokuなどのクラウドサービスを利用することだと思います
この場合だと無料枠に時間の制限などがあったり、無料枠のみで使おうと思ってもクレジットカードの番号を入力が必要でめんどくさかったり、海外のサイトなのもあって少し登録するか躊躇ってしまうというデメリットがあります。
ですがそれらのデメリットを払拭できるのがgithub actionsになります!!
githubのアカウントがあればできるので無料でしかも時間指定で定期実行もできるので正直まずgithub actionsを試す価値はあると思います。
では実際にやっていきましょう!

実践

先ほどのtest_notify.pyだと少し味気ないので次のように変更しました

test_notify.py
import requests
import os

WEBHOOK_URL = os.environ["DISCORD_WEBHOOK_URL"]
livedoor_URL = "https://weather.tsukumijima.net/api/forecast/city/130010" # 東京を選択
weather = requests.get(livedoor_URL).json() # 天気を取得してjsonに整形する

# 最大の降水確率を算出
probability = max([int(probabilitys[:-1]) for probabilitys in weather['forecasts'][0]['chanceOfRain'].values() if not probabilitys == "--%"])
message = f"今日の最大降水確率は{probability}%です"

# Discordにメッセージを送信
requests.post(WEBHOOK_URL, json={"content": message})

2つの変更点があります

  • 1つ目
    Discordのwebhook urlを誰でも見れるgithubなどにそのまま挙げてしまうのはセキュリティー上よくありません
    なので、githubの環境変数(GitHub Secrets)に設定してそこから参照することで他の人から確認できないようにしています
  • 2つ目
    メッセージを送信するだけでなく、livedoor 天気互換という天気予報APIを使って本日の最大降水確率を調べてメッセージを送信しています
    使ってみたい方は「livedoor 天気互換」で調べてみるか、こちらのサイトを参照してください

https://weather.tsukumijima.net/

次にgithubの方で作業をします

  1. new repositoryからレポジトリを作成します
  2. 名前はなんでも良いですが、設定はPublicにしてください
  3. 定期実行したいファイル(私の場合はtest_notify.py)をアップロードします
  4. 次にレポジトリ内のSettingsを開きます
  5. 左側の下の方にあるsecurityからSecrets and variablesを開き、Actoinsを選択します
  6. Repository secretsのNew repository secretを選択
  7. Nameには「DISCORD_WEBHOOK_URL」など自分が分かりやすい名前を付けて、SecretにはウェブフックのURLを張り付けます
  8. 最後にAdd secretを押下するとgithubでの環境変数の設定は終了です
  9. ここまで出来たらレポジトリ内のActoinsを開き、set up a workflow yourselfを選択します
  10. ymlファイルには次のように記述します
main.yml
name: Weather Notifier

on:
  workflow_dispatch:
  schedule:
    - cron: '0 22 * * *' # 毎日07:00 JST(22:00 UTC)

jobs:
  notify:
    runs-on: ubuntu-latest # osの選択
    steps:
      - name: Checkout repo
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11' # pythonのバージョン

      - name: Install dependencies
        run: pip install requests # pip install

      - name: Run weather notifier
        env:
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} # 環境変数
        run: python test_notify.py # 起動するファイル

上から順に説明を入れていきます
name: Weather Notifier
見出しのタイトルとなる部分で名前は自分が意味が分かればなんで大丈夫です
workflow_dispatch:
これがあることで、自分の実行したいタイミングで実行できるようになります
試験的にちゃんと動くかを確認したいときに指定の時間以外で確認できないのはナンセンスなのでこの文を追加しています
cron:'0 22 * * *'
ここでは、定期実行の時間を指定しています
0 22 * * *は左からイギリスの時間で「分 時 日 月 曜日」の順に書きます
日本とイギリスでは9時間の時差があるのでその時間を考慮する必要があります
今回の場合だと、イギリス時間で22時00分に毎日実行してくださいという意味になります
イギリス時間で22時ということは日本時間では07時となります
そして*は「全て」という意味があるので、どの日でも、どの月でも、どの曜日でも実行することになります
もちろん日本語は入力できないので、曜日を指定したい場合は日曜日を0とした数字を入力します
jobs:
この中は基本変更する必要はありません
osやpythonのバージョンをかえたい場合はubuntuや3.11を別のものに変えたら良いです
pythonファイル内でpip installしているものがあるのなら追加で書き入れたら良いです
環境変数名と起動するファイルを自分の環境に合わせたら終わりです

  1. ymlファイルを書き終えたら右のCommit changesを選択します
  2. Actionsに戻ると次のような画面に切り変わっていると思います
    先ほどymlファイルで設定したNameが表示されているはずなので選択してください
  3. 右の方のRun workflowを押して、次に出てきた緑色のRun workflowを選択します
  4. このようなチェックマークがでたら成功です
    サイトを更新しないと見えない場合があるので見えない場合は更新しましょう
    これで終了です!

さいごに

皆さんお疲れ様でした!ここまで読んでくださりありがとうございます!
今回使ったgithub actionsの定期実行は時間のズレが発生してしまうことが多いらしく、その時間ピッタリに来なくても遅くても20分以内には実行されるらしいので気長に待つかその時間も考慮して時間を設定するようにしましょう

Discussion