Showing
2 changed files
with
172 additions
and
30 deletions
... | @@ -6,7 +6,7 @@ const TARGET_URL = 'https://api.line.me/v2/bot/message/reply' | ... | @@ -6,7 +6,7 @@ const TARGET_URL = 'https://api.line.me/v2/bot/message/reply' |
6 | var { google } = require('googleapis'); | 6 | var { google } = require('googleapis'); |
7 | var service = google.youtube('v3'); | 7 | var service = google.youtube('v3'); |
8 | 8 | ||
9 | -//세팅값 | 9 | +//세팅,설정값 |
10 | var setting_userId = []; //유저아이디보관 | 10 | var setting_userId = []; //유저아이디보관 |
11 | var setting_Thumbnail = []; // 1:썸네일 출력(기본값) / 0:미출력 | 11 | var setting_Thumbnail = []; // 1:썸네일 출력(기본값) / 0:미출력 |
12 | var setting_SendAmount = []; // 보낼 양 (1이상, 10이하의 정수) (기본값:1) | 12 | var setting_SendAmount = []; // 보낼 양 (1이상, 10이하의 정수) (기본값:1) |
... | @@ -23,15 +23,17 @@ function SEND(replyToken,title,url2,thumbnail,SendAmount,sendaddress) //검색 | ... | @@ -23,15 +23,17 @@ function SEND(replyToken,title,url2,thumbnail,SendAmount,sendaddress) //검색 |
23 | temp_title[i] = title[i]; | 23 | temp_title[i] = title[i]; |
24 | 24 | ||
25 | temp_url2[i] = url2[i]; | 25 | temp_url2[i] = url2[i]; |
26 | + if (sendaddress) //주소 전송 활성화 | ||
26 | temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); | 27 | temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); |
27 | - | 28 | + else |
29 | + temp_url[i] = ""; | ||
28 | sendMessage += temp_title[i] + "\n" + | 30 | sendMessage += temp_title[i] + "\n" + |
29 | temp_url[i] + "\n" + "\n"; | 31 | temp_url[i] + "\n" + "\n"; |
30 | } | 32 | } |
31 | 33 | ||
32 | 34 | ||
33 | console.log(sendMessage); | 35 | console.log(sendMessage); |
34 | - if (thumbnail==1) //썸네일을 활성화시켰을 경우, 맨 첫번째 작품 리스트 썸네일만 보여줌. | 36 | + if (thumbnail) //썸네일을 활성화시켰을 경우, 맨 첫번째 작품 리스트 썸네일만 보여줌. |
35 | request.post( | 37 | request.post( |
36 | { | 38 | { |
37 | url: TARGET_URL, | 39 | url: TARGET_URL, |
... | @@ -57,11 +59,7 @@ function SEND(replyToken,title,url2,thumbnail,SendAmount,sendaddress) //검색 | ... | @@ -57,11 +59,7 @@ function SEND(replyToken,title,url2,thumbnail,SendAmount,sendaddress) //검색 |
57 | } | 59 | } |
58 | } | 60 | } |
59 | ); | 61 | ); |
60 | -} | 62 | + else //썸네일 비활성화 |
61 | - | ||
62 | -function SEND_TEXT(replyToken,sendMessage) //단순 텍스트 전송하는 함수 | ||
63 | -{ | ||
64 | - console.log(sendMessage); | ||
65 | request.post( | 63 | request.post( |
66 | { | 64 | { |
67 | url: TARGET_URL, | 65 | url: TARGET_URL, |
... | @@ -84,31 +82,35 @@ function SEND_TEXT(replyToken,sendMessage) //단순 텍스트 전송하는 함 | ... | @@ -84,31 +82,35 @@ function SEND_TEXT(replyToken,sendMessage) //단순 텍스트 전송하는 함 |
84 | ); | 82 | ); |
85 | } | 83 | } |
86 | 84 | ||
85 | +function shuffle(array) { //플레이리스트에서 랜덤으로 골라서 출력할 수 있도록 shuffle 함수를 추가함 | ||
86 | + for (let i = array.length - 1; i > 0; i--) { | ||
87 | + let j = Math.floor(Math.random() * (i + 1)); | ||
88 | + [array[i], array[j]] = [array[j], array[i]]; | ||
89 | + } | ||
90 | +} | ||
87 | function SEND_LIST(replyToken,response,choice,thumbnail,SendAmount,sendaddress)//플레이리스트에서 나온 내용 전송하는 함수 | 91 | function SEND_LIST(replyToken,response,choice,thumbnail,SendAmount,sendaddress)//플레이리스트에서 나온 내용 전송하는 함수 |
88 | { | 92 | { |
89 | - //sendMessage = JSON.stringify(response.data.items[0].snippet.title); | 93 | + var random_order=[0,1,2,3,4,5,6,7,8,9]; |
94 | + shuffle(random_order) | ||
90 | 95 | ||
91 | sendMessage = ""; | 96 | sendMessage = ""; |
92 | var temp_title = [], temp_url = [], temp_url2 = [], temp_thumpnail = []; | 97 | var temp_title = [], temp_url = [], temp_url2 = [], temp_thumpnail = []; |
93 | for (var i = 0; i < SendAmount; i++) { | 98 | for (var i = 0; i < SendAmount; i++) { |
94 | 99 | ||
95 | - temp_title[i] = JSON.stringify(response.data.items[i].snippet.title).replace(/\"/gi, ""); | 100 | + temp_title[i] = JSON.stringify(response.data.items[random_order[i]].snippet.title).replace(/\"/gi, ""); |
96 | 101 | ||
97 | - temp_url2[i] = JSON.stringify(response.data.items[i].snippet.resourceId.videoId); | 102 | + temp_url2[i] = JSON.stringify(response.data.items[random_order[i]].snippet.resourceId.videoId); |
98 | - //temp_url2[i] = choice; | 103 | + if (sendaddress) //주소 활성화 |
99 | temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); | 104 | temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); |
100 | - | 105 | + else |
101 | - //temp_thumpnail[i] = "https://img.youtube.com/vi/" + JSON.stringify(response.data.items[i].snippet.thumbnails.high.url).replace(/\"/gi, "") + "/hqdefault.jpg"; | 106 | + temp_url[i] = ""; |
102 | - // 썸네일 : 사용자가 플레이리스트로 입력 시 리턴으로 너무 많은 정보들을 줘야함. 그래서 뺌. | ||
103 | - | ||
104 | sendMessage += temp_title[i] + "\n" + | 107 | sendMessage += temp_title[i] + "\n" + |
105 | temp_url[i] + "\n" + "\n"; | 108 | temp_url[i] + "\n" + "\n"; |
106 | - // temp_thumpnail[i] + "\n" + "\n"; | ||
107 | } | 109 | } |
108 | 110 | ||
109 | 111 | ||
110 | console.log(sendMessage); | 112 | console.log(sendMessage); |
111 | - if (thumbnail==1) //썸네일을 활성화시켰을 경우, 맨 첫번째 작품 리스트 썸네일만 보여줌. | 113 | + if (thumbnail) //썸네일을 활성화시켰을 경우, 맨 첫번째 작품 리스트 썸네일만 보여줌. |
112 | request.post( | 114 | request.post( |
113 | { | 115 | { |
114 | url: TARGET_URL, | 116 | url: TARGET_URL, |
... | @@ -134,27 +136,141 @@ function SEND_LIST(replyToken,response,choice,thumbnail,SendAmount,sendaddress)/ | ... | @@ -134,27 +136,141 @@ function SEND_LIST(replyToken,response,choice,thumbnail,SendAmount,sendaddress)/ |
134 | } | 136 | } |
135 | } | 137 | } |
136 | ); | 138 | ); |
139 | + else //썸네일 비활성화 | ||
140 | + request.post( | ||
141 | + { | ||
142 | + url: TARGET_URL, | ||
143 | + headers: | ||
144 | + { | ||
145 | + 'Authorization': `Bearer ${Info.TOKEN}` | ||
146 | + }, | ||
147 | + json: | ||
148 | + { | ||
149 | + "replyToken": replyToken, | ||
150 | + "messages": | ||
151 | + [ | ||
152 | + { | ||
153 | + "type": "text", | ||
154 | + "text": sendMessage | ||
155 | + } | ||
156 | + ] | ||
157 | + } | ||
158 | + } | ||
159 | + ); | ||
137 | } | 160 | } |
138 | 161 | ||
162 | +function SEND_TEXT(replyToken,sendMessage) //단순 텍스트 전송하는 함수 | ||
163 | +{ | ||
164 | + console.log(sendMessage); | ||
165 | + request.post( | ||
166 | + { | ||
167 | + url: TARGET_URL, | ||
168 | + headers: | ||
169 | + { | ||
170 | + 'Authorization': `Bearer ${Info.TOKEN}` | ||
171 | + }, | ||
172 | + json: | ||
173 | + { | ||
174 | + "replyToken": replyToken, | ||
175 | + "messages": | ||
176 | + [ | ||
177 | + { | ||
178 | + "type": "text", | ||
179 | + "text": sendMessage | ||
180 | + } | ||
181 | + ] | ||
182 | + } | ||
183 | + } | ||
184 | + ); | ||
185 | +} | ||
186 | + | ||
187 | +function SETTINGS(replyToken,sendMessage) //설정 함수 | ||
188 | +{ | ||
189 | + console.log(sendMessage); | ||
190 | + request.post( | ||
191 | + { | ||
192 | + url: TARGET_URL, | ||
193 | + headers: | ||
194 | + { | ||
195 | + 'Authorization': `Bearer ${Info.TOKEN}` | ||
196 | + }, | ||
197 | + json: | ||
198 | + { | ||
199 | + "replyToken": replyToken, | ||
200 | + "messages": | ||
201 | + [ | ||
202 | + { | ||
203 | + "type": "text", | ||
204 | + "text": sendMessage | ||
205 | + }, | ||
206 | + { | ||
207 | + "type": "template", | ||
208 | + "altText": "설정메뉴입니다.", | ||
209 | + "template": { | ||
210 | + "type": "buttons", | ||
211 | + "title": "설정", | ||
212 | + "text": "설정하려는 항목을 골라주세요.", | ||
213 | + "actions": [ | ||
214 | + { | ||
215 | + "type": "postback", | ||
216 | + "label": "썸네일 출력 여부 변경", | ||
217 | + "data": "썸네일" | ||
218 | + }, | ||
219 | + { | ||
220 | + "type": "postback", | ||
221 | + "label": "추천 음악 개수 조정", | ||
222 | + "data": "개수" | ||
223 | + }, | ||
224 | + { | ||
225 | + "type": "postback", | ||
226 | + "label": "유튜브 주소 출력 여부 변경", | ||
227 | + "data": "주소" | ||
228 | + } | ||
229 | + ] | ||
230 | + } | ||
231 | + } | ||
232 | + ] | ||
233 | + } | ||
234 | + } | ||
235 | + ); | ||
236 | +} | ||
139 | 237 | ||
238 | +exports.thumbnail_settings = function (replyToken, userId) | ||
239 | +{ | ||
240 | + console.log('썸네일 출력 설정'); | ||
241 | + // 여기서 썸네일을 출력할지 말지 물어보고나서, 웹훅의 응답을 받아 그 응답에 따라서 | ||
242 | + // setting_Thumbnail[setting_userId.indexOf(userId)] 의 값를 수정합니다. | ||
243 | + // https://developers.line.biz/en/reference/messaging-api/#template-messages 의 confirm 를 참고해서 응용하시면 될 것 같습니다. | ||
244 | + // 이곳에 userid에 맞게 setting_Thumbnail, setting_SendAmount, setting_SendAddress 의 값을 수정해주시면 됩니다. | ||
245 | +} | ||
140 | 246 | ||
141 | 247 | ||
248 | +exports.amount_settings = function (replyToken, userId) | ||
249 | +{ | ||
250 | + console.log('출력량 설정'); | ||
251 | + // 여기서 노래 몇개를 출력할지 물어보고나서, 웹훅의 응답을 받아 그 응답에 따라서 | ||
252 | + // setting_SendAmount[setting_userId.indexOf(userId)] 의 값를 수정합니다. | ||
253 | + // 이거는 단순하게 숫자를 입력받으면 될 것 같습니다. 다만 1,2,3,4,5,6,7,8,9,10 의 응답만 받도록 해주셔야 합니다. (예외처리 필수) | ||
254 | +} | ||
142 | 255 | ||
256 | +exports.address_settings = function (replyToken, userId) | ||
257 | +{ | ||
258 | + console.log('유튜브 주소 출력 설정'); | ||
259 | + // 여기서 유튜브 주소를 출력할지 말지 물어보고나서, 웹훅의 응답을 받아 그 응답에 따라서 | ||
260 | + // setting_SendAddress[setting_userId.indexOf(userId)] 의 값를 수정합니다. | ||
261 | + // https://developers.line.biz/en/reference/messaging-api/#template-messages 의 confirm 를 참고해서 응용하시면 될 것 같습니다. | ||
262 | +} | ||
143 | 263 | ||
144 | exports.check = function (message, replyToken, userId) { | 264 | exports.check = function (message, replyToken, userId) { |
145 | 265 | ||
146 | 266 | ||
147 | - if (setting_userId.indexOf(userId)==-1) | 267 | + if (setting_userId.indexOf(userId)==-1) // 새로운 사용자가 이용할때, 설정 초기값 세팅 |
148 | { | 268 | { |
149 | setting_userId.push(userId); | 269 | setting_userId.push(userId); |
150 | setting_Thumbnail.push(1); | 270 | setting_Thumbnail.push(1); |
151 | setting_SendAmount.push(1); | 271 | setting_SendAmount.push(1); |
152 | setting_SendAddress.push(1); | 272 | setting_SendAddress.push(1); |
153 | - console.log("없당"); | 273 | + console.log("알림: 새로운 사용자가 발견됨"); |
154 | - } | ||
155 | - else | ||
156 | - { | ||
157 | - console.log("있당"); | ||
158 | } | 274 | } |
159 | 275 | ||
160 | 276 | ||
... | @@ -249,7 +365,7 @@ exports.check = function (message, replyToken, userId) { | ... | @@ -249,7 +365,7 @@ exports.check = function (message, replyToken, userId) { |
249 | if (title.length==0) | 365 | if (title.length==0) |
250 | console.log('검색된 동영상이 없습니다.'); | 366 | console.log('검색된 동영상이 없습니다.'); |
251 | else | 367 | else |
252 | - SEND(replyToken,title,url2,1,3,1); | 368 | + SEND(replyToken,title,url2,setting_Thumbnail[setting_userId.indexOf(userId)],setting_SendAmount[setting_userId.indexOf(userId)],setting_SendAddress[setting_userId.indexOf(userId)]); |
253 | }); | 369 | }); |
254 | 370 | ||
255 | 371 | ||
... | @@ -283,12 +399,16 @@ exports.check = function (message, replyToken, userId) { | ... | @@ -283,12 +399,16 @@ exports.check = function (message, replyToken, userId) { |
283 | } | 399 | } |
284 | 400 | ||
285 | else if (choose == 001){ // 도움말 | 401 | else if (choose == 001){ // 도움말 |
286 | - sendMessage = "도움말 예시"; | 402 | + sendMessage = "- 기본적으로 찾고 싶은 음악을 입력하여 보내면 적절한 음악 영상을 찾아 추천해드립니다." |
403 | + +"\n"+"예시) 소녀시대 노래" | ||
404 | + +"\n"+"- '플레이리스트'를 입력하면 분류에 따라 엄선한 음악을 추천드립니다!" | ||
405 | + +"\n"+"- '설정'을 입력하면 썸네일 출력 여부, 추천 음악 개수(1~10), 유튜브 주소 전송 여부를 설정하실 수 있습니다." | ||
406 | + +"\n"+"- 이 도움말을 다시 보고 싶으시다면 '도움말'을 입력하시면 됩니다! 음악과 함께 좋은 하루 보내세요."; | ||
287 | SEND_TEXT(replyToken,sendMessage); | 407 | SEND_TEXT(replyToken,sendMessage); |
288 | } | 408 | } |
289 | else if (choose == 002) { // 설정 | 409 | else if (choose == 002) { // 설정 |
290 | sendMessage = "설정 예시"; | 410 | sendMessage = "설정 예시"; |
291 | - SEND_TEXT(replyToken,sendMessage); | 411 | + SETTINGS(replyToken,sendMessage); |
292 | } | 412 | } |
293 | 413 | ||
294 | else { //플레이리스트 | 414 | else { //플레이리스트 |
... | @@ -308,7 +428,7 @@ exports.check = function (message, replyToken, userId) { | ... | @@ -308,7 +428,7 @@ exports.check = function (message, replyToken, userId) { |
308 | if (video.length == 0) | 428 | if (video.length == 0) |
309 | console.log('검색된 동영상이 없습니다.'); | 429 | console.log('검색된 동영상이 없습니다.'); |
310 | else | 430 | else |
311 | - SEND_LIST(replyToken,response,choice,1,10,1); | 431 | + SEND_LIST(replyToken,response,choice,setting_Thumbnail[setting_userId.indexOf(userId)],setting_SendAmount[setting_userId.indexOf(userId)],setting_SendAddress[setting_userId.indexOf(userId)]); |
312 | } | 432 | } |
313 | ) | 433 | ) |
314 | } | 434 | } | ... | ... |
... | @@ -20,11 +20,33 @@ app.post('/hook', function (req, res) { | ... | @@ -20,11 +20,33 @@ app.post('/hook', function (req, res) { |
20 | 20 | ||
21 | // request log | 21 | // request log |
22 | console.log('======================', new Date(), '======================'); | 22 | console.log('======================', new Date(), '======================'); |
23 | + console.log(eventObj); | ||
24 | + if (eventObj.type=="message") // 일반 메시지일때 | ||
25 | + react(eventObj.replyToken, message.text,eventObj.source.userId); | ||
26 | + else if (eventObj.postback.data=="썸네일") //설정에서 썸네일 설정버튼을 눌렀을때 | ||
27 | + songs.thumbnail_settings(eventObj.replyToken,eventObj.source.userId); | ||
28 | + | ||
29 | + //else if (썸네일 설정 버튼을 누르고 거기서 응답이 들어왔을때) | ||
30 | + | ||
31 | + else if (eeventObj.postback.data=="개수") //설정에서 출력 개수 설정버튼을 눌렀을때 | ||
32 | + songs.amount_settings(eventObj.replyToken,eventObj.source.userId); | ||
33 | + | ||
34 | + //else if (출력 개수 설정 버튼을 누르고 거기서 응답이 들어왔을때) | ||
35 | + | ||
36 | + else if (eventObj.postback.data=="주소") //설정에서 유튜브 주소 설정버튼을 눌렀을때 | ||
37 | + songs.address_settings(eventObj.replyToken,eventObj.source.userId); | ||
38 | + | ||
39 | + //else if (유튜브 주소 설정 버튼을 누르고 거기서 응답이 들어왔을때) | ||
40 | + | ||
41 | + //★★else if (플레이리스트를 입력했을때 뜬 버튼에서 장르를 눌렀을때) | ||
42 | + | ||
43 | + //★★else if (플레이리스트를 입력했을때 뜬 버튼에서 무드를 눌렀을때) | ||
44 | + | ||
45 | + //★★else if (플레이리스트를 입력했을때 뜬 버튼에서 가수를 눌렀을때) | ||
23 | 46 | ||
24 | - send(eventObj.replyToken, message.text,eventObj.source.userId); | ||
25 | res.sendStatus(200); | 47 | res.sendStatus(200); |
26 | }); | 48 | }); |
27 | -function send(replyToken, message,userId) { | 49 | +function react(replyToken, message,userId) { |
28 | 50 | ||
29 | request.post( | 51 | request.post( |
30 | { | 52 | { | ... | ... |
-
Please register or login to post a comment