使用 Template Message 替 Line Bot 加上同意条款的功能(1)

昨天我们使用了 Quick Reply 让使用者可直接跟我们回应的讯息互动,今天要使用 Template Message 做一个在互动上也蛮常见的功能 - 同意服务条款。

新增一张 Sheet 纪录 User 状态

现在的验证码小帮手需要纪录使用者是否 1. 已认证 2. 已同意条款,而且之後也需要取得 User Profile 等资讯,势必要新增一张资料表纪录 User 资讯方便更新及检阅。

建立 sheet users

在原本的 auto-get-verification-code 试算表新增一张工作表 users,并加入标题列如下:
add user sheet

流程构思

目的是在原先的流程上加入同意条款的功能,时间点可以视情况选择在身份认证之前或之後,这次先选择在身份认证之後。所以流程大致如下:

  1. 使用者加入好友到身份认证前的流程皆相同
  2. 身份认证时,也会在 users sheet 写入 user_idis_verified 栏位
  3. 使用者已认证,在接收到使用者讯息前先检查是否已同意条款
    • 已同意:继续执行原本的 handleMessageEvent
    • 未同意:跳出请先同意服务条款的讯息,直到收到使用者同意的 webhook postback event,同时将使用者的 agree_terms 写入 1

身份认证时新增写入 users sheet 功能

首先我们要新增对 users sheet 执行 query & upsert 的功能

修改 tagVerificationCode.gs

加入 upsertUserInfo & getUserRowIndex

  • getUserRowIndex 寻找 users sheet 里面是否已经有这个 userId,有的话回传列号,没有的话就在最後新增一列这个 userId 的资料并回传列号
  • upsertUserInfo 则是根据输入的 userData object 执行对应 columnname 的资料更新
function upsertUserInfo(userId, userData) {
  Logger.log('start upsertUserInfo');
  var fillableKeys = {
    'name':1,	
    'email':2,
    'is_verifed':3,
    'agree_terms':4,
    'updated_at':6
  }
  
  var sheet = ReadMailAndInsertToGoogleSheet.connectToSheet('users');
  var userRowIndex = getUserRowIndex(sheet, userId);
  var userRowRange = sheet.getRange(userRowIndex, 1, 1, 7);
  var userRowData = userRowRange.getValues()[0];
  Object.entries(userData).forEach(([key, value]) => {
    if (fillableKeys[key] !== undefined) {
      userRowData[fillableKeys[key]] = value;
    }
  });
  userRowData[6] = new Date();
  userRowRange.setValues([userRowData]);
}

function getUserRowIndex(userSheet, userId) {
  var searchResult = ReadMailAndInsertToGoogleSheet.searchColumnValue(userSheet, 'user_id', userId);
  if (searchResult !== -1) {
    return searchResult+2;
  } 

  // create new user row  
  var lastRow = userSheet.getLastRow();
  var range = userSheet.getRange(++lastRow, 1, 1, 6);
  range.setValues([[userId,,,,, new Date()]]);
  return lastRow;
}

接着在 tagVerificationCode 里新增纪录 user 已经认证的功能

function tagVerificationCode(target, userId) {
  var sheet = ReadMailAndInsertToGoogleSheet.connectToSheet('verification_code');
  var searchResult = ReadMailAndInsertToGoogleSheet.searchColumnValue(sheet, 'code', target);
  if (searchResult !== -1) {
    var targetRowIndex = searchResult+2;
    var userIdValue = sheet.getRange(targetRowIndex, 2, 1, 1).getValue();
    if (userIdValue.length === 0) {
      var targetRange =  sheet.getRange((searchResult+2), 2, 1, 2);
      targetRange.setValues([[userId, new Date()]]);
      // 加入下面这行
      upsertUserInfo(userId, {'is_verifed': true});
      return true;
    }
  }
  return false;
}

这样一来我们就可以在使用者认证时纪录资讯在 users sheet,并且可以用同样的方式纪录接下来的同意条款结果,明天继续完成用 Template Message 发送同意条款资讯,以及写入 users sheet!


<<:  [DAY 03] EC2

>>:  赌桌上的技术分析 - RSI

强连通元件

7 强连通元件 对於一个无向图来说,如果我们把一个极大连通的子图找出来(极大在这边的定义是,无论再增...

目前的命题 | ML#Day11

根据前面作业做个检讨,决定新的题目需要有这些条件: 简单、明确,即使团队未参与ml研究的同仁,对於我...

Day1 Let's ODOO: 前言

前言 因工作需求碰到ODOO这套ERP,藉由铁人赛纪录所学与遇到的问题,若有错误也欢迎不吝指出。 O...

python入门学习day 2

#初学程序语言的你为什麽需要有GitHub? #Git & Github区别在哪里?? Gi...

Day1 - 导读 带你认识资料科学所需套件

先备知识: 基本python能力 : 熟悉各基本型态,认识串列、字典、函式、class 了解深度学习...