LoginSignup
3
3

More than 3 years have passed since last update.

LINE messaging APIで自分からゴミの日を教えてもらう

Last updated at Posted at 2019-09-22

やったこと

  • 勉強がてら、何かテキストなりスタンプなりを送ると、「次の日」は何のゴミの日かを教えてくれるLINE Botを作りました。
  • 定期的にお知らせしてくれるのではなく、自分からBotに問いかけ、ゴミの日を教えてもらう仕様です(第n●曜日にも対応)。
  • 同居人などにBotのアカウントを教えて友達になってもらえば、その人もBotが使えます。

中身

  1. LINE messaging APIにスマフォからメッセージを送る
  2. APIからWebhook用URL(GASのアプリケーションのURL)にPOSTリクエストがいく
  3. このリクエストをきっかけに、GASアプリケーションがAPIに応答メッセージを返す
  4. スマフォに、この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)の中身を参考にさせていただきました。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3