# 5.[応用編]メッセージに応答するサーバを作ってみる
# ゴール
- AWS Lambdaを使ってAPIを作成する
- 送信されたメッセージにオウム返しできるようにする
- 2章と同じようにメッセージに応じた返答ができるようになる
# 5-1.全体構成
- 2章の冒頭と同じ図です
- この章ではAPIサーバを作成しメッセージに応答できるようにします
# 5-2.セットアップ
# Nodeのインストール
- Nodeの公式サイトからインストールしてください
- ターミナルで以下のコマンドを実行してバージョンが表示されればOKです
node -v
npm -v
1
2
2
# yarnのインストール
- 以下のコマンドでインストールします
npm i -g yarn
1
- 以下のコマンドを実行してバージョンが表示されればOKです
yarn -v
1
# ServerlessFrameworkのインストール
- 以下のコマンドでインストールします
npm i -g serverless
1
- 以下のコマンドを実行してバージョンが表示されればOKです
sls -v
1
# AWSのアクセスキーの発行
- AWSにアクセスするためのキー情報を発行します
- こちらの記事の手順に従って登録してください
# 応答メッセージの削除
- 2章で設定した応答メッセージを無効化しておきましょう
- LINE Official Account Managerからすべてオフにしておきます
# 5-3.APIサーバの作成
- 今回はAWS Lambdaを使ってAPIを作成します
- AWS LambdaのコードはServerlessFrameworkを使って構築していきます
# プロジェクトの雛形作成
- ディレクトリを作成し移動します
mkdir line-bot-api
cd line-bot-api
1
2
2
- ServerlessFrameworkを使ってテンプレートを生成します
sls create -t aws-nodejs-ecma-script
1
- このようなファイルが生成されているはずです
% tree
.
├── first.js
├── package.json
├── second.js
├── serverless.yml
└── webpack.config.js
1
2
3
4
5
6
7
2
3
4
5
6
7
- 依存ライブラリをインストールします
- コマンド実行後
line-bot-api
内にnode_modules
ディレクトリができていればOKです
- コマンド実行後
yarn
1
# Helloを返す関数の作成
- 自動生成されたテンプレートを手直ししていきます
- プロジェクト直下に
handler.js
というファイルを作成し以下の内容を記述してください
export const hello = async event => {
return {
statusCode: 200,
body: 'Hello',
};
};
1
2
3
4
5
6
2
3
4
5
6
serverless.yml
を修正します- 以下の内容に丸ごと置き換えて必要事項を修正してください
service:
name: line-bot-api-名前 # 一意な値である必要があるので名前などを追加しておいてください
plugins:
- serverless-webpack
provider:
name: aws
runtime: nodejs12.x
region: ap-northeast-1
# profile: xxx # AWSのアクセスキー登録で`~/.aws/credentials`に[default]以外の名前で登録した場合はここで設定します
functions:
hello: # Lambdaの関数名
handler: handler.hello # ファイル名.エクスポート名
# HTTPエンドポイントを作成するAPI Gatewayの設定
events:
- http:
method: get
path: hello
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- AWSにデプロイしてみます
sls deploy
1
- うまくいくと以下のようにログにURLが表示されます
- 表示されたURLにアクセスし
Hello
と表示されればデプロイ成功です
# 5-4.メッセージをオウム返しする
- Helloまで動作確認ができたのでメッセージを応答する関数を作成していきます
- まずは送信されたメッセージをオウム返しするところまで作ってみます
# アクセストークンの取得
- 応答メッセージを返すためにはトークンを送る必要があります
- LINEのデベロッパーコンソールからトークンを取得しておきます
- 2つ作ったチャネルのうち
Messaging API
の方を選択します
Messaging API設定
タブを選択します
- 一番下までスクロールすると
チャネルアクセストークン
という項目があるので発行
ボタンを押してトークンを生成します
- トークンはこの後使うので控えておいてください
# ライブラリの追加
- LINEの機能を利用するためにライブラリを追加します
yarn add @line/bot-sdk
1
# 関数の追加
handler.js
に新しい関数を作成します- 1-33行目を追加しています
import { Client } from '@line/bot-sdk';
// 環境変数からトークンを取得
const channelAccessToken = process.env.CHANNEL_ACCESS_TOKEN;
// LINE APIのクライアントを初期化
const lineClient = new Client({ channelAccessToken });
// POST:/reply
export const reply = async event => {
const body = JSON.parse(event.body);
// replyToken: 応答に必要なトークン, message: 送信されたメッセージの情報
const { replyToken, message } = body.events[0];
// デベロッパーコンソールからのテスト打鍵の場合replyせずに返す
if (replyToken === '00000000000000000000000000000000') {
return { statusCode: 200 };
}
// 応答メッセージを送信
await lineClient.replyMessage(replyToken, [
{
type: 'text',
text: message.text, // オウム返しするので受け取ったメッセージをセット
},
]);
return {
statusCode: 200,
body: 'OK',
};
};
// GET:/hello
export const hello = async event => {
return {
statusCode: 200,
body: 'Hello',
};
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
serverless.yml
に新しく追加した関数の情報を付け足します- 10-11行目にアクセストークンをセットします
- トークンをそのままGitHubにあげるなどしないように注意してください
- 19-24行目に新しく追加したreply関数の情報をセットします
- 10-11行目にアクセストークンをセットします
service:
name: line-bot-api-名前
plugins:
- serverless-webpack
provider:
name: aws
runtime: nodejs12.x
region: ap-northeast-1
# profile: xxx
environment:
CHANNEL_ACCESS_TOKEN: XXX # アクセストークンを設定する
functions:
hello:
handler: handler.hello
events:
- http:
method: get
path: hello
reply:
handler: handler.reply
events:
- http:
method: post
path: reply
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# デプロイ
- ここまで修正できたらデプロイします
sls deploy
1
- ログにはURLが2つ表示されているはずです
- 末尾が
reply
の方のURLを控えておいてください
# Webhook URLの登録
APIができたのでLINEのデベロッパーコンソールにWebhook URLとして登録します
アクセストークンを取得した時と同じ
Messaging API設定
タブを選びますWebhookの項目でURLを登録し
Webhookの利用
にもチェックを入れておきます
検証
を押して成功することも確認しておきましょう- 最後にWebhookの設定がオフになっていることがあるのでオンにしておきます
# 動作確認
- ここまでできたらスマホでLINEアプリを開いて動作確認してみます
- オウム返しができるようになりました!
# 5-5.メッセージに応じた返答をする
- ここまでで一連のフローはできあがりました
- あとはLamda関数のロジックを拡充していくだけです
# メッセージの内容による振り分け
handler.js
を修正してメッセージの内容に応じて返答を変えてみます- 21-41行目にロジックを追加しています
- 47行目も修正しています
import { Client } from '@line/bot-sdk';
// 環境変数からトークンを取得
const channelAccessToken = process.env.CHANNEL_ACCESS_TOKEN;
// LINE APIのクライアントを初期化
const lineClient = new Client({ channelAccessToken });
// POST:/reply
export const reply = async event => {
const body = JSON.parse(event.body);
// replyToken: 応答に必要なトークン, message: 送信されたメッセージの情報
const { replyToken, message } = body.events[0];
// デベロッパーコンソールからのテスト打鍵の場合replyせずに返す
if (replyToken === '00000000000000000000000000000000') {
return { statusCode: 200 };
}
// 受け取ったメッセージを小文字化
const receivedMessage = message.text.toLowerCase();
// 受け取ったメッセージに応じて返答内容を決定
let text = '';
switch (receivedMessage) {
case 'twitter':
text = 'https://twitter.com/ozaki25rn';
break;
case 'qiita':
text = 'https://qiita.com/ozaki25';
break;
case 'github':
text = 'https://github.com/ozaki25';
break;
case 'hatena':
text = 'https://ozaki25.hatenadiary.jp/';
break;
default:
text = 'その言葉は分かりません';
}
// 応答メッセージを送信
await lineClient.replyMessage(replyToken, [
{
type: 'text',
text,
},
]);
return {
statusCode: 200,
body: 'OK',
};
};
// GET:/hello
export const hello = async event => {
return {
statusCode: 200,
body: 'Hello',
};
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# デプロイ
- 修正できたらデプロイします
sls deploy
1
# 動作確認
- スマホで動作確認してみましょう
- 今回はメッセージを送信された時の応答のみを実装しました
- LINE Bot側から一方的にメッセージをプッシュすることもできるので興味がある人は調べてみてください