himanago

Azure・C#などのMS系技術やLINE関連技術など、好きな技術について書くブログ

LINE Bot を Azure Functions (Node.js) で作る際のオウム返しテンプレ

Azure Functions の Node.js(JavaScript)を使って LINE Bot を作る際、LINE の公式 SDK を使った例がぱっと見つからなかったので、試してみました。

おうむ返しのテンプレ

基本的には公式SDKのサンプルのとおり。

Express に依存した書き方なので、azure-function-express を使えば Azure Functions でそのまま使える。

Clova のときのように req.bodyreq.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 ポータルからアプリケーション設定として追加しておく。 f:id:himanago:20200423204848p:plain

まとめ

わざわざ記事にするまでもないレベルですが、Azure Functions でもそのまま動きます、ということで。