이 쉽진않은데, 계속 쉽게쉽게 말씀하시는 분들이 계셔서 이참에 어느하나 쉬운게 없다는걸 알려 드리기 위하여, 끄적여 봅니다. 먼저, 유튭에 영상을 가져 오기 위하여 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 가 되겠네요. 들어가보면 많이 복잡합니다. 그전에, https://codebeautify.org/xmlviewer 이런 프로그램을 쓰면 쉽게 보입니다. 이렇게 구성되어있는데, entry 에 데이터가 있습니다. 눈에 보이기 시작하죠. 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 : 영상모음 이제 개별 영상을 던지면 됩니다. 던지기 전에, 봇 개발을 하는 입장이 아니기에, 봇이 없습니다. 그럼 방법이 없는거냐? 아닙니다. 방법은 있습니다. 서버에 채널을 만듭니다. 채널설정 -> 연동 에 가 보시면 "웹후크"라는 기능이 있습니다. 말하자면 웹에 거는 건데. 로그인 없이도 밖에서 채팅이 가능합니다. 만들기 하면 만들어 지는데, 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(()=>{}); 실행후, 확인하시면, 이러한 형태로 메세지가 전송됩니다. 물론 중복처리 및 1시간에 한번씩 조회 하거나 실제 여러 사용자를 위하여 별도로 추가 처리가 필요합니다. (실제 서비스에서 운용하려면 트래픽 처리와 요건을 많이 따져야 하는 상황이 아닐까...합니다.) 그럼 이만! 응애 |