엄성진

Merge remote-tracking branch 'origin/dev'

1 *.json 1 *.json
2 node_modules/ 2 node_modules/
3 vscode/ 3 vscode/
4 - Info.js 4 + Info.js
...\ No newline at end of file ...\ No newline at end of file
......
1 -// 아래 주석을 참고해 플레이리스트 or 노래의 배열을 직접 만드시면 됩니다.
2 -// 배열을 만들 때, 활용하실 id값이 플레이리스트의 id인지, 특정 노래의 id인지 구별해서 배열을 만드셔야 합니다.
3 -// '플레이리스트'의 id라면 인덱스 500 이하로,
4 -// '특정 노래'의 id라면 인덱스 500 이상으로 넣어주세요!
5 -// 아래 예시를 보고 이해 안되시면, 편하게 카톡으로 말씀해주세요
6 -
7 -
8 -// index < 500 = 플레이리스트
9 -// index > 500 = 개별 곡
10 -
11 // index 100번대 = 장르 플레이리스트 1 // index 100번대 = 장르 플레이리스트
12 // index 200번대 = 무드 플레이리스트 2 // index 200번대 = 무드 플레이리스트
13 // index 300번대 = 가수 플레이리스트 3 // index 300번대 = 가수 플레이리스트
14 -// index 500번대 = 특정 플레이리스트의 노래 10곡
15 4
16 // index 101 = 장르 - 힙합 5 // index 101 = 장르 - 힙합
17 // index 102 = 장르 - 피아노 6 // index 102 = 장르 - 피아노
...@@ -25,8 +14,6 @@ ...@@ -25,8 +14,6 @@
25 // index 303 = 가수 - 레드벨벳 14 // index 303 = 가수 - 레드벨벳
26 // index 304 = 가수 - 트와이스 15 // index 304 = 가수 - 트와이스
27 16
28 -// index 501 = 슬픈노래 10곡
29 -
30 exports.all_ids = []; 17 exports.all_ids = [];
31 18
32 exports.all_ids[101] = 'PLfVO1GXBPp3s03voaFAWN7AkzEnpsGF1U' 19 exports.all_ids[101] = 'PLfVO1GXBPp3s03voaFAWN7AkzEnpsGF1U'
...@@ -39,7 +26,4 @@ exports.all_ids[202] = 'PLfVO1GXBPp3vrR3ZcQFlCEC6oNdo_MQ_R' ...@@ -39,7 +26,4 @@ exports.all_ids[202] = 'PLfVO1GXBPp3vrR3ZcQFlCEC6oNdo_MQ_R'
39 exports.all_ids[301] = 'PLfVO1GXBPp3tgrwk3GDJi3v-E_Hnq3lDO' 26 exports.all_ids[301] = 'PLfVO1GXBPp3tgrwk3GDJi3v-E_Hnq3lDO'
40 exports.all_ids[302] = 'PLfVO1GXBPp3ubihJVPi6HSltRIuvSqSI1' 27 exports.all_ids[302] = 'PLfVO1GXBPp3ubihJVPi6HSltRIuvSqSI1'
41 exports.all_ids[303] = 'PLfVO1GXBPp3u0ckIfYZkADGlSQ6LQoAIQ' 28 exports.all_ids[303] = 'PLfVO1GXBPp3u0ckIfYZkADGlSQ6LQoAIQ'
42 -exports.all_ids[304] = 'PLfVO1GXBPp3vo3sivJPfFzREBECRFepVK'
43 -
44 -exports.all_ids[501] = ['p5iu1V30myk', 'i-SBnhaZSSU', 'Etfgb6A7hSI', 'IN2mml9xs_s',
45 - 'tp1uoFAfgHE', 'Qx22TnVVIfU', '3y1QIqR115A', 'VXBI1wt8XII', 'aWMBn2--E0Q', 'HyTbgBlnLCo'];
...\ No newline at end of file ...\ No newline at end of file
29 +exports.all_ids[304] = 'PLfVO1GXBPp3vo3sivJPfFzREBECRFepVK'
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -6,209 +6,913 @@ const TARGET_URL = 'https://api.line.me/v2/bot/message/reply' ...@@ -6,209 +6,913 @@ 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 +//세팅,설정값
10 +var setting_userId = []; //유저아이디보관
11 +var setting_Thumbnail = []; // 1:썸네일 출력(기본값) / 0:미출력
12 +var setting_SendAmount = []; // 보낼 양 (1이상, 4이하의 정수) (기본값:1)
13 +var setting_SendAddress = []; // 1:유튜브 주소 출력(기본값) / 0:미출력
9 14
10 -exports.check = function (message, replyToken) { 15 +function SEND(replyToken,title,url2,thumbnail,SendAmount,sendaddress) //검색해서 나온 내용 전송하는 함수
16 +{
17 +
18 + sendMessage = "";
19 + var temp_title = [], temp_url = [], temp_url2 = [], temp_thumpnail = [];
20 + for (var i = 0; i < SendAmount; i++) {
11 21
12 - const rand_0to9 = Math.floor(Math.random() * 10); // 0~9까지 난수생성 22 + temp_title[i] = title[i];
13 23
14 - var choice; 24 + temp_url2[i] = url2[i];
15 - var choose; 25 + if (sendaddress) //주소 전송 활성화
26 + temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, ""));
27 + else
28 + temp_url[i] = "";
29 + sendMessage += temp_title[i] + "\n" +
30 + temp_url[i] + "\n" + "\n";
31 + }
16 32
17 - switch (message) { 33 + console.log(sendMessage);
18 - case "슬픈 노래": 34 + if (thumbnail) //썸네일을 활성화시켰을 경우, 맨 첫번째 작품 리스트 썸네일만 보여줌.
19 - choose = 501; 35 + request.post(
20 - choice = ids.all_ids[choose][rand_0to9] 36 + {
21 - break; 37 + url: TARGET_URL,
22 - case "힙합 플레이리스트": 38 + headers:
23 - choose = 101; 39 + {
24 - choice = ids.all_ids[choose] 40 + 'Authorization': `Bearer ${Info.TOKEN}`
25 - break; 41 + },
26 - case "피아노 플레이리스트": 42 + json:
27 - choose = 102; 43 + {
28 - choice = ids.all_ids[choose] 44 + "replyToken": replyToken,
29 - break; 45 + "messages":
30 - case "팝 플레이리스트": 46 + [
31 - choose = 103; 47 + {
32 - choice = ids.all_ids[choose] 48 + "type": "image",
33 - break; 49 + "originalContentUrl": "https://img.youtube.com/vi/" + url2[0] + "/hqdefault.jpg",
34 - case "신나는 플레이리스트": 50 + "previewImageUrl": "https://img.youtube.com/vi/" + url2[0] + "/hqdefault.jpg"
35 - choose = 201; 51 + },
36 - choice = ids.all_ids[choose] 52 + {
37 - break; 53 + "type": "text",
38 - case "슬픈 플레이리스트": 54 + "text": sendMessage
39 - choose = 202; 55 + }
40 - choice = ids.all_ids[choose] 56 + ]
41 - break; 57 + }
42 - case "블랙핑크 플레이리스트": 58 + }
43 - choose = 301; 59 + );
44 - choice = ids.all_ids[choose] 60 + else //썸네일 비활성화
45 - break; 61 + request.post(
46 - case "아이유 플레이리스트": 62 + {
47 - choose = 302; 63 + url: TARGET_URL,
48 - choice = ids.all_ids[choose] 64 + headers:
49 - break; 65 + {
50 - case "레드벨벳 플레이리스트": 66 + 'Authorization': `Bearer ${Info.TOKEN}`
51 - choose = 303; 67 + },
52 - choice = ids.all_ids[choose] 68 + json:
53 - break; 69 + {
54 - case "트와이스 플레이리스트": 70 + "replyToken": replyToken,
55 - choose = 304; 71 + "messages":
56 - choice = ids.all_ids[choose] 72 + [
57 - break; 73 + {
74 + "type": "text",
75 + "text": sendMessage
76 + }
77 + ]
78 + }
79 + }
80 + );
81 +}
82 +
83 +function shuffle(array) { //플레이리스트에서 랜덤으로 골라서 출력할 수 있도록 shuffle 함수를 추가함
84 + for (let i = array.length - 1; i > 0; i--) {
85 + let j = Math.floor(Math.random() * (i + 1));
86 + [array[i], array[j]] = [array[j], array[i]];
87 + }
88 +}
89 +
90 +function SEND_LIST(replyToken,response,choice,thumbnail,SendAmount,sendaddress)//플레이리스트에서 나온 내용 전송하는 함수
91 +{
92 + var random_order=[0,1,2,3,4,5,6,7,8,9];
93 + shuffle(random_order)
58 94
59 - // 아래는 case 추가를 위한 템플릿 95 + sendMessage = "";
60 - // case "": 96 + var temp_title = [], temp_url = [], temp_url2 = [], temp_thumpnail = [];
61 - // choose = ; 97 + for (var i = 0; i < SendAmount; i++) {
62 - // choice = ids.all_ids[choose]
63 98
64 - default: 99 + temp_title[i] = JSON.stringify(response.data.items[random_order[i]].snippet.title).replace(/\"/gi, "");
65 - console.log("잘못 입력했어요~ 다시 입력하세요"); 100 +
66 - choice = -1; 101 + temp_url2[i] = JSON.stringify(response.data.items[random_order[i]].snippet.resourceId.videoId);
102 + if (sendaddress) //주소 활성화
103 + temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, ""));
104 + else
105 + temp_url[i] = "";
106 + sendMessage += temp_title[i] + "\n" +
107 + temp_url[i] + "\n" + "\n";
67 } 108 }
68 109
69 - if (choose > 500) {
70 110
71 - service.videos.list 111 + console.log(sendMessage);
72 - ( 112 + if (thumbnail) //썸네일을 활성화시켰을 경우, 맨 첫번째 작품 리스트 썸네일만 보여줌.
113 + request.post(
114 + {
115 + url: TARGET_URL,
116 + headers:
73 { 117 {
74 - key: 'AIzaSyBInggOtXxPFYIRee0Xs3vb5iZ9YE9_518', 118 + 'Authorization': `Bearer ${Info.TOKEN}`
75 - part: 'snippet',
76 - id: choice,
77 - fields: 'items(snippet(title))'
78 }, 119 },
79 - function (err, response) { 120 + json:
80 - if (err) { 121 + {
81 - console.log('The API returned an error: ', err); 122 + "replyToken": replyToken,
82 - return; 123 + "messages":
124 + [
125 + {
126 + "type": "image",
127 + "originalContentUrl": "https://img.youtube.com/vi/" + (temp_url2[0].replace(/\"/gi, "")) + "/hqdefault.jpg",
128 + "previewImageUrl": "https://img.youtube.com/vi/" + (temp_url2[0].replace(/\"/gi, "")) + "/hqdefault.jpg"
129 + },
130 + {
131 + "type": "text",
132 + "text": sendMessage
133 + }
134 + ]
135 + }
136 + }
137 + );
138 + else //썸네일 비활성화
139 + request.post(
140 + {
141 + url: TARGET_URL,
142 + headers:
143 + {
144 + 'Authorization': `Bearer ${Info.TOKEN}`
145 + },
146 + json:
147 + {
148 + "replyToken": replyToken,
149 + "messages":
150 + [
151 + {
152 + "type": "text",
153 + "text": sendMessage
154 + }
155 + ]
156 + }
157 + }
158 + );
159 +}
160 +
161 +function HELP(replyToken,sendMessage) //도움말 함수
162 +{
163 + console.log(sendMessage);
164 + request.post(
165 + {
166 + url: TARGET_URL,
167 + headers:
168 + {
169 + 'Authorization': `Bearer ${Info.TOKEN}`
170 + },
171 + json:
172 + {
173 + "replyToken": replyToken,
174 + "messages":
175 + [
176 + {
177 + "type": "text",
178 + "text": sendMessage
83 } 179 }
180 + ]
181 + }
182 + }
183 + );
184 +}
84 185
85 - var video = response.data.items; 186 +function SETTINGS(replyToken) //설정 함수
187 +{
188 + console.log("설정 메뉴 진입");
189 + request.post(
190 + {
191 + url: TARGET_URL,
192 + headers:
193 + {
194 + 'Authorization': `Bearer ${Info.TOKEN}`
195 + },
196 + json:
197 + {
198 + "replyToken": replyToken,
199 + "messages":
200 + [
201 + {
202 + "type": "template",
203 + "altText": "설정메뉴입니다.",
204 + "template": {
205 + "type": "buttons",
206 + "title": "설정",
207 + "text": "설정하려는 항목을 골라주세요.",
208 + "actions": [
209 + {
210 + "type": "postback",
211 + "label": "썸네일 전송 여부 변경",
212 + "data": "썸네일"
213 + },
214 + {
215 + "type": "postback",
216 + "label": "추천 음악 개수 조정",
217 + "data": "개수"
218 + },
219 + {
220 + "type": "postback",
221 + "label": "유튜브 주소 전송 여부 변경",
222 + "data": "주소"
223 + }
224 + ]
225 + }
226 + }
227 + ]
228 + }
229 + }
230 + );
231 +}
86 232
87 - if (video.length == 0) { 233 +function sendplaylist(replyToken, userId, choose)
88 - console.log('검색된 동영상이 없습니다.'); 234 +{
235 + var choice=ids.all_ids[choose];
236 + service.playlistItems.list(
237 + {
238 + key: Info.YoutubeKey,
239 + part: 'snippet',
240 + fields: 'items(snippet(title,resourceId,thumbnails(high(url))))', //제목, VideoId, Thumbnail 이미지 정보.
241 + maxResults: 10,
242 + playlistId: choice
243 + }, function (err, response){
244 + if (err) {
245 + console.log('The API returned an error: ', err);
246 + return;
247 + }
248 + var video = response.data.items;
249 + if (video.length == 0)
250 + console.log('검색된 동영상이 없습니다.');
251 + else
252 + SEND_LIST(replyToken,response,choice,setting_Thumbnail[setting_userId.indexOf(userId)],setting_SendAmount[setting_userId.indexOf(userId)],setting_SendAddress[setting_userId.indexOf(userId)]);
253 + }
254 + )
255 +
256 +}
257 +
258 +
259 +function PLAYLIST(replyToken) //플레이리스트 함수
260 +{
261 + console.log("플레이리스트 선택창 진입");
262 + request.post(
263 + {
264 + url: TARGET_URL,
265 + headers:
266 + {
267 + 'Authorization': `Bearer ${Info.TOKEN}`
268 + },
269 + json:
270 + {
271 + "replyToken": replyToken,
272 + "messages":
273 + [
274 + {
275 + "type": "template",
276 + "altText": "플레이리스트 선택창 입니다.",
277 + "template": {
278 + "type": "buttons",
279 + "title": "분야",
280 + "text": "원하시는 분야를 골라주세요.",
281 + "actions": [
282 + {
283 + "type": "postback",
284 + "label": "장르",
285 + "data": "genre"
286 + },
287 + {
288 + "type": "postback",
289 + "label": "무드",
290 + "data": "mood"
291 + },
292 + {
293 + "type": "postback",
294 + "label": "가수",
295 + "data": "singer"
296 + }
297 + ]
298 + }
89 } 299 }
90 - else { 300 + ]
91 - sendMessage = JSON.stringify(response.data.items[0].snippet.title); 301 + }
92 - console.log(sendMessage); 302 + }
93 - request.post( 303 + );
94 - { 304 +}
95 - url: TARGET_URL, 305 +
96 - headers: 306 +exports.genre = function (replyToken)
307 +{
308 + console.log("플레이리스트-장르");
309 + request.post(
310 + {
311 + url: TARGET_URL,
312 + headers:
313 + {
314 + 'Authorization': `Bearer ${Info.TOKEN}`
315 + },
316 + json:
317 + {
318 + "replyToken": replyToken,
319 + "messages":
320 + [
321 + {
322 + "type": "template",
323 + "altText": "장르 선택창 입니다.",
324 + "template": {
325 + "type": "buttons",
326 + "title": "장르",
327 + "text": "원하시는 장르를 골라주세요.",
328 + "actions": [
97 { 329 {
98 - 'Authorization': `Bearer ${Info.TOKEN}` 330 + "type": "postback",
331 + "label": "힙합",
332 + "data": "hiphop"
99 }, 333 },
100 - json:
101 { 334 {
102 - "replyToken": replyToken, 335 + "type": "postback",
103 - "messages": 336 + "label": "피아노",
104 - [ 337 + "data": "piano"
105 - { 338 + },
106 - "type": "image", 339 + {
107 - "originalContentUrl": "https://img.youtube.com/vi/" + choice + "/hqdefault.jpg", 340 + "type": "postback",
108 - "previewImageUrl": "https://img.youtube.com/vi/" + choice + "/hqdefault.jpg" 341 + "label": "팝",
109 - }, 342 + "data": "pop"
110 - {
111 - "type": "text",
112 - "text": sendMessage
113 - }
114 - ]
115 } 343 }
116 - } 344 + ]
117 - ); 345 + }
118 } 346 }
119 - } 347 + ]
348 + }
349 + }
350 + );
351 +}
120 352
121 - ) 353 +exports.hiphop = function(replyToken,userId)
122 - } 354 +{
355 + console.log('플레이리스트-장르-힙합');
356 + sendplaylist(replyToken, userId, 101);
357 +}
123 358
124 - else { 359 +exports.piano = function(replyToken,userId)
125 - if (choice == -1) { 360 +{
126 - sendMessage = "잘못 입력했어요~ 다시 입력하세요"; 361 + console.log('플레이리스트-장르-피아노');
127 - request.post( 362 + sendplaylist(replyToken, userId, 102);
128 - { 363 +}
129 - url: TARGET_URL, 364 +
130 - headers: 365 +exports.pop = function(replyToken,userId)
366 +{
367 + console.log('플레이리스트-장르-팝');
368 + sendplaylist(replyToken, userId, 103);
369 +}
370 +
371 +exports.mood = function (replyToken)
372 +{
373 + console.log("플레이리스트-무드");
374 + request.post(
375 + {
376 + url: TARGET_URL,
377 + headers:
378 + {
379 + 'Authorization': `Bearer ${Info.TOKEN}`
380 + },
381 + json:
382 + {
383 + "replyToken": replyToken,
384 + "messages":
385 + [
131 { 386 {
132 - 'Authorization': `Bearer ${Info.TOKEN}` 387 + "type": "template",
133 - }, 388 + "altText": "무드 선택창 입니다.",
134 - json: 389 + "template": {
390 + "type": "buttons",
391 + "title": "무드",
392 + "text": "원하시는 무드를 골라주세요.",
393 + "actions": [
394 + {
395 + "type": "postback",
396 + "label": "신남",
397 + "data": "exciting"
398 + },
399 + {
400 + "type": "postback",
401 + "label": "슬픔",
402 + "data": "sad"
403 + }
404 + ]
405 + }
406 + }
407 + ]
408 + }
409 + }
410 + );
411 +}
412 +
413 +exports.exciting = function(replyToken,userId)
414 +{
415 + console.log('플레이리스트-무드-신남');
416 + sendplaylist(replyToken, userId, 201);
417 +}
418 +
419 +exports.sad = function(replyToken,userId)
420 +{
421 + console.log('플레이리스트-무드-슬픔');
422 + sendplaylist(replyToken, userId, 202);
423 +}
424 +
425 +exports.singer = function (replyToken)
426 +{
427 + console.log("플레이리스트-가수");
428 + request.post(
429 + {
430 + url: TARGET_URL,
431 + headers:
432 + {
433 + 'Authorization': `Bearer ${Info.TOKEN}`
434 + },
435 + json:
436 + {
437 + "replyToken": replyToken,
438 + "messages":
439 + [
135 { 440 {
136 - "replyToken": replyToken, 441 + "type": "template",
137 - "messages": 442 + "altText": "가수 선택창 입니다.",
138 - [ 443 + "template": {
444 + "type": "buttons",
445 + "title": "가수",
446 + "text": "원하시는 가수를 골라주세요.",
447 + "actions": [
448 + {
449 + "type": "postback",
450 + "label": "블랙핑크",
451 + "data": "blackpink"
452 + },
139 { 453 {
140 - "type": "text", 454 + "type": "postback",
141 - "text": sendMessage 455 + "label": "아이유",
456 + "data": "iu"
457 + }
458 + ,
459 + {
460 + "type": "postback",
461 + "label": "레드벨벳",
462 + "data": "redvelvet"
463 + }
464 + ,
465 + {
466 + "type": "postback",
467 + "label": "트와이스",
468 + "data": "twice"
142 } 469 }
143 ] 470 ]
471 + }
144 } 472 }
145 - } 473 + ]
146 - ); 474 + }
147 - } 475 + }
148 - else { 476 + );
149 - service.playlistItems.list({ 477 +}
150 - key: 'AIzaSyBInggOtXxPFYIRee0Xs3vb5iZ9YE9_518',
151 - part: 'snippet',
152 - fields: 'items(snippet(title,resourceId,thumbnails(high(url))))', //제목, VideoId, Thumbnail 이미지 정보.
153 - maxResults: 10,
154 - playlistId: choice
155 - }, function (err, response) {
156 - if (err) {
157 - console.log('The API returned an error: ', err);
158 - return;
159 - }
160 478
161 - var video = response.data.items; 479 +exports.blackpink = function(replyToken,userId)
162 - if (video.length == 0) { 480 +{
163 - console.log('검색된 동영상이 없습니다.'); 481 + console.log('플레이리스트-가수-블랙핑크');
164 - } else { 482 + sendplaylist(replyToken, userId, 301);
165 - sendMessage = ""; 483 +}
166 - var temp_title = [], temp_url = [], temp_url2 = [], temp_thumpnail = []; 484 +
167 - for (var i = 0; i < 10; i++) { 485 +exports.iu = function(replyToken,userId)
486 +{
487 + console.log('플레이리스트-가수-아이유');
488 + sendplaylist(replyToken, userId, 302);
489 +}
168 490
169 - temp_title[i] = JSON.stringify(response.data.items[i].snippet.title).replace(/\"/gi, ""); 491 +exports.redvelvet = function(replyToken,userId)
492 +{
493 + console.log('플레이리스트-가수-레드벨벳');
494 + sendplaylist(replyToken, userId, 303);
495 +}
170 496
171 - temp_url2[i] = JSON.stringify(response.data.items[i].snippet.resourceId.videoId); 497 +exports.twice = function(replyToken,userId)
172 - temp_url[i] = 'https://www.youtube.com/watch?v=' + (temp_url2[i].replace(/\"/gi, "")); 498 +{
499 + console.log('플레이리스트-가수-트와이스');
500 + sendplaylist(replyToken, userId, 304);
501 +}
173 502
174 - //temp_thumpnail[i] = "https://img.youtube.com/vi/" + JSON.stringify(response.data.items[i].snippet.thumbnails.high.url).replace(/\"/gi, "") + "/hqdefault.jpg";
175 - // 썸네일 : 사용자가 플레이리스트로 입력 시 리턴으로 너무 많은 정보들을 줘야함. 그래서 뺌.
176 503
177 - sendMessage += temp_title[i] + "\n" + 504 +exports.thumbnail_settings = function (replyToken)
178 - temp_url[i] + "\n" + "\n"; 505 +{
179 - // temp_thumpnail[i] + "\n" + "\n"; 506 +
180 - } console.log(sendMessage); 507 + console.log('썸네일 전송 설정');
181 - request.post( 508 + request.post(
509 + {
510 + url: TARGET_URL,
511 + headers:
512 + {
513 + 'Authorization': `Bearer ${Info.TOKEN}`
514 + },
515 + json:
516 + {
517 + "replyToken": replyToken,
518 + "messages":
519 + [
182 { 520 {
183 - url: TARGET_URL, 521 + "type": "template",
184 - headers: 522 + "altText": "설정메뉴입니다.",
185 - { 523 + "template": {
186 - 'Authorization': `Bearer ${Info.TOKEN}` 524 + "type": "buttons",
187 - }, 525 + "title": "썸네일 전송 여부 변경",
188 - json: 526 + "text": "아래 항목을 골라주세요.",
189 - { 527 + "actions": [
190 - "replyToken": replyToken, 528 + {
191 - "messages": 529 + "type": "postback",
192 - [ 530 + "label": "썸네일 전송 O",
193 - // { 531 + "data": "enablethumbnail"
194 - // "type": "image", 532 + },
195 - // "originalContentUrl": temp_thumpnail[0], 533 + {
196 - // "previewImageUrl": temp_thumpnail[0] 534 + "type": "postback",
197 - // }, 535 + "label": "썸네일 전송 X",
198 - { 536 + "data": "unablethumbnail"
199 - "type": "text", 537 + },
200 - "text": sendMessage 538 + ]
201 - }
202 - ]
203 } 539 }
204 } 540 }
205 - ); 541 + ]
206 - } 542 + }
207 - }) 543 + }
544 +
545 + );
546 +}
547 +
548 +exports.enablethumbnail = function(replyToken,userId)
549 +{
550 + console.log('썸네일 활성화 됨.');
551 + setting_Thumbnail[setting_userId.indexOf(userId)]=1;
552 + request.post(
553 + {
554 + url: TARGET_URL,
555 + headers:
556 + {
557 + 'Authorization': `Bearer ${Info.TOKEN}`
558 + },
559 + json:
560 + {
561 + "replyToken": replyToken,
562 + "messages":
563 + [
564 + {
565 + "type": "text",
566 + "text": "이제 썸네일이 전송됩니다!"
567 + }
568 + ]
569 + }
570 + }
571 + );
572 +}
573 +exports.unablethumbnail = function(replyToken,userId)
574 +{
575 + console.log('썸네일 비활성화 됨.');
576 + setting_Thumbnail[setting_userId.indexOf(userId)]=0;
577 + request.post(
578 + {
579 + url: TARGET_URL,
580 + headers:
581 + {
582 + 'Authorization': `Bearer ${Info.TOKEN}`
583 + },
584 + json:
585 + {
586 + "replyToken": replyToken,
587 + "messages":
588 + [
589 + {
590 + "type": "text",
591 + "text": "이제 썸네일이 전송되지 않습니다!"
592 + }
593 + ]
594 + }
595 + }
596 + );
597 +}
598 +
599 +
600 +
601 +
602 +
603 +
604 +
605 +exports.amount_settings = function (replyToken, userId)
606 +{
607 + console.log('출력량 설정');
608 + request.post(
609 + {
610 + url: TARGET_URL,
611 + headers:
612 + {
613 + 'Authorization': `Bearer ${Info.TOKEN}`
614 + },
615 + json:
616 + {
617 + "replyToken": replyToken,
618 + "messages":
619 + [
620 + {
621 + "type": "template",
622 + "altText": "설정메뉴입니다.",
623 + "template": {
624 + "type": "buttons",
625 + "title": "추천 음악 개수 조정",
626 + "text": "원하는 추천 개수를 골라주세요.",
627 + "actions": [
628 + {
629 + "type": "postback",
630 + "label": "1개",
631 + "data": "amount1"
632 + },
633 + {
634 + "type": "postback",
635 + "label": "2개",
636 + "data": "amount2"
637 + },
638 + {
639 + "type": "postback",
640 + "label": "3개",
641 + "data": "amount3"
642 + },
643 + {
644 + "type": "postback",
645 + "label": "4개",
646 + "data": "amount4"
647 + }
648 + ]
649 + }
650 + }
651 + ]
652 + }
208 } 653 }
209 - }
210 654
655 + );
656 +}
211 657
658 +exports.amount1 = function(replyToken,userId)
659 +{
660 + console.log('한 번에 1개씩');
661 + setting_SendAmount[setting_userId.indexOf(userId)]=1;
662 + request.post(
663 + {
664 + url: TARGET_URL,
665 + headers:
666 + {
667 + 'Authorization': `Bearer ${Info.TOKEN}`
668 + },
669 + json:
670 + {
671 + "replyToken": replyToken,
672 + "messages":
673 + [
674 + {
675 + "type": "text",
676 + "text": "이제 한 번에 한 개씩 추천합니다!"
677 + }
678 + ]
679 + }
680 + }
681 + );
682 +}
212 683
684 +exports.amount2 = function(replyToken,userId)
685 +{
686 + console.log('한 번에 2개씩');
687 + setting_SendAmount[setting_userId.indexOf(userId)]=2;
688 + request.post(
689 + {
690 + url: TARGET_URL,
691 + headers:
692 + {
693 + 'Authorization': `Bearer ${Info.TOKEN}`
694 + },
695 + json:
696 + {
697 + "replyToken": replyToken,
698 + "messages":
699 + [
700 + {
701 + "type": "text",
702 + "text": "이제 한 번에 두 개씩 추천합니다!"
703 + }
704 + ]
705 + }
706 + }
707 + );
708 +}
213 709
710 +exports.amount3 = function(replyToken,userId)
711 +{
712 + console.log('한 번에 3개씩');
713 + setting_SendAmount[setting_userId.indexOf(userId)]=3;
714 + request.post(
715 + {
716 + url: TARGET_URL,
717 + headers:
718 + {
719 + 'Authorization': `Bearer ${Info.TOKEN}`
720 + },
721 + json:
722 + {
723 + "replyToken": replyToken,
724 + "messages":
725 + [
726 + {
727 + "type": "text",
728 + "text": "이제 한 번에 세 개씩 추천합니다!"
729 + }
730 + ]
731 + }
732 + }
733 + );
214 } 734 }
735 +
736 +exports.amount4 = function(replyToken,userId)
737 +{
738 + console.log('한 번에 4개씩');
739 + setting_SendAmount[setting_userId.indexOf(userId)]=4;
740 + request.post(
741 + {
742 + url: TARGET_URL,
743 + headers:
744 + {
745 + 'Authorization': `Bearer ${Info.TOKEN}`
746 + },
747 + json:
748 + {
749 + "replyToken": replyToken,
750 + "messages":
751 + [
752 + {
753 + "type": "text",
754 + "text": "이제 한 번에 네 개씩 추천합니다!"
755 + }
756 + ]
757 + }
758 + }
759 + );
760 +}
761 +
762 +
763 +
764 +
765 +exports.address_settings = function (replyToken)
766 +{
767 + console.log('유튜브 주소 전송 설정');
768 + request.post(
769 + {
770 + url: TARGET_URL,
771 + headers:
772 + {
773 + 'Authorization': `Bearer ${Info.TOKEN}`
774 + },
775 + json:
776 + {
777 + "replyToken": replyToken,
778 + "messages":
779 + [
780 + {
781 + "type": "template",
782 + "altText": "설정메뉴입니다.",
783 + "template": {
784 + "type": "buttons",
785 + "title": "유튜브 주소 전송 여부 변경",
786 + "text": "아래 항목을 골라주세요.",
787 + "actions": [
788 + {
789 + "type": "postback",
790 + "label": "유튜브 주소 전송 O",
791 + "data": "enableaddress"
792 + },
793 + {
794 + "type": "postback",
795 + "label": "유튜브 주소 전송 X",
796 + "data": "unableaddress"
797 + },
798 + ]
799 + }
800 + }
801 + ]
802 + }
803 + }
804 +
805 + );
806 +}
807 +
808 +exports.enableaddress = function(replyToken,userId)
809 +{
810 + console.log('주소 활성화 됨.');
811 + setting_SendAddress[setting_userId.indexOf(userId)]=1;
812 + request.post(
813 + {
814 + url: TARGET_URL,
815 + headers:
816 + {
817 + 'Authorization': `Bearer ${Info.TOKEN}`
818 + },
819 + json:
820 + {
821 + "replyToken": replyToken,
822 + "messages":
823 + [
824 + {
825 + "type": "text",
826 + "text": "이제 유튜브 주소가 전송됩니다!"
827 + }
828 + ]
829 + }
830 + }
831 + );
832 +}
833 +exports.unableaddress = function(replyToken,userId)
834 +{
835 + console.log('주소 비활성화 됨.');
836 + setting_SendAddress[setting_userId.indexOf(userId)]=0;
837 + request.post(
838 + {
839 + url: TARGET_URL,
840 + headers:
841 + {
842 + 'Authorization': `Bearer ${Info.TOKEN}`
843 + },
844 + json:
845 + {
846 + "replyToken": replyToken,
847 + "messages":
848 + [
849 + {
850 + "type": "text",
851 + "text": "이제 유튜브 주소가 전송되지 않습니다!"
852 + }
853 + ]
854 + }
855 + }
856 + );
857 +}
858 +
859 +exports.check = function (message, replyToken, userId) {
860 + if (setting_userId.indexOf(userId)==-1) // 새로운 사용자가 이용할때, 설정 초기값 세팅
861 + {
862 + setting_userId.push(userId);
863 + setting_Thumbnail.push(1);
864 + setting_SendAmount.push(1);
865 + setting_SendAddress.push(1);
866 + console.log("알림: 새로운 사용자가 발견됨");
867 + }
868 +
869 + var choice;
870 + var choose;
871 +
872 + switch (message) {
873 + case "플레이리스트":
874 + PLAYLIST(replyToken);
875 + break;
876 + case "도움말":
877 + sendMessage = "- 기본적으로 찾고 싶은 음악을 입력하여 보내면 적절한 음악 영상을 찾아 추천해드립니다."
878 + +"\n"+"예시) 소녀시대 노래"
879 + +"\n"+"- '플레이리스트'를 입력하면 분류에 따라 엄선한 음악을 추천드립니다!"
880 + +"\n"+"- '설정'을 입력하면 썸네일 출력 여부, 추천 음악 개수(1~4), 유튜브 주소 전송 여부를 설정하실 수 있습니다."
881 + +"\n"+"- 이 도움말을 다시 보고 싶으시다면 '도움말'을 입력하시면 됩니다! 음악과 함께 좋은 하루 보내세요.";
882 + HELP(replyToken,sendMessage);
883 + break;
884 + case "설정":
885 + SETTINGS(replyToken);
886 + break;
887 + default: //일반 검색
888 + var optionParams={
889 + q:message,
890 + part:"snippet",
891 + key:Info.YoutubeKey,
892 + maxResults:10
893 + };
894 + optionParams.q=encodeURI(optionParams.q);
895 + var url="https://www.googleapis.com/youtube/v3/search?";
896 + for(var option in optionParams){
897 + url+=option+"="+optionParams[option]+"&";
898 + }
899 +
900 + //url의마지막에 붙어있는 & 정리
901 + url=url.substr(0, url.length-1);
902 +
903 + request(url, function(err, res, body){
904 + var title=[]
905 + var url2=[]
906 + var data=JSON.parse(body).items;
907 + for(var content in data)
908 + {
909 + title.push(data[content].snippet.title);
910 + url2.push(data[content].id.videoId);
911 + }
912 + if (title.length==0)
913 + console.log('검색된 동영상이 없습니다.');
914 + else
915 + SEND(replyToken,title,url2,setting_Thumbnail[setting_userId.indexOf(userId)],setting_SendAmount[setting_userId.indexOf(userId)],setting_SendAddress[setting_userId.indexOf(userId)]);
916 + });
917 + }
918 +}
...\ No newline at end of file ...\ No newline at end of file
......
1 var express = require('express'); 1 var express = require('express');
2 +var Info = require('./Info');
2 const request = require('request'); 3 const request = require('request');
3 const fs = require('fs'); 4 const fs = require('fs');
4 const path = require('path'); 5 const path = require('path');
5 const HTTPS = require('https'); 6 const HTTPS = require('https');
6 -const domain = "2020105631.oss2021.tk"
7 const sslport = 23023; 7 const sslport = 23023;
8 const bodyParser = require('body-parser'); 8 const bodyParser = require('body-parser');
9 -const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'; 9 +const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
10 -// var Info = require('./Info');
11 var app = express(); 10 var app = express();
12 app.use(bodyParser.json()); 11 app.use(bodyParser.json());
13 -<<<<<<< HEAD
14 -
15 -var sad = require('./video_sad');
16 -
17 -=======
18 var songs = require('./check'); 12 var songs = require('./check');
19 ->>>>>>> feature/YouTube_API
20 -
21 -
22 app.post('/hook', function (req, res) { 13 app.post('/hook', function (req, res) {
23 14
24 var eventObj = req.body.events[0]; 15 var eventObj = req.body.events[0];
...@@ -26,10 +17,97 @@ app.post('/hook', function (req, res) { ...@@ -26,10 +17,97 @@ app.post('/hook', function (req, res) {
26 17
27 // request log 18 // request log
28 console.log('======================', new Date(), '======================'); 19 console.log('======================', new Date(), '======================');
29 - send(eventObj.replyToken, message.text); 20 +
30 - res.sendStatus(200); 21 + if (eventObj.type=="message") // 일반 메시지일때
31 -}); 22 + {
32 -function send(replyToken, message) { 23 + react(eventObj.replyToken, message.text,eventObj.source.userId);
24 + }
25 +
26 + else
27 + switch (eventObj.postback.data) {
28 + case "썸네일": //설정에서 썸네일 설정버튼을 눌렀을때
29 + songs.thumbnail_settings(eventObj.replyToken);
30 + break;
31 + case "enablethumbnail": //설정 -> 썸네일 설정 -> 활성화
32 + songs.enablethumbnail(eventObj.replyToken,eventObj.source.userId);
33 + break;
34 + case "unablethumbnail": //설정 -> 썸네일 설정 -> 비활성화
35 + songs.unablethumbnail(eventObj.replyToken,eventObj.source.userId);
36 + break;
37 +
38 + case "개수": //설정에서 전송 개수 설정버튼을 눌렀을때
39 + songs.amount_settings(eventObj.replyToken,eventObj.source.userId);
40 + break;
41 + case "amount1": //설정 -> 전송 개수 -> 1
42 + songs.amount1(eventObj.replyToken,eventObj.source.userId);
43 + break;
44 + case "amount2": //설정 -> 전송 개수 -> 2
45 + songs.amount2(eventObj.replyToken,eventObj.source.userId);
46 + break;
47 + case "amount3": //설정 -> 전송 개수 -> 3
48 + songs.amount3(eventObj.replyToken,eventObj.source.userId);
49 + break;
50 + case "amount4": //설정 -> 전송 개수 -> 4
51 + songs.amount4(eventObj.replyToken,eventObj.source.userId);
52 + break;
53 +
54 + case "주소": //설정에서 유튜브 주소 설정버튼을 눌렀을때
55 + songs.address_settings(eventObj.replyToken);
56 + break;
57 + case "enableaddress": //설정 -> 주소 설정 -> 활성화
58 + songs.enableaddress(eventObj.replyToken,eventObj.source.userId);
59 + break;
60 + case "unableaddress": //설정 -> 주소 설정 -> 비활성화
61 + songs.unableaddress(eventObj.replyToken,eventObj.source.userId);
62 + break;
63 +
64 +
65 + case "genre": // 플레이리스트 -> 장르
66 + songs.genre(eventObj.replyToken);
67 + break;
68 +
69 + case "hiphop": // 플레이리스트 -> 장르 -> 힙합
70 + songs.hiphop(eventObj.replyToken,eventObj.source.userId);
71 + break;
72 + case "piano": // 플레이리스트 -> 장르 -> 피아노
73 + songs.piano(eventObj.replyToken,eventObj.source.userId);
74 + break;
75 + case "pop": // 플레이리스트 -> 장르 -> 팝
76 + songs.pop(eventObj.replyToken,eventObj.source.userId);
77 + break;
78 +
79 + case "mood": // 플레이리스트 -> 무드
80 + songs.mood(eventObj.replyToken);
81 + break;
82 +
83 + case "exciting": // 플레이리스트 -> 무드 -> 신남
84 + songs.exciting(eventObj.replyToken,eventObj.source.userId);
85 + break;
86 + case "sad": // 플레이리스트 -> 무드 -> 슬픔
87 + songs.sad(eventObj.replyToken,eventObj.source.userId);
88 + break;
89 +
90 + case "singer": // 플레이리스트 -> 가수
91 + songs.singer(eventObj.replyToken);
92 + break;
93 +
94 + case "blackpink": // 플레이리스트 -> 가수 -> 블랙핑크
95 + songs.blackpink(eventObj.replyToken,eventObj.source.userId);
96 + break;
97 + case "iu": // 플레이리스트 -> 가수 -> 아이유
98 + songs.iu(eventObj.replyToken,eventObj.source.userId);
99 + break;
100 + case "redvelvet": // 플레이리스트 -> 가수 -> 레드벨벳
101 + songs.redvelvet(eventObj.replyToken,eventObj.source.userId);
102 + break;
103 + case "twice": // 플레이리스트 -> 가수 -> 트와이스
104 + songs.twice(eventObj.replyToken,eventObj.source.userId);
105 + break;
106 + }
107 + res.sendStatus(200);
108 + }
109 +);
110 +function react(replyToken, message,userId) {
33 111
34 request.post( 112 request.post(
35 { 113 {
...@@ -37,16 +115,15 @@ function send(replyToken, message) { ...@@ -37,16 +115,15 @@ function send(replyToken, message) {
37 }, 115 },
38 116
39 function () { 117 function () {
40 - songs.check(message, replyToken); 118 + songs.check(message, replyToken,userId);
41 -
42 } 119 }
43 ); 120 );
44 } 121 }
45 try { 122 try {
46 const option = { 123 const option = {
47 - ca: fs.readFileSync('/etc/letsencrypt/live/' + domain + '/fullchain.pem'), 124 + ca: fs.readFileSync('/etc/letsencrypt/live/' + Info.domain + '/fullchain.pem'),
48 - key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain + '/privkey.pem'), 'utf8').toString(), 125 + key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + Info.domain + '/privkey.pem'), 'utf8').toString(),
49 - cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain + '/cert.pem'), 'utf8').toString(), 126 + cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + Info.domain + '/cert.pem'), 'utf8').toString(),
50 }; 127 };
51 128
52 HTTPS.createServer(option, app).listen(sslport, () => { 129 HTTPS.createServer(option, app).listen(sslport, () => {
......
1 -var Info = require('./Info');
2 -
3 -exports.check = function(message,replyToken){
4 -
5 - const rand_0to9 = Math.floor(Math.random() * 10); // 0~9까지 난수생성
6 - var ids = ['p5iu1V30myk', 'i-SBnhaZSSU', 'Etfgb6A7hSI', 'IN2mml9xs_s', // 모든 동영상 id를 관리하는 배열
7 - 'tp1uoFAfgHE', 'Qx22TnVVIfU', '3y1QIqR115A', 'VXBI1wt8XII', 'aWMBn2--E0Q', 'HyTbgBlnLCo'];
8 -
9 - const request = require('request');
10 - const fs = require('fs');
11 - const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
12 -
13 -
14 - var { google } = require('googleapis');
15 -
16 - var service = google.youtube('v3');
17 - service.videos.list
18 - (
19 - {
20 - key: 'AIzaSyBInggOtXxPFYIRee0Xs3vb5iZ9YE9_518',
21 - part: 'snippet',
22 - id: ids[rand_0to9], // 동영상 Id random input
23 - fields: 'items(snippet(title))'
24 - },
25 - function (err, response)
26 - {
27 - if (err)
28 - {
29 - console.log('The API returned an error: ', err);
30 - return;
31 - }
32 -
33 - var video = response.data.items;
34 -
35 - if (video.length == 0)
36 - {
37 - console.log('검색된 동영상이 없습니다.');
38 - }
39 - else
40 - {
41 - sendMessage = JSON.stringify(response.data.items[0].snippet.title);
42 - console.log(sendMessage);
43 - request.post(
44 - {
45 - url: TARGET_URL,
46 - headers:
47 - {
48 - 'Authorization': `Bearer ${Info.TOKEN}`
49 - },
50 - json:
51 - {
52 - "replyToken": replyToken,
53 - "messages":
54 - [
55 - {
56 - "type": "image",
57 - "originalContentUrl": "https://img.youtube.com/vi/"+ids[rand_0to9]+"/hqdefault.jpg",
58 - "previewImageUrl": "https://img.youtube.com/vi/"+ids[rand_0to9]+"/hqdefault.jpg"
59 - },
60 - {
61 - "type": "text",
62 - "text": sendMessage
63 - }
64 - ]
65 - }
66 - }
67 - );
68 - }
69 - }
70 - )
71 -
72 -
73 -
74 -
75 -
76 -}