部署 Google App Script 专案(2) & Line Bot 简单回应讯息

昨天我们让 Reply Message 成功从 Read Mail 读取到验证码,今天要进一步让 Reply Message 能接收 Line Platform 送过来的 Webhook Event,并且,让 Line Bot 可以简单的回应验证码给使用者。

流程构思

  1. 使用者在 验证码小帮手 输入 获取验证码
  2. Line Platform post Webhook Message Event 到 Reply Message
  3. Reply Message 接收到 Webhook Message Event,判断使用者输入的讯息为 获取验证码
  4. Reply Message 执行 Read Mail 获取验证码
  5. Reply Message 利用 ReplyToken 回应验证码给使用者
  6. 使用者接收到验证码

Messaging Api Webhook Event

之前有提到,Line Platform 会发出 Webhook Event 到 Bot Server,而 Bot Server 接收到後就可以进行相对应的动作。而 Webhook Event 的类型有很多种,例如:加好友/封锁,加入/离开群组...等等。详细的文件可以阅读 Webhook Event Objects 文件。

这次我们要使用到的是 Message event,使用者发出特定关键字的讯息,Bot Server 接收到含有该关键字的 Message event 才回应验证码。Line的官方文件有很清楚的 Request & Reponse 范例,方便我们开发的时候预先对照格式处理资料。

至於让 Line Bot 回应讯息的方法有两种:reply / push

  • reply: 依赖收到的 webhook event 中的 replyToken 去回应讯息给使用者,意思是必须要先触发 webhook event 才能被动回应讯息,而且 replyToken 很快就会失效,必须要尽快回应使用者。优点也很简单,就是免费。
  • push: 主动推播给 userId,需搭配 channel access token 让 Line 验证此 userId 是否属於此 channel,符合才能进行推播。缺点是超过免费额度的话就要收费。

部署 Reply Message 为 Web App

那麽接下来的问题就是:要怎麽让 Reply Message 能够接收 Webhook Event?又要怎麽让 Reply Message 可以call Line Messaging Api 去回应讯息呢?

文件

  1. Reply Message 能够接收 Webhook Event 并进行处理
    在 Google 文件的 Simple Triggers 内提到:

Triggers let Apps Script run a function automatically when a certain event...
To use a simple trigger, simply create a function that uses one of these reserved function names:
...
doPost(e) runs when a program sends an HTTP POST request to a web app.
The e parameter in the function names above is an event object that is passed to the function. The object contains information about the context that caused the trigger to fire, but using it is optional.

也就是说,只要我们使用 doPost 作为 function 名称,那麽有 HTTP POST request 送到 Reply Message 时,就会执行 doPost 的内容。
p.s. 如果想要进一步了解 doPost(e) 其中 e: event object 的文件可以参考 Web Apps,我们接着也会把 Reply Message 部署成 Web Apps

  1. Reply Message 可以call Line Messaging Api
    另一份文件 External APIs 刚好提到了:

Connect to public APIs
You can use the UrlFetch service to make API requests directly.

文件看完了,也大概知道该怎麽做了,那麽就着手进行修改 Reply Message 专案吧!

修改 Reply Message 专案

replyMessage.gs 修改如下

  1. doPost 接收 webhook event 并判断这是不是一个使用者输入获取验证码的 Message Event
  2. 根据上述情况取得 replyMessage
  3. doReplyMessage 回应讯息给使用者
  4. 回应一个文字讯息 success 给 Line Platform
const CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN';

function doPost(e) {
  var requestContent = JSON.parse(e.postData.contents);
  var event = requestContent.events[0];
  if (event) {
    var replyToken =  event.replyToken;
    var userId = event.source && event.source.userId;
    var userMessage = event.message.text;
    var replyMessage = [];

    if (userMessage === '获取验证码') {
      replyMessage = getValidationCodeMessage(userId);
    } else {
      replyMessage = getFailMessage();
    }

    doReplyMessage(replyMessage, replyToken);
  }
      
  return ContentService.createTextOutput('success');
}

function getValidationCodeMessage(userId) {
  var validationCode = ReadMailAndInsertToGoogleSheet.app(userId);
  return [{
    'type': 'text',
    'text': validationCode
  }];
}

function getFailMessage() {
  return [{
        'type': 'text',
        'text': '无效的输入'
  }];
}

function doReplyMessage(replyMessage, replyToken) {
  var payload = {
    replyToken: replyToken,
    messages: replyMessage
  };

  UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
    },
    'method': 'post',
    'payload': JSON.stringify(payload)
  });
}

部署成 Web App

按下部署,选取类型为网页应用程序
Depoly web app 01
输入说明,执行身份选择我,谁可以存取选择所有人
然後按下部署 (第一次可能会需要审查权限)
Depoly web app 02
完成部署,将网页应用程序的网址复制保存,等下设置 Webhook URL 会使用到
Depoly web app 03

设置 Line Messaging Api Webhook URL

那麽事不宜迟,马上将 webhook URL 设置成我们部署好的 Web App 网址吧!

进入 Line Developer Console ,选择验证码小帮手的 Messaging Api
Setting Webhook URL 01

找到 Webhook settings

  • Webhook URL 填入 Reply Message 的网页应用程序网址,更新完记得储存
  • Use webhook 记得要打开
    Setting Webhook URL 02

可以按下 verify 检验网址是否设置正确,如果出现下图的警告是正常的,因为我们使用 GAS 服务的关系
Setting Webhook URL 03

验收 Line Bot 的行为

Line Bot Result 01
按下获取验证码,接着随便输入一些讯息
Line Bot Result 02
也可以看到 Google sheet 中有纪录了取得的 userId & 时间 (这边就不特地截图了)

以上~到今天终於让 Line Bot 成功回应验证码了,但是只有这样当然是远远不够的!首先谁都可以加入这个验证码小帮手,这点非常的不安全,我们需要额外加上身份验证的功能。另外我们的 Reply Message 也没有验证 HTTP POST request 是否真的是 Line 发送过来的。於是~本系列文章的第二阶段目标,就是要强化这个 side project 的安全性!

99购物节买到要剁手手了,明天继续加油罗~


<<:  【Day09】陈述式与表达式

>>:  Day 9-假物件 (Fake) - 虚设常式 (Stub)-1 (核心技术-1)

DAY28:VM安装套件以及GCP注意事项

VM环境安装及打包上环境 安装环境及套件 输入sudo apt update 更新apt 输入sud...

【从实作学习ASP.NET Core】Day27 | 前台 | PayPal 订单付款 (2)

接续昨天的付款按钮,今天要把自己的订单内容和付款按钮结合 PayPal 订单内容 范例 这边提供一个...

DAY18-动态规划(一)

力扣网站的说明 动态规划常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此...

Day 28. 解掉bug了

啊..败给旅游燃烧殆尽症候群了,昨天晚上不小心睡着,忘记设闹钟,再醒来就已经过12点了QwQ    ...

有关fb的商业应用

请问现在要开发有关fb的商业应用,是否都局限在粉丝团的上面,个人专页的资料商业应用有局限的吗? ...