やったこと
- 勉強がてら、何かテキストなりスタンプなりを送ると、「次の日」は何のゴミの日かを教えてくれるLINE Botを作りました。
- 定期的にお知らせしてくれるのではなく、自分からBotに問いかけ、ゴミの日を教えてもらう仕様です(第n●曜日にも対応)。
- 同居人などにBotのアカウントを教えて友達になってもらえば、その人もBotが使えます。
中身
- LINE messaging APIにスマフォからメッセージを送る
- APIからWebhook用URL(GASのアプリケーションのURL)にPOSTリクエストがいく
- このリクエストをきっかけに、GASアプリケーションがAPIに応答メッセージを返す
- スマフォに、このPOSTリクエストに含まれるテキストメッセージが届く
// LINE developersのメッセージ送受信設定に記載のアクセストークン
var ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXX';
function doPost(e) {
// WebHookで受信した応答用Token
var replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
// ユーザーのメッセージを取得。今回は特に使わない。
//var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
// 応答メッセージ用のAPI URL
var url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{
'type': 'text',
'text': returnGomiday(),
}],
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
//この関数で、↑のpayload・message・textに何のゴミの日かを入れる。
function returnGomiday(){
var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
var i_week = tomorrow.getDay();//明日の曜日のインデックス
var n = cntDayofweek(tomorrow);//明日が何回めの●曜日なのか
if (i_week == 1){
return getMMddweek(tomorrow,i_week)+'は資源ごみ';
}else if((i_week == 2) || (i_week == 4) ||(i_week == 6)){
return getMMddweek(tomorrow,i_week)+'は可燃ごみ';
}else if((i_week == 3)&&(n ==2)){
return getMMddweek(tomorrow,i_week)+'は不燃ごみ';
}else if((i_week == 3)&&(n ==4)){
return getMMddweek(tomorrow,i_week)+ 'は不燃ごみ';
}
else{
return getMMddweek(tomorrow,i_week)+'は該当なし';
}
}
//日付と曜日のインデックスを渡すと、"09月20日(金)"のようなテキストを返す
function getMMddweek(tomorrow,i_week){
var arry = ['日','月','火','水','木','金','土'];
var time = Utilities.formatDate(tomorrow,'Asia/Tokyo','MM月dd日');
var week = '('+arry[i_week]+')';
return time + week
}
//日付を入力すると、月初から何回めの●曜日なのか返す。
function cntDayofweek(date){
var first_date = new Date();
first_date.setDate(1);//月初設定
var diff = Math.floor((date-first_date)/86400000);
return diff/7+1;
}
説明
doPost(e)
LINEからPOSTリクエストがあった時に、関数の中身が実行される。'payload'の中身に書いた'text'がユーザーへの応答メッセージになる。
returnGomiday()
上記'text'に記載。「次の日」の曜日に応じてなんのごみの日か文字列で返す。居住地に応じて書き換え。
cntDayofweek(date)
次の日の日付と月初との日差を、7で割り、1を足すと第n●曜日がでます。多分。
LINE messaging APIとGASのWebアプリケーション公開方法
下記参考を参照。注意点としては、GASを修正した場合、「公開」→「ウェブアプリケーションとして導入」→「プロジェクトバージョン」をnewにして新たなURLを生成し、これをLINE messaging APIのWebhook用URLに記載しなおす必要がある。
参考
下の2記事を参考にさせていただきました。ありがとうございます。一つめの記事からはアイディアを、2つめからは関数doPost(e)の中身を参考にさせていただきました。