これは新歓ブログリレー2024 30日目の記事です。夜遅くなってしまいすいません。
はじめに
こんにちは!23Bの@Hueterです。
今年の新歓ブログリレー担当者になり、前回のブログリレーでもあったブログリレーリマインダーというものを作ることになりました。一応前任者がGithubでプログラムを残していたのですが、せっかくなので勉強がてら自分で書いてみました。私はSysAd班所属というわけでもなくJavaScriptとかAPIとか何もわからない人ですが、リマインダー制作で学んだことや詰まったところをまとめられればなと思います。
ブログリレーを支えるリマインダー
↑は前のブログリレーリマインダーを作った@H1rono_Kさんの記事です。より発展的なことが書いてあるブログが読みたい方はこちらをお勧めします。
制作物概要
今回は、ブログリレーの担当者に対して担当日の前日と当日を知らせるサービスを作りました。Google Apps Script(GAS)で毎日特定の時間にプログラムを実行するようにし、サークル内のWikiから担当者情報を受け取り、traQというtraPが制作運営するSNS上にメッセージを送るようにしています。
Google Apps Script(GAS)
Google Apps Script(GAS)とは
Google Apps Script(以下GAS)はGoogleが提供しているアプリケーション開発プラットフォームで、JavaScriptをベースにしたコードでGoogleの各種サービスを容易に操作できます。GASを利用するとGoogleが提供する各種サービス(Googleドキュメント、Googleスライド、Googleスプレッドシートなど)の機能拡張、他の外部サービスとの連携などができるようになります。
今回は他の外部サービスとの連携で使っていきます。
プログラムを書いてみる
早速プログラムを書いてみます。Googleドライブから、新規→その他→Google Apps ScriptでGASの新しいプロジェクトを作れます。私は元から表示されましたが、その他に表示されないこともあるみたい?なのでその時は「アプリを追加」からGASを追加しましょう。
さて、まずは最初はHwllo World!
でも表示させようということで
表示できましたね。ヨシ!
特定の時間にプログラムを実行する
リマインダーということで毎日特定の時間にメッセージを送る必要があるので、プログラムを定期的に実行したいですが、GASのトリガー登録機能を使うと比較的簡単に実現できます。
左側の目覚まし時計みたいなアイコンからトリガー設定画面に行けます。そこで「トリガーを追加」から実行する関数やどんなタイミングで実行するかを指定すればすぐに実現できてしまいます。楽ですね。
ただ、トリガーの仕様上毎日同じ時間に実行しようとすると7時~8時みたいな指定しかできず、少し実行時間に幅が生じてしまいます。
正直それでよかった気はしますがその頃の私はぴったり同じ時間に送りたかったらしく、ちょっとひと手間加えてみることに。
プログラムからトリガーを新規登録
一度だけ特定の時刻にプログラムを実行できるトリガーが作成できるので、そのトリガーを毎日作って実行していけば毎日同じ時間にリマインドできます。今回参考にした記事を載せておきます。
GASで特定時刻を時間指定して繰り返し定期実行するトリガー登録方法!
GASではScriptApp.newTrigger({関数名}).timeBased().at({日時}).create()
を実行することで指定した関数を指定した日時に実行するトリガーを新しく作れます。
const now = new Date()
で関数実行時点での日時を取得できるので、実行時点の日付に実行したい時刻の情報を加えてトリガーに設定する日時を作りましょう。
結果
トリガーのリストにlog_testの関数を実行するトリガーが作られていますね。(setTriggerのトリガーは実際にリマインダーで使っているものです。気にしなくていいです。)無事プログラムからトリガーの新規作成ができました。この関数を毎日実行するようにトリガーを設定すればOKです。
ただ、時間指定のトリガーは実行し終わった後そのまま残ってしまうので、実行し終わったトリガーを消す関数も用意します。ScriptApp.getProjectTriggers()
でプロジェクト内のトリガーすべての情報が得られるので、その中から指定した関数名を実行するトリガーのみを選んで消していきます。
これでトリガー周りは完成です。
API
APIとは
Wikiからの情報取得とtraQへメッセージ送信するにはAPIというものを使う必要があるので、少しAPIを使う練習をします。
その前に APIって何なの?? となったのでまずは調べ物を。
アプリケーションプログラミングインタフェースとは、広義ではソフトウェアコンポーネント同士が互いに情報をやりとりするのに使用するインタフェースの仕様である。 (Wikipedia)
...なるほど?僕はこれだけ見てもあんまりわからなかったです。
なので他のサイトも見ながらAPIについて調べましたが、私の中でAPIは「どこにどんな情報を与えるとどんな答えが返ってくるのかということがまとまったもの」だという結論になりました。ここで、APIに情報を求めることを「リクエスト」、情報を返すことを「レスポンス」といいます。あまり正確ではないのでしっかり理解したい人は自分で調べてみてください。とりあえずお試しでAPIを触ってみます。
練習しよう
APIの練習として「Open-Meteo」というサービスを使っていきます。無料で使える天気予報APIを提供してくれるものですね。
Open-Meteoではhttps://api.open-meteo.com/v1/forecast?
というURLに続けて位置や日時、どんな情報(気温・降水量など)が欲しいのかを指定することで情報が返ってきます。
場所は緯度経度で指定するので、こちらのサイトから東京駅前の緯度経度を調べたら北緯35.40度、東経139.45度でした。ということで、latitude=35.4&longitude=139.45
を上のURLに続けます。それぞれの情報の間には&
をいれます。
次に1時間ごとの温度情報を欲しいのでhourly=temperature_2m
を緯度経度の情報に続けて入れます。&
を忘れずに。
このように情報を加えていきます。ということで、タイムゾーン(東京timezone=Asia%2FTokyo
)と予報日数(一日forecast_days=1
)を加えて最終的なURLがこちら。
https://api.open-meteo.com/v1/forecast?latitude=35.4&longitude=139.45&hourly=temperature_2m&timezone=Asia%2FTokyo&forecast_days=1
このURLにブラウザからアクセスすると...
何か帰ってきましたね。よく見てみるとtime
とtemperature_2m
という二つの配列がありますが、それらが時間とその時の気温の情報です。しっかりと欲しい情報が返ってきました。やったぜ。
今回は練習として使いましたがもっと天気予報APIを使ってみたいという人はこちらのサイトを参考にどうぞ。URLをいじっていた作業をGUIで操作きるようになります。下にURLも出てくるのでAPIを使うときはそちらをコピーするだけで済みます。
GASでAPIを使う
ブラウザでAPIを使ってみましたがGASでも使えるようにしましょう。
GASでAPIを使うにはUrlFetchApp.fetch()
にURLを渡せば上の画像の文字列が得られます。ただ、そのままだと欲しい情報以外もついてくるので.getContentText()
を使ってほかの情報を消します。あとは、得られた値を少し調節すると、
順番が少し違いますがブラウザのときと同じ結果が得られました。いいね。
仕上げ
今までのことは練習なので、最後にリマインダー本体を作っていきましょう。
あとやることは、
①Wikiから情報をもらう
②traQにメッセージを送る
の二つです。どちらもAPIを使えばできるのでH1rono_Kさんのブログ記事を参考に作りました。少し注目するところは、APIに与える情報の中にトークンやWebhookシークレットというものを入れるところですね。これらは、traP以外の人やWebhook作成者以外が自由にtraPのサービスを使えなくするためのものです。アカウント名とパスワードみたいなものです。
こうしてWikiから得た情報を整えてtraQに送るプログラムができたら晴れて完成です。
最初は何もわからなかったですが調べながら作ってみるの案外何とかなるものですね。あとは質問に答えてくれた先輩方にも感謝を。振り返ってみると、一番時間がかかったのはタイプミスに気づかずにいた時です。皆さんもタイプミスに注意しましょう。
終わりに
今回は他の外部サービスとの連携で使っていきましたが、Googleカレンダーとかで遊んでも面白そうだなと思ったので機会があればやってみたいです。