質問編集履歴

2

コードを追記しました。

2019/09/21 02:16

投稿

yuta_kg
yuta_kg

スコア24

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- DynamoDBから取得したgroupIDを使い、あるLINEグループにメッセージを送るLINE botを作成しています。
1
+ DynamoDBから取得したgroupIDを使い、グループにメッセージを送るAlexaをトリガーとしたLINE botを作成しています。
2
2
 
3
3
  現在DynamoDBからgroupIDを取得するgetメソッドにコールバック関数を指定しています。
4
4
 
@@ -14,36 +14,158 @@
14
14
 
15
15
  ```Javascript
16
16
 
17
+ const MindFullnessIntentHandler = {
18
+
19
+ canHandle(handlerInput) {
20
+
17
- var groupId = "0123"; //groupIdの雛形を作成。
21
+ return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
22
+
23
+ && Alexa.getIntentName(handlerInput.requestEnvelope) === 'MindFullnessIntent';
24
+
25
+ },
26
+
27
+ async handle(handlerInput) {
28
+
29
+ // ----------LINEでメッセージを送信----------//
30
+
31
+ // Userごとのアクセストークン
32
+
33
+ const accessToken = handlerInput.requestEnvelope.session.user.accessToken;
34
+
35
+ console.log(accessToken);
18
36
 
19
37
 
20
38
 
21
- docClient.get(params, function(err, data) {
39
+ var options = { //http リクエスト
22
40
 
23
- if (err) {
41
+ method: 'GET', //method
24
42
 
25
- console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
43
+ uri: 'https://api.line.me/v2/profile', //エンドポイント
26
44
 
27
- } else {
45
+ headers: {
28
46
 
29
- console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
47
+ 'Authorization': `Bearer ${accessToken}` //ヘッダーにアクセストークンを追加しないと、エンドポイントで認証できない
30
48
 
31
- groupId = data.Item.groupId;
49
+ }
32
50
 
33
- console.log(groupId);
51
+ };
34
52
 
35
- }
36
53
 
54
+
55
+ // 時間の取得
56
+
57
+ const slots = handlerInput.requestEnvelope.request.intent.slots;
58
+
59
+ const time = slots.time.value;
60
+
61
+
62
+
63
+ // アクセストークンより、LINEのUser情報を取得
64
+
65
+ const lineData = JSON.parse(await rp(options));
66
+
67
+
68
+
69
+ const userName = lineData.displayName;
70
+
71
+
72
+
73
+ const message = {
74
+
75
+ type: 'text',
76
+
77
+ text: `${userName}さんは${time}分しました.`
78
+
37
- });
79
+ };
80
+
81
+
82
+
83
+ const userId = lineData.userId;
38
84
 
39
85
 
40
86
 
87
+ //DynamoDBからgroupIDを取得
88
+
89
+ AWS.config.update({
90
+
41
- console.log("groupId:" + groupId);
91
+ region: "ap-northeast-1",
92
+
93
+ endpoint: "https://dynamodb.ap-northeast-1.amazonaws.com"
94
+
95
+ });
42
96
 
43
97
 
44
98
 
45
- // botに通知を送信
99
+ const docClient = new AWS.DynamoDB.DocumentClient();
46
100
 
101
+
102
+
103
+ const table = "line_user";
104
+
105
+
106
+
107
+ const params = {
108
+
109
+ TableName: table,
110
+
111
+ Key: {
112
+
113
+ "userId": userId
114
+
115
+ }
116
+
117
+ };
118
+
119
+
120
+
121
+ var groupId = "0123"; //groupIdの雛形を作成。userIdから取得出来なければこのgroupId
122
+
123
+
124
+
125
+ docClient.get(params, function(err, data) {
126
+
127
+ if (err) {
128
+
129
+ console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
130
+
131
+ } else {
132
+
133
+ console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
134
+
135
+ groupId = data.Item.groupId;
136
+
137
+ console.log(groupId);
138
+
139
+ return groupId;
140
+
141
+ }
142
+
143
+ });
144
+
145
+
146
+
147
+ console.log("groupId:" + groupId);
148
+
149
+
150
+
151
+ // botに通知を送信
152
+
47
- await lineclient.pushMessage(groupId, message);
153
+ await lineclient.pushMessage(groupId, message);
154
+
155
+
156
+
157
+ const speakOutput = `${time}分ですね。それでは始めましょう!`;
158
+
159
+
160
+
161
+ return handlerInput.responseBuilder
162
+
163
+ .speak(speakOutput)
164
+
165
+ .getResponse();
166
+
167
+ }
168
+
169
+ };
48
170
 
49
171
  ```

1

問題点を具体的にしました。

2019/09/21 02:16

投稿

yuta_kg
yuta_kg

スコア24

test CHANGED
File without changes
test CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  現在DynamoDBからgroupIDを取得するgetメソッドにコールバック関数を指定しています。
4
4
 
5
- すが、戻り値の取得方法が分かりません
5
+ groupId宣言時に、"0123"を代入していますが、コールバック関数内で取得した値を代入したいです
6
6
 
7
+ ですが、以下のコードではgroupIdに取得した値が代入されず、groupId="0123"のままです。
8
+
7
- コールバック関数からの戻り値の取得方法を教えてください。
9
+ groupIdにコールバック関数内で取得した値を代入する方法を教えてください。
8
10
 
9
11
 
10
12