Help us understand the problem. What is going on with this article?

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

やったこと

  • 勉強がてら、何かテキストなりスタンプなりを送ると、「次の日」は何のゴミの日かを教えてくれる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)の中身を参考にさせていただきました。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away