Azure Functions の Node.js(JavaScript)を使って LINE Bot を作る際、LINE の公式 SDK を使った例がぱっと見つからなかったので、試してみました。
おうむ返しのテンプレ
基本的には公式SDKのサンプルのとおり。
Express に依存した書き方なので、azure-function-express
を使えば Azure Functions でそのまま使える。
Clova のときのように req.body
を req.rawBody
で置き換えたりする必要もなし。Durable Functions とかも素直に使えそう。
'use strict'; const line = require('@line/bot-sdk'); const createHandler = require("azure-function-express").createHandler; const express = require('express'); // create LINE SDK config from env variables const config = { channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, channelSecret: process.env.CHANNEL_SECRET, }; // create LINE SDK client const client = new line.Client(config); const app = express(); app.post('/api/LineBotEndpoint', line.middleware(config), (req, res) => { Promise .all(req.body.events.map(e => handleEvent(e, req.context))) .then((result) => res.json(result)) .catch((err) => { req.context.log.error(err); res.status(500).end(); }); } ); // event handler function handleEvent(event, context) { context.log(event.type); if (event.type !== 'message' || event.message.type !== 'text') { // ignore non-text-message event return Promise.resolve(null); } // create a echoing text message const echo = { type: 'text', text: event.message.text }; // use reply API return client.replyMessage(event.replyToken, echo); } module.exports = createHandler(app);
※2022.3 ログ出力に context.log
を使用していなかったので修正。
環境変数
CHANNEL_ACCESS_TOKEN
とかは Azure ポータルからアプリケーション設定として追加しておく。
まとめ
わざわざ記事にするまでもないレベルですが、Azure Functions でもそのまま動きます、ということで。