서티원의 날을 알려주는 LINEBot을 만들었다 (2/2)

마지막 기사



【JC・JK・JD필견】서티원의 날을 알려주는 LINEBot를 만들었다
전회, 서티원의 날을 빠뜨리지 않고 통지하는 여고생 필휴의 LINEbot을 만들었습니다만, 일반 공개가 되어 있지 않았습니다. 그래서 이번에는 친구 등록한 사람의 사용자 ID를 저장하고 자신 이외에도 메시지를 보낼 수 있도록 개수했습니다.

계정







등록용




스마트 폰은 여기에서

For Developer 계정이므로 최대 50명까지만 등록할 수 있습니다! !
빠른 것 승리입니다! ! (아무도 등록하지 않음)

개요



・친구 등록 시
LINE 앱→LINE Messaging API→Google Apps Script→Google 스프레드시트

・푸시 송신시
Google Apps Script→LINE Messaging API→LINE 앱

친구 등록(블록) 및 푸시 전송을 위한 두 가지 프로그램을 만듭니다.
LINE 관리 화면의 Webhook URL에 친구 등록용 프로그램을 등록하고, 푸시 송신용 프로그램은 별도로 정기 실행시킵니다.

푸시로 메시지를 보내려면 대상 사용자 ID를 어딘가에 기록해야 합니다.
그렇게 되면, 기록하는 타이밍은 친구 등록시 밖에 없습니다.
친구 등록 시점에 등록한 사용자의 사용자 ID가 전송되므로 Google 스프레드시트에 등록합니다.
스프레드시트를 DB 대신하는 이미지입니다. 푸시를 보낼 때 스프레드 시트의 사용자 ID를 대상으로 읽습니다.

또한 친구 등록이 해제(블록)되었을 때에도 사용자 ID가 보내지므로 해당 사용자 ID를 스프레드시트에서 삭제합니다.

코드



webhook 설정용
var CHANNEL_ACCESS_TOKEN = 'dummy';
var sheet = SpreadsheetApp.openById('dummy').getSheets()[0];

//ユーザIDを検索し、存在しなければユーザIDを追加する
function addUserId(user_id){
  var last_row = sheet.getLastRow();
  var target_cell = "A" + String(last_row + 1);
  var user_id_list = sheet.getRange(1,1,last_row+1).getValues();

  var registered_user_id_flag = 0
  for(var i=0;i<user_id_list.length;i++){
    if(user_id_list[i][0] === user_id){
      registered_user_id_flag = 1;
    }
  }

  if(registered_user_id_flag === 0){
    sheet.getRange(target_cell).setValue(user_id);
  }
}

//ユーザIDを検索し、存在していればユーザIDを削除する
function removeUserId(user_id){
  var last_row = sheet.getLastRow();
  var user_id_list = sheet.getRange(1,1,last_row+1).getValues();

  for(var i=0;i<user_id_list.length;i++){
    if(user_id_list[i][0] === user_id){
      sheet.deleteRows(i+1);
    }
  }
}

function doPost(e) {
  var user_id = JSON.parse(e.postData.contents).events[0].source.userId;
  var webhook_type = JSON.parse(e.postData.contents).events[0].type;

  if(webhook_type === "follow") {
    addUserId(user_id);
  }else if(webhook_type === "unfollow"){
    removeUserId(user_id);
  };

  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}


푸시 전송용
//メイン処理
//毎日AM7:00〜8:00に起動
function main() {
  var CHANNEL_ACCESS_TOKEN = 'dummy';
  var LINE_URL = 'https://api.line.me/v2/bot/message/multicast';
  var user_id_list = getUserID();

  var date = new Date();
  var month = Utilities.formatDate( date, 'Asia/Tokyo', 'MM');
  var day = Utilities.formatDate( date, 'Asia/Tokyo', 'dd');

//  Logger.log(month);
//  Logger.log(day);

  if(day === '31' || (day === '01' && month === '03')){
   var message = 'きょうは待ちに待ったサーティワンの日\uDBC0\uDC7F\nダブルコーン・ダブルカップが31%OFF!\n今すぐ近くの店舗へGO\uDBC0\uDC4B';
   push_message(LINE_URL,CHANNEL_ACCESS_TOKEN,user_id_list,message);
  }
}

//ユーザIDをスプレッドシートから取得する
function getUserID(){
  var ss = SpreadsheetApp.openById('dummy');
  var sheet = ss.getSheets()[0];
  var last_row = sheet.getLastRow();
  var user_id_list = sheet.getRange(1,1,last_row+1).getValues();

  for(var i=0;i<user_id_list.length;i++){
    user_id_list[i] = user_id_list[i][0];
  }

  return user_id_list;
}

//LINEへプッシュ送信
function push_message(LINE_URL,CHANNEL_ACCESS_TOKEN,user_id_list,message){
    UrlFetchApp.fetch(LINE_URL,{
      'method': 'post',
      'headers': {
          'Content-Type': 'application/json; charset=UTF-8',
          'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
      },
      'payload': JSON.stringify({
        'to': user_id_list,
        'messages' : [
          {
            'type':'text',
            'text':message
          }
        ]
      })
    });
}

여러 대상을 만드는 것은 쉽고 POST 대상을 multicast로 변경하고 userId를 문자열에서 배열로 변경하기 만하면됩니다.

결론



조금이라도 기사가 도움이되었고 재미있었습니다.

좋은 웹페이지 즐겨찾기