Toggle navigation
Toggle navigation
This project
Loading...
Sign in
신지원
/
LineMusicChatbot
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Graphs
Network
Create a new issue
Commits
Issue Boards
Authored by
엄성진
2021-06-09 03:36:27 +0900
Browse Files
Options
Browse Files
Download
Plain Diff
Commit
1d796018d1a99147a26710f7e0a95e6608ca5036
1d796018
2 parents
d8b8bfa2
d3e25725
Merge remote-tracking branch 'origin/dev'
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
967 additions
and
278 deletions
.gitignore
all_ids.js
check.js
index.js
video_sad.js
.gitignore
View file @
1d79601
*.json
node_modules/
vscode/
Info.js
Info.js
\ No newline at end of file
...
...
all_ids.js
View file @
1d79601
// 아래 주석을 참고해 플레이리스트 or 노래의 배열을 직접 만드시면 됩니다.
// 배열을 만들 때, 활용하실 id값이 플레이리스트의 id인지, 특정 노래의 id인지 구별해서 배열을 만드셔야 합니다.
// '플레이리스트'의 id라면 인덱스 500 이하로,
// '특정 노래'의 id라면 인덱스 500 이상으로 넣어주세요!
// 아래 예시를 보고 이해 안되시면, 편하게 카톡으로 말씀해주세요
// index < 500 = 플레이리스트
// index > 500 = 개별 곡
// index 100번대 = 장르 플레이리스트
// index 200번대 = 무드 플레이리스트
// index 300번대 = 가수 플레이리스트
// index 500번대 = 특정 플레이리스트의 노래 10곡
// index 101 = 장르 - 힙합
// index 102 = 장르 - 피아노
...
...
@@ -25,8 +14,6 @@
// index 303 = 가수 - 레드벨벳
// index 304 = 가수 - 트와이스
// index 501 = 슬픈노래 10곡
exports
.
all_ids
=
[];
exports
.
all_ids
[
101
]
=
'PLfVO1GXBPp3s03voaFAWN7AkzEnpsGF1U'
...
...
@@ -39,7 +26,4 @@ exports.all_ids[202] = 'PLfVO1GXBPp3vrR3ZcQFlCEC6oNdo_MQ_R'
exports
.
all_ids
[
301
]
=
'PLfVO1GXBPp3tgrwk3GDJi3v-E_Hnq3lDO'
exports
.
all_ids
[
302
]
=
'PLfVO1GXBPp3ubihJVPi6HSltRIuvSqSI1'
exports
.
all_ids
[
303
]
=
'PLfVO1GXBPp3u0ckIfYZkADGlSQ6LQoAIQ'
exports
.
all_ids
[
304
]
=
'PLfVO1GXBPp3vo3sivJPfFzREBECRFepVK'
exports
.
all_ids
[
501
]
=
[
'p5iu1V30myk'
,
'i-SBnhaZSSU'
,
'Etfgb6A7hSI'
,
'IN2mml9xs_s'
,
'tp1uoFAfgHE'
,
'Qx22TnVVIfU'
,
'3y1QIqR115A'
,
'VXBI1wt8XII'
,
'aWMBn2--E0Q'
,
'HyTbgBlnLCo'
];
\ No newline at end of file
exports
.
all_ids
[
304
]
=
'PLfVO1GXBPp3vo3sivJPfFzREBECRFepVK'
\ No newline at end of file
...
...
check.js
View file @
1d79601
...
...
@@ -6,209 +6,913 @@ const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
var
{
google
}
=
require
(
'googleapis'
);
var
service
=
google
.
youtube
(
'v3'
);
//세팅,설정값
var
setting_userId
=
[];
//유저아이디보관
var
setting_Thumbnail
=
[];
// 1:썸네일 출력(기본값) / 0:미출력
var
setting_SendAmount
=
[];
// 보낼 양 (1이상, 4이하의 정수) (기본값:1)
var
setting_SendAddress
=
[];
// 1:유튜브 주소 출력(기본값) / 0:미출력
exports
.
check
=
function
(
message
,
replyToken
)
{
function
SEND
(
replyToken
,
title
,
url2
,
thumbnail
,
SendAmount
,
sendaddress
)
//검색해서 나온 내용 전송하는 함수
{
sendMessage
=
""
;
var
temp_title
=
[],
temp_url
=
[],
temp_url2
=
[],
temp_thumpnail
=
[];
for
(
var
i
=
0
;
i
<
SendAmount
;
i
++
)
{
const
rand_0to9
=
Math
.
floor
(
Math
.
random
()
*
10
);
// 0~9까지 난수생성
temp_title
[
i
]
=
title
[
i
];
var
choice
;
var
choose
;
temp_url2
[
i
]
=
url2
[
i
];
if
(
sendaddress
)
//주소 전송 활성화
temp_url
[
i
]
=
'https://www.youtube.com/watch?v='
+
(
temp_url2
[
i
].
replace
(
/
\"
/gi
,
""
));
else
temp_url
[
i
]
=
""
;
sendMessage
+=
temp_title
[
i
]
+
"\n"
+
temp_url
[
i
]
+
"\n"
+
"\n"
;
}
switch
(
message
)
{
case
"슬픈 노래"
:
choose
=
501
;
choice
=
ids
.
all_ids
[
choose
][
rand_0to9
]
break
;
case
"힙합 플레이리스트"
:
choose
=
101
;
choice
=
ids
.
all_ids
[
choose
]
break
;
case
"피아노 플레이리스트"
:
choose
=
102
;
choice
=
ids
.
all_ids
[
choose
]
break
;
case
"팝 플레이리스트"
:
choose
=
103
;
choice
=
ids
.
all_ids
[
choose
]
break
;
case
"신나는 플레이리스트"
:
choose
=
201
;
choice
=
ids
.
all_ids
[
choose
]
break
;
case
"슬픈 플레이리스트"
:
choose
=
202
;
choice
=
ids
.
all_ids
[
choose
]
break
;
case
"블랙핑크 플레이리스트"
:
choose
=
301
;
choice
=
ids
.
all_ids
[
choose
]
break
;
case
"아이유 플레이리스트"
:
choose
=
302
;
choice
=
ids
.
all_ids
[
choose
]
break
;
case
"레드벨벳 플레이리스트"
:
choose
=
303
;
choice
=
ids
.
all_ids
[
choose
]
break
;
case
"트와이스 플레이리스트"
:
choose
=
304
;
choice
=
ids
.
all_ids
[
choose
]
break
;
console
.
log
(
sendMessage
);
if
(
thumbnail
)
//썸네일을 활성화시켰을 경우, 맨 첫번째 작품 리스트 썸네일만 보여줌.
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"image"
,
"originalContentUrl"
:
"https://img.youtube.com/vi/"
+
url2
[
0
]
+
"/hqdefault.jpg"
,
"previewImageUrl"
:
"https://img.youtube.com/vi/"
+
url2
[
0
]
+
"/hqdefault.jpg"
},
{
"type"
:
"text"
,
"text"
:
sendMessage
}
]
}
}
);
else
//썸네일 비활성화
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
sendMessage
}
]
}
}
);
}
function
shuffle
(
array
)
{
//플레이리스트에서 랜덤으로 골라서 출력할 수 있도록 shuffle 함수를 추가함
for
(
let
i
=
array
.
length
-
1
;
i
>
0
;
i
--
)
{
let
j
=
Math
.
floor
(
Math
.
random
()
*
(
i
+
1
));
[
array
[
i
],
array
[
j
]]
=
[
array
[
j
],
array
[
i
]];
}
}
function
SEND_LIST
(
replyToken
,
response
,
choice
,
thumbnail
,
SendAmount
,
sendaddress
)
//플레이리스트에서 나온 내용 전송하는 함수
{
var
random_order
=
[
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
];
shuffle
(
random_order
)
// 아래는 case 추가를 위한 템플릿
// case "":
// choose = ;
// choice = ids.all_ids[choose]
sendMessage
=
""
;
var
temp_title
=
[],
temp_url
=
[],
temp_url2
=
[],
temp_thumpnail
=
[];
for
(
var
i
=
0
;
i
<
SendAmount
;
i
++
)
{
default
:
console
.
log
(
"잘못 입력했어요~ 다시 입력하세요"
);
choice
=
-
1
;
temp_title
[
i
]
=
JSON
.
stringify
(
response
.
data
.
items
[
random_order
[
i
]].
snippet
.
title
).
replace
(
/
\"
/gi
,
""
);
temp_url2
[
i
]
=
JSON
.
stringify
(
response
.
data
.
items
[
random_order
[
i
]].
snippet
.
resourceId
.
videoId
);
if
(
sendaddress
)
//주소 활성화
temp_url
[
i
]
=
'https://www.youtube.com/watch?v='
+
(
temp_url2
[
i
].
replace
(
/
\"
/gi
,
""
));
else
temp_url
[
i
]
=
""
;
sendMessage
+=
temp_title
[
i
]
+
"\n"
+
temp_url
[
i
]
+
"\n"
+
"\n"
;
}
if
(
choose
>
500
)
{
service
.
videos
.
list
(
console
.
log
(
sendMessage
);
if
(
thumbnail
)
//썸네일을 활성화시켰을 경우, 맨 첫번째 작품 리스트 썸네일만 보여줌.
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
key
:
'AIzaSyBInggOtXxPFYIRee0Xs3vb5iZ9YE9_518'
,
part
:
'snippet'
,
id
:
choice
,
fields
:
'items(snippet(title))'
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
function
(
err
,
response
)
{
if
(
err
)
{
console
.
log
(
'The API returned an error: '
,
err
);
return
;
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"image"
,
"originalContentUrl"
:
"https://img.youtube.com/vi/"
+
(
temp_url2
[
0
].
replace
(
/
\"
/gi
,
""
))
+
"/hqdefault.jpg"
,
"previewImageUrl"
:
"https://img.youtube.com/vi/"
+
(
temp_url2
[
0
].
replace
(
/
\"
/gi
,
""
))
+
"/hqdefault.jpg"
},
{
"type"
:
"text"
,
"text"
:
sendMessage
}
]
}
}
);
else
//썸네일 비활성화
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
sendMessage
}
]
}
}
);
}
function
HELP
(
replyToken
,
sendMessage
)
//도움말 함수
{
console
.
log
(
sendMessage
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
sendMessage
}
]
}
}
);
}
var
video
=
response
.
data
.
items
;
function
SETTINGS
(
replyToken
)
//설정 함수
{
console
.
log
(
"설정 메뉴 진입"
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"template"
,
"altText"
:
"설정메뉴입니다."
,
"template"
:
{
"type"
:
"buttons"
,
"title"
:
"설정"
,
"text"
:
"설정하려는 항목을 골라주세요."
,
"actions"
:
[
{
"type"
:
"postback"
,
"label"
:
"썸네일 전송 여부 변경"
,
"data"
:
"썸네일"
},
{
"type"
:
"postback"
,
"label"
:
"추천 음악 개수 조정"
,
"data"
:
"개수"
},
{
"type"
:
"postback"
,
"label"
:
"유튜브 주소 전송 여부 변경"
,
"data"
:
"주소"
}
]
}
}
]
}
}
);
}
if
(
video
.
length
==
0
)
{
console
.
log
(
'검색된 동영상이 없습니다.'
);
function
sendplaylist
(
replyToken
,
userId
,
choose
)
{
var
choice
=
ids
.
all_ids
[
choose
];
service
.
playlistItems
.
list
(
{
key
:
Info
.
YoutubeKey
,
part
:
'snippet'
,
fields
:
'items(snippet(title,resourceId,thumbnails(high(url))))'
,
//제목, VideoId, Thumbnail 이미지 정보.
maxResults
:
10
,
playlistId
:
choice
},
function
(
err
,
response
){
if
(
err
)
{
console
.
log
(
'The API returned an error: '
,
err
);
return
;
}
var
video
=
response
.
data
.
items
;
if
(
video
.
length
==
0
)
console
.
log
(
'검색된 동영상이 없습니다.'
);
else
SEND_LIST
(
replyToken
,
response
,
choice
,
setting_Thumbnail
[
setting_userId
.
indexOf
(
userId
)],
setting_SendAmount
[
setting_userId
.
indexOf
(
userId
)],
setting_SendAddress
[
setting_userId
.
indexOf
(
userId
)]);
}
)
}
function
PLAYLIST
(
replyToken
)
//플레이리스트 함수
{
console
.
log
(
"플레이리스트 선택창 진입"
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"template"
,
"altText"
:
"플레이리스트 선택창 입니다."
,
"template"
:
{
"type"
:
"buttons"
,
"title"
:
"분야"
,
"text"
:
"원하시는 분야를 골라주세요."
,
"actions"
:
[
{
"type"
:
"postback"
,
"label"
:
"장르"
,
"data"
:
"genre"
},
{
"type"
:
"postback"
,
"label"
:
"무드"
,
"data"
:
"mood"
},
{
"type"
:
"postback"
,
"label"
:
"가수"
,
"data"
:
"singer"
}
]
}
}
else
{
sendMessage
=
JSON
.
stringify
(
response
.
data
.
items
[
0
].
snippet
.
title
);
console
.
log
(
sendMessage
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
]
}
}
);
}
exports
.
genre
=
function
(
replyToken
)
{
console
.
log
(
"플레이리스트-장르"
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"template"
,
"altText"
:
"장르 선택창 입니다."
,
"template"
:
{
"type"
:
"buttons"
,
"title"
:
"장르"
,
"text"
:
"원하시는 장르를 골라주세요."
,
"actions"
:
[
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
"type"
:
"postback"
,
"label"
:
"힙합"
,
"data"
:
"hiphop"
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"image"
,
"originalContentUrl"
:
"https://img.youtube.com/vi/"
+
choice
+
"/hqdefault.jpg"
,
"previewImageUrl"
:
"https://img.youtube.com/vi/"
+
choice
+
"/hqdefault.jpg"
},
{
"type"
:
"text"
,
"text"
:
sendMessage
}
]
"type"
:
"postback"
,
"label"
:
"피아노"
,
"data"
:
"piano"
},
{
"type"
:
"postback"
,
"label"
:
"팝"
,
"data"
:
"pop"
}
}
);
]
}
}
}
]
}
}
);
}
)
}
exports
.
hiphop
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-장르-힙합'
);
sendplaylist
(
replyToken
,
userId
,
101
);
}
else
{
if
(
choice
==
-
1
)
{
sendMessage
=
"잘못 입력했어요~ 다시 입력하세요"
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
exports
.
piano
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-장르-피아노'
);
sendplaylist
(
replyToken
,
userId
,
102
);
}
exports
.
pop
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-장르-팝'
);
sendplaylist
(
replyToken
,
userId
,
103
);
}
exports
.
mood
=
function
(
replyToken
)
{
console
.
log
(
"플레이리스트-무드"
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
"type"
:
"template"
,
"altText"
:
"무드 선택창 입니다."
,
"template"
:
{
"type"
:
"buttons"
,
"title"
:
"무드"
,
"text"
:
"원하시는 무드를 골라주세요."
,
"actions"
:
[
{
"type"
:
"postback"
,
"label"
:
"신남"
,
"data"
:
"exciting"
},
{
"type"
:
"postback"
,
"label"
:
"슬픔"
,
"data"
:
"sad"
}
]
}
}
]
}
}
);
}
exports
.
exciting
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-무드-신남'
);
sendplaylist
(
replyToken
,
userId
,
201
);
}
exports
.
sad
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-무드-슬픔'
);
sendplaylist
(
replyToken
,
userId
,
202
);
}
exports
.
singer
=
function
(
replyToken
)
{
console
.
log
(
"플레이리스트-가수"
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"replyToken"
:
replyToken
,
"messages"
:
[
"type"
:
"template"
,
"altText"
:
"가수 선택창 입니다."
,
"template"
:
{
"type"
:
"buttons"
,
"title"
:
"가수"
,
"text"
:
"원하시는 가수를 골라주세요."
,
"actions"
:
[
{
"type"
:
"postback"
,
"label"
:
"블랙핑크"
,
"data"
:
"blackpink"
},
{
"type"
:
"text"
,
"text"
:
sendMessage
"type"
:
"postback"
,
"label"
:
"아이유"
,
"data"
:
"iu"
}
,
{
"type"
:
"postback"
,
"label"
:
"레드벨벳"
,
"data"
:
"redvelvet"
}
,
{
"type"
:
"postback"
,
"label"
:
"트와이스"
,
"data"
:
"twice"
}
]
}
}
}
);
}
else
{
service
.
playlistItems
.
list
({
key
:
'AIzaSyBInggOtXxPFYIRee0Xs3vb5iZ9YE9_518'
,
part
:
'snippet'
,
fields
:
'items(snippet(title,resourceId,thumbnails(high(url))))'
,
//제목, VideoId, Thumbnail 이미지 정보.
maxResults
:
10
,
playlistId
:
choice
},
function
(
err
,
response
)
{
if
(
err
)
{
console
.
log
(
'The API returned an error: '
,
err
);
return
;
}
]
}
}
);
}
var
video
=
response
.
data
.
items
;
if
(
video
.
length
==
0
)
{
console
.
log
(
'검색된 동영상이 없습니다.'
);
}
else
{
sendMessage
=
""
;
var
temp_title
=
[],
temp_url
=
[],
temp_url2
=
[],
temp_thumpnail
=
[];
for
(
var
i
=
0
;
i
<
10
;
i
++
)
{
exports
.
blackpink
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-가수-블랙핑크'
);
sendplaylist
(
replyToken
,
userId
,
301
);
}
exports
.
iu
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-가수-아이유'
);
sendplaylist
(
replyToken
,
userId
,
302
);
}
temp_title
[
i
]
=
JSON
.
stringify
(
response
.
data
.
items
[
i
].
snippet
.
title
).
replace
(
/
\"
/gi
,
""
);
exports
.
redvelvet
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-가수-레드벨벳'
);
sendplaylist
(
replyToken
,
userId
,
303
);
}
temp_url2
[
i
]
=
JSON
.
stringify
(
response
.
data
.
items
[
i
].
snippet
.
resourceId
.
videoId
);
temp_url
[
i
]
=
'https://www.youtube.com/watch?v='
+
(
temp_url2
[
i
].
replace
(
/
\"
/gi
,
""
));
exports
.
twice
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'플레이리스트-가수-트와이스'
);
sendplaylist
(
replyToken
,
userId
,
304
);
}
//temp_thumpnail[i] = "https://img.youtube.com/vi/" + JSON.stringify(response.data.items[i].snippet.thumbnails.high.url).replace(/\"/gi, "") + "/hqdefault.jpg";
// 썸네일 : 사용자가 플레이리스트로 입력 시 리턴으로 너무 많은 정보들을 줘야함. 그래서 뺌.
sendMessage
+=
temp_title
[
i
]
+
"\n"
+
temp_url
[
i
]
+
"\n"
+
"\n"
;
// temp_thumpnail[i] + "\n" + "\n";
}
console
.
log
(
sendMessage
);
request
.
post
(
exports
.
thumbnail_settings
=
function
(
replyToken
)
{
console
.
log
(
'썸네일 전송 설정'
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
// {
// "type": "image",
// "originalContentUrl": temp_thumpnail[0],
// "previewImageUrl": temp_thumpnail[0]
// },
{
"type"
:
"text"
,
"text"
:
sendMessage
}
]
"type"
:
"template"
,
"altText"
:
"설정메뉴입니다."
,
"template"
:
{
"type"
:
"buttons"
,
"title"
:
"썸네일 전송 여부 변경"
,
"text"
:
"아래 항목을 골라주세요."
,
"actions"
:
[
{
"type"
:
"postback"
,
"label"
:
"썸네일 전송 O"
,
"data"
:
"enablethumbnail"
},
{
"type"
:
"postback"
,
"label"
:
"썸네일 전송 X"
,
"data"
:
"unablethumbnail"
},
]
}
}
);
}
})
]
}
}
);
}
exports
.
enablethumbnail
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'썸네일 활성화 됨.'
);
setting_Thumbnail
[
setting_userId
.
indexOf
(
userId
)]
=
1
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
"이제 썸네일이 전송됩니다!"
}
]
}
}
);
}
exports
.
unablethumbnail
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'썸네일 비활성화 됨.'
);
setting_Thumbnail
[
setting_userId
.
indexOf
(
userId
)]
=
0
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
"이제 썸네일이 전송되지 않습니다!"
}
]
}
}
);
}
exports
.
amount_settings
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'출력량 설정'
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"template"
,
"altText"
:
"설정메뉴입니다."
,
"template"
:
{
"type"
:
"buttons"
,
"title"
:
"추천 음악 개수 조정"
,
"text"
:
"원하는 추천 개수를 골라주세요."
,
"actions"
:
[
{
"type"
:
"postback"
,
"label"
:
"1개"
,
"data"
:
"amount1"
},
{
"type"
:
"postback"
,
"label"
:
"2개"
,
"data"
:
"amount2"
},
{
"type"
:
"postback"
,
"label"
:
"3개"
,
"data"
:
"amount3"
},
{
"type"
:
"postback"
,
"label"
:
"4개"
,
"data"
:
"amount4"
}
]
}
}
]
}
}
}
);
}
exports
.
amount1
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'한 번에 1개씩'
);
setting_SendAmount
[
setting_userId
.
indexOf
(
userId
)]
=
1
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
"이제 한 번에 한 개씩 추천합니다!"
}
]
}
}
);
}
exports
.
amount2
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'한 번에 2개씩'
);
setting_SendAmount
[
setting_userId
.
indexOf
(
userId
)]
=
2
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
"이제 한 번에 두 개씩 추천합니다!"
}
]
}
}
);
}
exports
.
amount3
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'한 번에 3개씩'
);
setting_SendAmount
[
setting_userId
.
indexOf
(
userId
)]
=
3
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
"이제 한 번에 세 개씩 추천합니다!"
}
]
}
}
);
}
exports
.
amount4
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'한 번에 4개씩'
);
setting_SendAmount
[
setting_userId
.
indexOf
(
userId
)]
=
4
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
"이제 한 번에 네 개씩 추천합니다!"
}
]
}
}
);
}
exports
.
address_settings
=
function
(
replyToken
)
{
console
.
log
(
'유튜브 주소 전송 설정'
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"template"
,
"altText"
:
"설정메뉴입니다."
,
"template"
:
{
"type"
:
"buttons"
,
"title"
:
"유튜브 주소 전송 여부 변경"
,
"text"
:
"아래 항목을 골라주세요."
,
"actions"
:
[
{
"type"
:
"postback"
,
"label"
:
"유튜브 주소 전송 O"
,
"data"
:
"enableaddress"
},
{
"type"
:
"postback"
,
"label"
:
"유튜브 주소 전송 X"
,
"data"
:
"unableaddress"
},
]
}
}
]
}
}
);
}
exports
.
enableaddress
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'주소 활성화 됨.'
);
setting_SendAddress
[
setting_userId
.
indexOf
(
userId
)]
=
1
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
"이제 유튜브 주소가 전송됩니다!"
}
]
}
}
);
}
exports
.
unableaddress
=
function
(
replyToken
,
userId
)
{
console
.
log
(
'주소 비활성화 됨.'
);
setting_SendAddress
[
setting_userId
.
indexOf
(
userId
)]
=
0
;
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"text"
,
"text"
:
"이제 유튜브 주소가 전송되지 않습니다!"
}
]
}
}
);
}
exports
.
check
=
function
(
message
,
replyToken
,
userId
)
{
if
(
setting_userId
.
indexOf
(
userId
)
==-
1
)
// 새로운 사용자가 이용할때, 설정 초기값 세팅
{
setting_userId
.
push
(
userId
);
setting_Thumbnail
.
push
(
1
);
setting_SendAmount
.
push
(
1
);
setting_SendAddress
.
push
(
1
);
console
.
log
(
"알림: 새로운 사용자가 발견됨"
);
}
var
choice
;
var
choose
;
switch
(
message
)
{
case
"플레이리스트"
:
PLAYLIST
(
replyToken
);
break
;
case
"도움말"
:
sendMessage
=
"- 기본적으로 찾고 싶은 음악을 입력하여 보내면 적절한 음악 영상을 찾아 추천해드립니다."
+
"\n"
+
"예시) 소녀시대 노래"
+
"\n"
+
"- '플레이리스트'를 입력하면 분류에 따라 엄선한 음악을 추천드립니다!"
+
"\n"
+
"- '설정'을 입력하면 썸네일 출력 여부, 추천 음악 개수(1~4), 유튜브 주소 전송 여부를 설정하실 수 있습니다."
+
"\n"
+
"- 이 도움말을 다시 보고 싶으시다면 '도움말'을 입력하시면 됩니다! 음악과 함께 좋은 하루 보내세요."
;
HELP
(
replyToken
,
sendMessage
);
break
;
case
"설정"
:
SETTINGS
(
replyToken
);
break
;
default
:
//일반 검색
var
optionParams
=
{
q
:
message
,
part
:
"snippet"
,
key
:
Info
.
YoutubeKey
,
maxResults
:
10
};
optionParams
.
q
=
encodeURI
(
optionParams
.
q
);
var
url
=
"https://www.googleapis.com/youtube/v3/search?"
;
for
(
var
option
in
optionParams
){
url
+=
option
+
"="
+
optionParams
[
option
]
+
"&"
;
}
//url의마지막에 붙어있는 & 정리
url
=
url
.
substr
(
0
,
url
.
length
-
1
);
request
(
url
,
function
(
err
,
res
,
body
){
var
title
=
[]
var
url2
=
[]
var
data
=
JSON
.
parse
(
body
).
items
;
for
(
var
content
in
data
)
{
title
.
push
(
data
[
content
].
snippet
.
title
);
url2
.
push
(
data
[
content
].
id
.
videoId
);
}
if
(
title
.
length
==
0
)
console
.
log
(
'검색된 동영상이 없습니다.'
);
else
SEND
(
replyToken
,
title
,
url2
,
setting_Thumbnail
[
setting_userId
.
indexOf
(
userId
)],
setting_SendAmount
[
setting_userId
.
indexOf
(
userId
)],
setting_SendAddress
[
setting_userId
.
indexOf
(
userId
)]);
});
}
}
\ No newline at end of file
...
...
index.js
View file @
1d79601
var
express
=
require
(
'express'
);
var
Info
=
require
(
'./Info'
);
const
request
=
require
(
'request'
);
const
fs
=
require
(
'fs'
);
const
path
=
require
(
'path'
);
const
HTTPS
=
require
(
'https'
);
const
domain
=
"2020105631.oss2021.tk"
const
sslport
=
23023
;
const
bodyParser
=
require
(
'body-parser'
);
const
TARGET_URL
=
'https://api.line.me/v2/bot/message/reply'
;
// var Info = require('./Info');
const
TARGET_URL
=
'https://api.line.me/v2/bot/message/reply'
var
app
=
express
();
app
.
use
(
bodyParser
.
json
());
<<<<<<<
HEAD
var
sad
=
require
(
'./video_sad'
);
=======
var
songs
=
require
(
'./check'
);
>>>>>>>
feature
/
YouTube_API
app
.
post
(
'/hook'
,
function
(
req
,
res
)
{
var
eventObj
=
req
.
body
.
events
[
0
];
...
...
@@ -26,10 +17,97 @@ app.post('/hook', function (req, res) {
// request log
console
.
log
(
'======================'
,
new
Date
(),
'======================'
);
send
(
eventObj
.
replyToken
,
message
.
text
);
res
.
sendStatus
(
200
);
});
function
send
(
replyToken
,
message
)
{
if
(
eventObj
.
type
==
"message"
)
// 일반 메시지일때
{
react
(
eventObj
.
replyToken
,
message
.
text
,
eventObj
.
source
.
userId
);
}
else
switch
(
eventObj
.
postback
.
data
)
{
case
"썸네일"
:
//설정에서 썸네일 설정버튼을 눌렀을때
songs
.
thumbnail_settings
(
eventObj
.
replyToken
);
break
;
case
"enablethumbnail"
:
//설정 -> 썸네일 설정 -> 활성화
songs
.
enablethumbnail
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"unablethumbnail"
:
//설정 -> 썸네일 설정 -> 비활성화
songs
.
unablethumbnail
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"개수"
:
//설정에서 전송 개수 설정버튼을 눌렀을때
songs
.
amount_settings
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"amount1"
:
//설정 -> 전송 개수 -> 1
songs
.
amount1
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"amount2"
:
//설정 -> 전송 개수 -> 2
songs
.
amount2
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"amount3"
:
//설정 -> 전송 개수 -> 3
songs
.
amount3
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"amount4"
:
//설정 -> 전송 개수 -> 4
songs
.
amount4
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"주소"
:
//설정에서 유튜브 주소 설정버튼을 눌렀을때
songs
.
address_settings
(
eventObj
.
replyToken
);
break
;
case
"enableaddress"
:
//설정 -> 주소 설정 -> 활성화
songs
.
enableaddress
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"unableaddress"
:
//설정 -> 주소 설정 -> 비활성화
songs
.
unableaddress
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"genre"
:
// 플레이리스트 -> 장르
songs
.
genre
(
eventObj
.
replyToken
);
break
;
case
"hiphop"
:
// 플레이리스트 -> 장르 -> 힙합
songs
.
hiphop
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"piano"
:
// 플레이리스트 -> 장르 -> 피아노
songs
.
piano
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"pop"
:
// 플레이리스트 -> 장르 -> 팝
songs
.
pop
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"mood"
:
// 플레이리스트 -> 무드
songs
.
mood
(
eventObj
.
replyToken
);
break
;
case
"exciting"
:
// 플레이리스트 -> 무드 -> 신남
songs
.
exciting
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"sad"
:
// 플레이리스트 -> 무드 -> 슬픔
songs
.
sad
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"singer"
:
// 플레이리스트 -> 가수
songs
.
singer
(
eventObj
.
replyToken
);
break
;
case
"blackpink"
:
// 플레이리스트 -> 가수 -> 블랙핑크
songs
.
blackpink
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"iu"
:
// 플레이리스트 -> 가수 -> 아이유
songs
.
iu
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"redvelvet"
:
// 플레이리스트 -> 가수 -> 레드벨벳
songs
.
redvelvet
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
case
"twice"
:
// 플레이리스트 -> 가수 -> 트와이스
songs
.
twice
(
eventObj
.
replyToken
,
eventObj
.
source
.
userId
);
break
;
}
res
.
sendStatus
(
200
);
}
);
function
react
(
replyToken
,
message
,
userId
)
{
request
.
post
(
{
...
...
@@ -37,16 +115,15 @@ function send(replyToken, message) {
},
function
()
{
songs
.
check
(
message
,
replyToken
);
songs
.
check
(
message
,
replyToken
,
userId
);
}
);
}
try
{
const
option
=
{
ca
:
fs
.
readFileSync
(
'/etc/letsencrypt/live/'
+
domain
+
'/fullchain.pem'
),
key
:
fs
.
readFileSync
(
path
.
resolve
(
process
.
cwd
(),
'/etc/letsencrypt/live/'
+
domain
+
'/privkey.pem'
),
'utf8'
).
toString
(),
cert
:
fs
.
readFileSync
(
path
.
resolve
(
process
.
cwd
(),
'/etc/letsencrypt/live/'
+
domain
+
'/cert.pem'
),
'utf8'
).
toString
(),
ca
:
fs
.
readFileSync
(
'/etc/letsencrypt/live/'
+
Info
.
domain
+
'/fullchain.pem'
),
key
:
fs
.
readFileSync
(
path
.
resolve
(
process
.
cwd
(),
'/etc/letsencrypt/live/'
+
Info
.
domain
+
'/privkey.pem'
),
'utf8'
).
toString
(),
cert
:
fs
.
readFileSync
(
path
.
resolve
(
process
.
cwd
(),
'/etc/letsencrypt/live/'
+
Info
.
domain
+
'/cert.pem'
),
'utf8'
).
toString
(),
};
HTTPS
.
createServer
(
option
,
app
).
listen
(
sslport
,
()
=>
{
...
...
video_sad.js
deleted
100644 → 0
View file @
d8b8bfa
var
Info
=
require
(
'./Info'
);
exports
.
check
=
function
(
message
,
replyToken
){
const
rand_0to9
=
Math
.
floor
(
Math
.
random
()
*
10
);
// 0~9까지 난수생성
var
ids
=
[
'p5iu1V30myk'
,
'i-SBnhaZSSU'
,
'Etfgb6A7hSI'
,
'IN2mml9xs_s'
,
// 모든 동영상 id를 관리하는 배열
'tp1uoFAfgHE'
,
'Qx22TnVVIfU'
,
'3y1QIqR115A'
,
'VXBI1wt8XII'
,
'aWMBn2--E0Q'
,
'HyTbgBlnLCo'
];
const
request
=
require
(
'request'
);
const
fs
=
require
(
'fs'
);
const
TARGET_URL
=
'https://api.line.me/v2/bot/message/reply'
var
{
google
}
=
require
(
'googleapis'
);
var
service
=
google
.
youtube
(
'v3'
);
service
.
videos
.
list
(
{
key
:
'AIzaSyBInggOtXxPFYIRee0Xs3vb5iZ9YE9_518'
,
part
:
'snippet'
,
id
:
ids
[
rand_0to9
],
// 동영상 Id random input
fields
:
'items(snippet(title))'
},
function
(
err
,
response
)
{
if
(
err
)
{
console
.
log
(
'The API returned an error: '
,
err
);
return
;
}
var
video
=
response
.
data
.
items
;
if
(
video
.
length
==
0
)
{
console
.
log
(
'검색된 동영상이 없습니다.'
);
}
else
{
sendMessage
=
JSON
.
stringify
(
response
.
data
.
items
[
0
].
snippet
.
title
);
console
.
log
(
sendMessage
);
request
.
post
(
{
url
:
TARGET_URL
,
headers
:
{
'Authorization'
:
`Bearer
${
Info
.
TOKEN
}
`
},
json
:
{
"replyToken"
:
replyToken
,
"messages"
:
[
{
"type"
:
"image"
,
"originalContentUrl"
:
"https://img.youtube.com/vi/"
+
ids
[
rand_0to9
]
+
"/hqdefault.jpg"
,
"previewImageUrl"
:
"https://img.youtube.com/vi/"
+
ids
[
rand_0to9
]
+
"/hqdefault.jpg"
},
{
"type"
:
"text"
,
"text"
:
sendMessage
}
]
}
}
);
}
}
)
}
Please
register
or
login
to post a comment