BLOG

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

2019.10.18
TECH

タロウです!

今回は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を作ってみたでした!

The following two tabs change content below.
Taro

Taro

ディレクターも、サーバ構築も、ゴリゴリ開発もやります。 オールマイティ担当。 スパイスも甘いものも大好き。