【GoogleAppsScript】GoogleChatで天気予報Botを作ってみた

タロウです!
今回はGoogleのChat(元ハングアウト)で、Botの作り方を紹介します!
ニュースや天気予報、APIで情報を取得できれば何にでも応用がききます。
※現在Chatは「G Suite」を使用しているユーザでのみ使えるようです。
完成形
今日の天気を取得してChatに投稿してくれるBotを作成します!
APIはjsonで返却されるので、良しなにゴリゴリ整形してPOSTしています。
絵文字が使えるのもgood!

手順
- Webhookを追加しよう
- Scriptを書こう
- トリガーに登録しよう
Webhookを追加しよう
Chat画面上部のプルダウンから「Webhookを設定」を選択します。

Webhookを追加します。
アバターは好きな画像を設定することができます。

Webhookの追加は以上です!所要時間2分!
Scriptからは追加したWebhookを使用してメッセージをPOSTすることになります。
複数追加して、メッセージ内容で切り替えるのも良いですね!
Scriptを書こう
まずはGoogleAppsScriptを使えるようにしましょう!
G suiteのマーケットプレイスからGoogleAppsScriptを起動します。
ブラウザ上でコードを書いていきます!

起動したら、「ファイル」⇒「新規作成」⇒「スクリプトファイル」を選択してエディタを開きます。

コードは100行もありません。
大きな流れとしてはこんな感じです。
- トリガーで設定した時間にファンクションが実行される
- 設定したトリガーを削除する
- APIで天気予報を取得する
- jsonを表示用に整形する
- POST処理実行
// トリガーを設定
function setTrigger(){
// 実行するファンクションとPOSTしたい時分を設定(下記だと8時50分に実行される)
setTime("todayWether", "8", "50");
}
// トリガーを削除
function delTrigger(target) {
var triggers = ScriptApp.getProjectTriggers();
for(var i=0; i < triggers.length; i++) {
if (triggers[i].getHandlerFunction() == target) {
ScriptApp.deleteTrigger(triggers[i]);
}
}
}
/*
* 8:50に実行されるファンクション
*/
function todayWether(){
// トリガー削除(無駄なトリガーが増えていくので、実行されたら登録したトリガーを消します)
delTrigger("todayWether");
// liveboorの天気予報取得 URL+cityID
var response = UrlFetchApp.fetch("http://weather.livedoor.com/forecast/webservice/json/v1?city=016010");
var json=JSON.parse(response.getContentText());
var text = "🌞今日[" + json["forecasts"][0]["date"] + "]の" + json["title"] + "🌞";
text += "\r\n";
text += "➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖"
text += "\r\n";
text += "[ " + json["forecasts"][0]["image"]["title"] + " ]";
text += "\r\n";
if (json["forecasts"][0]["temperature"]["min"] == null) {
text += " 最低気温:" + "-" + " 最低湿度:" + "-";
} else {
text += " 最低気温:" + json["forecasts"][0]["temperature"]["min"]["celsius"] + " 最低湿度:" + json["forecasts"][0]["temperature"]["min"]["fahrenheit"];
}
text += "\r\n";
if (json["forecasts"][0]["temperature"]["max"] == null) {
text += " 最高気温:" + "-" + " 最高湿度:" + "-";
} else {
text += " 最高気温:" + json["forecasts"][0]["temperature"]["max"]["celsius"] + " 最高湿度:" + json["forecasts"][0]["temperature"]["max"]["fahrenheit"];
}
text += "\r\n";
text += "➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖"
text += "\r\n";
text += json["description"]["text"];
// POST処理実行
post(text);
}
// Googleのトリガーを作成する
function setTime(app, hour, minutes){
var setTime = new Date();
setTime.setHours(hour);
setTime.setMinutes(minutes);
ScriptApp.newTrigger(app).timeBased().at(setTime).create();
}
// POST処理
function post(text){
// WebhookのURLを入れる
var url = "https://chat.googleapis.com/v1/spaces/HOGEHOGE/messages?key=HOGEHOGEHOGEHOGE&token=HOGEHOGEHOGEHOGE";
// メッセージとスレッドIDを指定
var payload = {
"text" : text,
"thread": {
"name": "spaces/HOGEHOGE/threads/HOGEHOGEHOGE"
}
}
// エンコード
var json = JSON.stringify(payload);
// オプション指定
var options = {
"method" : "POST",
"contentType" : 'application/json; charset=utf-8',
"payload" : json
}
// POST実行
var response = UrlFetchApp.fetch(url, options);
// 結果をログ出力しておく
Logger.log(response);
}
!注意点!
POST処理のスレッドIDを指定しないと、毎回新しいスレッドにPOSTしてしまいます。(チームで使っているととてつもなく不便。)
一度スレッドIDを指定せずにPOSTして、返却されたresponseにPOSTしたスレッドIDが入っているので、
それを設定してあげれば、次の実行からは指定したスレッドにPOSTしてくれます。
スレッドIDの確認方法
処理の最後でログ出力しているので、
「表示タブ」⇒「ログ」で確認できます。

表示されたログのnameをスレッドIDに設定します。
トリガーに登録しよう
トリガーの登録もGoogleAppsScriptの画面から遷移します。
「ファイル」⇒「編集」⇒「現在のプロジェクトのトリガー」を選択する。

トリガー設定画面に遷移します。
画面右下の「+トリガーを追加」を押します。

トリガーを追加する画面で、実行する関数やタイプ、時間を設定する。
ここでは、setTriggerを夜中に実行し、次の日用のトリガーを追加しています。

これで完了です!
上記設定だと、毎日午前0時~1時に設定したファンクションが実行されます。
まとめ
途中、POST先のスレッドIDを取得する部分で手間がありますが、
それ以外はポチポチと設定してコードを実行させるだけで
とても簡単にBotを作成することができました。
- 忘れやすい日課に
- 定期的なニュース配信に
- 時間を伝えるアラートに
1つロジックを入れておけば、あとは流用して数を増やすことでいろいろと活用できそうです。
ちなみに僕は、天気予報の他にアラートを3つ入れてます!
以上、GoogleAppsScriptでBotを作ってみたでした!