디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

이 쉽진않은데, 계속 쉽게쉽게 말씀하시는 분들이 계셔서

이참에 어느하나 쉬운게 없다는걸 알려 드리기 위하여,

끄적여 봅니다.

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

먼저, 유튭에 영상을 가져 오기 위하여

api를 사용합니다. (앱 프로그래밍 인터페이스)

https://developers.google.com/youtube/v3/guides/implementation/videos?hl=ko#videos-retrieve-related-videos

를 참고 하면 될껀데.

이걸 하려면 제약도 많고 너무 복잡합니다.

그래서 꼼수를 써 볼겁니다.

예로부터 인터넷이 느릴때에,

페이지 전체를 불러오기 위해서 많은 시간이 걸렸지만,

요약하면 좋겠다~ 라는 식으로 만든게.

RSS 라는 기능이 있습니다 (리치 사이트 써머리)

youtube 에서는 이걸 간편하게 제공을 하고 있습니다

https://www.ttmkt.com/kr/tools/youtube-rss-generator/

여기다, 채널 url 집어넣으면 되긴 하는데.

https://www.youtube.com/feeds/videos.xml?channel_id=

형식이라, ID넣으면 됩니다.

제가 평소 즐겨보는

템템버린 님의 유튜브 채널을 가져오도록 하겠습니다

채널 URL : https://www.youtube.com/channel/UCCA8UWUW80iHqK9ymdjRwPg

변환하면, https://www.youtube.com/feeds/videos.xml?channel_id=UCCA8UWUW80iHqK9ymdjRwPg

가 되겠네요.

들어가보면

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

많이 복잡합니다.

그전에, https://codebeautify.org/xmlviewer

이런 프로그램을 쓰면 쉽게 보입니다.

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

이렇게 구성되어있는데,

entry 에 데이터가 있습니다.

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

눈에 보이기 시작하죠.

media:title  제목

media:content  비디오 url

media:thumbnail 섬네일

media:description  내용

이제 뽑았으니,

코딩으로 하면 됩니다.

node 가 편하기에 실제 제작해 보겠습니다.

사용 라이브러리는, axios / xml2js 입니다.

===========================================

axios.get(`https://www.youtube.com/feeds/videos.xml?channel_id=${channel}`).then(({data})=>{

// 데이터 처리

}).catch(()=>{});//오류무시

===========================================

데이터를 불러옵니다.

이제 xml형태의 데이터를 분석하기에는 손이 너무 많이 가기에,

xml2js 를 사용하여 변환을 시켜줍니다.

parseString(data,function(err, xml){

if(err)return // 오류 무시

//xml 파싱된 데이터 처리

});

처리된 데이터는 xml로 들어오는데,

필요한 데이터만 변환하도록 하겠습니다.

parseString(data,function(err, {feed :{title : [channel_title], published : [published], entry}}){

데이터 구조가

xml > feed > 실 데이터 형식으로 되어있기에,

가져올때부터 구조분해문법으로 변환합니다.

(사실 오류를 처리 해야하는데, 캐치에서 rss 불러올때에 잡아뒀으니, 무시합니다)

channel_title : 채널제목

published : 업로드 시간이 되겠습니다

entry : 영상모음

이제 개별 영상을 던지면 됩니다.

던지기 전에,

봇 개발을 하는 입장이 아니기에, 봇이 없습니다.

그럼 방법이 없는거냐?

아닙니다. 방법은 있습니다.

서버에 채널을 만듭니다.

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

채널설정 -> 연동

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

에 가 보시면 "웹후크"라는 기능이 있습니다.

말하자면 웹에 거는 건데.

로그인 없이도 밖에서 채팅이 가능합니다.

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

만들기 하면 만들어 지는데,

url 복사하시면 됩니다.

https://discord.com/api/webhooks/{id값}/{토큰}

형식으로 제작이 됩니다.

이제,

데이터 준비되었고, 채널 준비되었으니

형식에 맞춰 던지면 됩니다.

웹훅에 맞춰 던지면 끝.

https://discord.com/developers/docs/resources/webhook#create-webhook

많이 복잡하지만,

파서 특성상, 배열로 집계가 되어,

배열을 단일 데이터로 바꾸는데에 길이가 좀 변경됩니다.

entry.forEach(({id : [id], "media:group" : [{"media:title" : [title], "media:content" : [{"$" : content}], "media:thumbnail" : [{"$" : thumbnail}]}]}) => {

const embed = {

                    title : title, // 제목

                    url : content.url, // 비디오 링크

                    image : {  ...thumbnail }, // 썸네일

                    author : { // 소유자

                        name : channel_title, // 이름

                        url : `https://www.youtube.com/channel/${channel}` // 채널

                    },

                }

로 만드시면 가장 좋을 것 같습니다.

이걸 이제,

웹훅으로 post 던지면 됩니다.

axios.post(`https://discord.com/api/webhooks/{id값}/{토큰}`, {

    embeds : [ embed ]

}).catch(()=>{});

실행후, 확인하시면,

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

이러한 형태로 메세지가 전송됩니다.

물론 중복처리 및 1시간에 한번씩 조회 하거나

실제 여러 사용자를 위하여 별도로 추가 처리가 필요합니다.

(실제 서비스에서 운용하려면 트래픽 처리와 요건을 많이 따져야 하는 상황이 아닐까...합니다.)

그럼 이만!

디스 코드 유튜브 연동 봇 - diseu kodeu yutyubeu yeondong bos

응애