<仙台高専広瀬有志 advent calendar><GAS>slack bot作成にチャレンジ

はじめに

このエントリは 仙台高専広瀬 Advent Calendar 2018 - Adventar 1日目の記事です。 //初っ端からネタに困ってたなんて言えない //一日目から間に合ってないとか言わないで、書いた文章も一晩寝かせて熟成してると思って許して。。。

天気予報って見なくね

普通の人はみるんですって言わないで。 朝とかの時間ないときに天気予報まともに見る余裕なくねって人が少しくらいいてくれると思うんですよ、うん。 それで思った、slackのbot作って送ればよくねって。 複数人のとこに送れば天気予報を共通して把握できるから、外の作業とかある人達のとこに流しとくとかなり便利じゃないかなって。 じゃあ作ろうよってことで作ったマン。

目次

  • 使用したAPI
  • 構成
  • 作成したプログラム
  • 実際の動作

使用したAPI

今回はAIを使った天気よ、、じゃなくてWEBに公開されてるところから気象情報はもらってきます フリーで気象情報をとってこれるAPIをいろいろ探した結果、Weather Hacksさんからとってくるのがいい感じになりそうだったのでそこを使います。

weather.livedoor.com

その中でも、jsonでデータを取得できる機能を使って行きます。

構成

開発したやつの大まかな構成図を以下に示します。

f:id:poolbooyer:20181202011734j:plain
開発したbotの構成図
図に書いてあることがほぼすべてなのですが。 1.GASを使ってweather hacksに気象情報をリクエスト 2.取得した情報を元に必要となる情報を抽出 3.情報を元に提供する文章を生成 4.生成した文章をslackに流す。 こんな感じ

作成したプログラム

今回はfunctionでいうと3つに別れてるのでそれぞれ書きます。

情報取得機能

webAPIにリクエストを投げてデータを取得するのをGASだと一行でできます。

var response=UrlFetchApp.fetch("http://weather.livedoor.com/forecast/webservice/json/v1?city=040010");

この記述でresponseにAPIからのレスポンスが保存されます。 保存されたレスポンスを元にしてjson形式のパーサに通して実際の文章を作っていきます。 この辺はあんまり詳しく書く必要のある目新しいことは自分的になかったので全体のコードに行きます。

/*
postUrl:送信するアプリケーションのURL
username:通知アカウントの名称
icon:通知アカウントのアイコン
announce:通知するテキスト
*/
var postUrl = 'https://hooks.slack.com/services/***';
var username = 'Weatherbot';
var icon = ':hatching_chick:';
var announce=" ";

function getWether() {
  //気象情報をリクエスト
  var response=UrlFetchApp.fetch("http://weather.livedoor.com/forecast/webservice/json/v1?city=040010");
  //json形式で読み込み
  var json=JSON.parse(response.getContentText());
  //取得情報を管理
  /*
  date:日時
  location:場所の情報
  telop:天気
  temp_max,min:最高気温、最低気温
  */
  var date=json["forecasts"][0]["date"];
  var location=json["location"]["city"];
  var telop=json["forecasts"][0]["telop"];
  var temp_max=json["forecasts"][0]["temperature"]["max"]["celsius"];
  var temp_min=json["forecasts"][0]["temperature"]["min"]["celsius"];
  //送信用テキストを作成
  announce=date+"の"+location+"の天気\n";
  announce=announce+telop+"\n";
  announce=announce+"最高気温: "+temp_max+"℃\n";
  announce=announce+"最低気温: "+temp_min+"℃\n";
}

slackに送るところ

slackに送る前準備

slackに送るための準備としてIncoming Webhooksっていうのを追加します。

f:id:poolbooyer:20181202014703p:plain
Incoming Webhooks
どういうのかっていうとjson使ってメッセージの制御できるよってやつです

実際に送ってみよう

実際に送ってみます。

/*
postUrl:送信するアプリケーションのURL
username:通知アカウントの名称
icon:通知アカウントのアイコン
announce:通知するテキスト
*/
var postUrl = 'https://hooks.slack.com/services/***';
var username = 'Weatherbot';
var icon = ':hatching_chick:';
var announce=" ";
function sendWether() {
  //送信に必要な情報を配列で記述
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : announce
  };
  //payloadに送信に必要な情報をjson形式で保存
  var payload = JSON.stringify(jsonData);
  
  //送信に関するオプションを記述
  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  //送信
  UrlFetchApp.fetch(postUrl, options);
}

全体の管理

とは言ってみたもののそれぞれの関数を呼び出す関数を一個作った 特にば得るものじゃないので挙げない 後はgas側の設定でトリガをつけると完成

実際の動作

こんな感じ

f:id:poolbooyer:20181202032814p:plain
bot post

追記

2019/1/18

weather hacksのAPIが最低気温を返してくれなくなったので最低気温通知機能は凍結中です。 凍えているのでしょう。

f:id:poolbooyer:20190118131518p:plain
APIのレスポンスを見てみた図