Showing
2 changed files
with
193 additions
and
51 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 | - temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); | 26 | + if (sendaddress) //주소 전송 활성화 |
27 | - | 27 | + temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); |
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,58 +59,58 @@ function SEND(replyToken,title,url2,thumbnail,SendAmount,sendaddress) //검색 | ... | @@ -57,58 +59,58 @@ function SEND(replyToken,title,url2,thumbnail,SendAmount,sendaddress) //검색 |
57 | } | 59 | } |
58 | } | 60 | } |
59 | ); | 61 | ); |
60 | -} | 62 | + else //썸네일 비활성화 |
61 | - | 63 | + request.post( |
62 | -function SEND_TEXT(replyToken,sendMessage) //단순 텍스트 전송하는 함수 | ||
63 | -{ | ||
64 | - console.log(sendMessage); | ||
65 | - request.post( | ||
66 | - { | ||
67 | - url: TARGET_URL, | ||
68 | - headers: | ||
69 | - { | ||
70 | - 'Authorization': `Bearer ${Info.TOKEN}` | ||
71 | - }, | ||
72 | - json: | ||
73 | { | 64 | { |
74 | - "replyToken": replyToken, | 65 | + url: TARGET_URL, |
75 | - "messages": | 66 | + headers: |
76 | - [ | 67 | + { |
77 | - { | 68 | + 'Authorization': `Bearer ${Info.TOKEN}` |
78 | - "type": "text", | 69 | + }, |
79 | - "text": sendMessage | 70 | + json: |
80 | - } | 71 | + { |
81 | - ] | 72 | + "replyToken": replyToken, |
73 | + "messages": | ||
74 | + [ | ||
75 | + { | ||
76 | + "type": "text", | ||
77 | + "text": sendMessage | ||
78 | + } | ||
79 | + ] | ||
80 | + } | ||
82 | } | 81 | } |
83 | - } | 82 | + ); |
84 | - ); | ||
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 | - | ||
97 | - temp_url2[i] = JSON.stringify(response.data.items[i].snippet.resourceId.videoId); | ||
98 | - //temp_url2[i] = choice; | ||
99 | - temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); | ||
100 | - | ||
101 | - //temp_thumpnail[i] = "https://img.youtube.com/vi/" + JSON.stringify(response.data.items[i].snippet.thumbnails.high.url).replace(/\"/gi, "") + "/hqdefault.jpg"; | ||
102 | - // 썸네일 : 사용자가 플레이리스트로 입력 시 리턴으로 너무 많은 정보들을 줘야함. 그래서 뺌. | ||
103 | 101 | ||
102 | + temp_url2[i] = JSON.stringify(response.data.items[random_order[i]].snippet.resourceId.videoId); | ||
103 | + if (sendaddress) //주소 활성화 | ||
104 | + temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); | ||
105 | + else | ||
106 | + temp_url[i] = ""; | ||
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 | +} | ||
139 | 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 | +} | ||
140 | 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 | +} | ||
141 | 246 | ||
142 | 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 | +} | ||
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 | - | 23 | + console.log(eventObj); |
24 | - send(eventObj.replyToken, message.text,eventObj.source.userId); | 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 (플레이리스트를 입력했을때 뜬 버튼에서 가수를 눌렀을때) | ||
46 | + | ||
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