ってことでn8nならサクッと作れるかなぁと思ったら逆にめんどいことになったのでなんとなくメモっておきます。

日次実行

まずは完成図から。

うん、すでにノードがおおい。

やってることはこんな感じ。

まずはメイン処理。

  1. 0時0分になったら動かす
  2. 一応1~60秒ランダムで待つ(アクセス集中への配慮)
  3. 既にその日の情報をとってきていたら終了(テスト用)
  4. しょぼカレAPIのcal_chk.phpを叩ぐ
  5. XMLが返ってくるのでdataをJSONに変換
  6. Titleが特定のものだけに絞り込み
  7. データはテレビ局ごとにバラバラなので、番組ごとに書き換える
    ちなみにこんな感じ
[
  {
    "Title": "デリシャスパーティ♡プリキュア",
    "SubTitle": "あまねのマナーレッスン!憧れのレストラン",
    "Count": "20",
    "Channel": [
      {
        "Name": "TOKYO MX",
        "Start": "20240207193000",
        "End": "20240207200000"
      }
    ]
  }
]
  1. 1日分の予定をまとめます、今回はモロヘイヤのWebhookを使って投稿するのでそれ用に変換します
[
  {
    "body": {
      "text": "**$[fg.color=f74 今日のプリキュアは!]**\n\n**デリシャスパーティ♡プリキュア\n**第20話 あまねのマナーレッスン!憧れのレストラン\n[TOKYO MX] 19:30~\n\nおたのしみに!"
    }
  }
]
  1. モロヘイヤのWebhookを叩いておわり

下のWebhookはワークフロー間でのデータやり取りに使用。
先程の処理でワークフロー内で使い回せるように変数に入れているので、Webhookにアクセスがあったらその中身を返すだけ。

これは定期実行時に使用する。

このあとすぐ

こちらは15分ごとに実行してその間に開始する番組を通知。
一応5,20,35,50分で動くした。(画像の10分毎は違うw)

うん、こっちもノードがおおいw

やってることはこんな感じ。

  1. 5,20,35,50 * * * *でCronを実行
  2. 日次処理で行っていたデータがこちらのワークフローに連携されているかチェック
    (Webhook叩くとn8nの実行履歴にめっちゃ残って邪魔だからやってるだけ)
  3. IFノードで↑をチェック
  4. なかったら日次のWebhookを叩きます、これはしょぼカレAPIを叩かないので負荷をかけることは無い
  5. 取得したデータをワークフロー内の変数に入れて使い回せるよう
  6. 日付をUnixTimeに変換します(MFMで使う)
  7. 15分以内に開始する番組があるかチェック
  8. モロヘイヤ用に整形します、これは日次のやつと同じ感じ
  9. モロヘイヤのWebhookを叩いておわり

まじでめんどうだった

JavaScriptで色々やらなきゃいけなくて、面倒になったのでPythonに切り替えたけどn8nのPythonのバグを踏んでうまく行かなかったり、使えないライブラリがあったりでPythonは諦め。

ほぼJavaScriptで書いてますが、日付の処理はdate-fnsを使って少し楽をした。

しょぼカレの日付はYYYYMMDDhhmmssなんですが、これをJavaScriptでサクッと処理できなかった。

なので、date-fnsでparse(${date}+09:00, 'yyyyMMddHHmmssXXX', new Date());って感じに処理。

n8nのCodeノードで日付処理やろうと思うと全部UTCになるのでここらへんでちょっと詰まったりしてたけどさっさとdate-fnsでやればよかった。

あとは各種処理、無駄が結構あると思うけどもう面倒だったのでChatGPTに聞いて出してきたコードを書いていった感じ。

今回初めてChatGPTを活用してコードを書いてみたけど、ガチの素人はその答えすら意味不明なので最低限の知識はやっぱり必要だと感じた。

あとは一時的に整形してから更にそれを整形してたけどそれがいいのか悪いのか・・。

まぁでも一応動いたし、しょぼカレ自体には1日1回しかアクセスしないようには出来たのでこれで一旦十分かなぁとか思ってる。

とりあえず作ったBOTはすでにMisskey上で稼働させていてしばらく様子を見ていこうと思う。