NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    커스텀 엔지엠 RPA 매크로 - 구글 API를 이용한 유튜브 댓글 수집기 만들기. (Creating a YouTube comment …

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 커스텀 모듈을 사용하면 엔지엠 RPA 매크로의 기능을 사용하면서 추가적인 확장 액션을 만들 수 있습니다. 커스텀 모듈은 엔지엠 RPA 매크로에서 기본 제공되는 액션의 기능을 확장하거나 고유한 업무를 처리하는데 특화된 모듈을 만들 수 있습니다. 기존 스크립트에 커스텀 액션을 추가하여 좀 더 효율적이고 구현하기 어려운 기능을 직접 만들어서 사용할 수 있습니다. 다만, 어느정도 C# 프로그래밍 언어에 대한 이해가 필요하고 엔지엠소프트웨어에서 제공해주는 커스텀 모듈 만들기 가이드를 이해하고 코드를 분석할 수 있어야 합니다.

     

    구글 API를 이용한 유튜브 댓글 수집 액션을 만들기전에 구글에 회원 가입 후 API 사용에 대한 승인을 받아야 합니다. 먼저 구글에 회원 가입하고, 로그인 하세요. 아래 사이트에서 구글 API 프로젝트를 생성해야 합니다. 저는 이미 프로젝트를 만들어 두었으므로 아래와 같은 화면이 표시됩니다. 여러분들은 ngmsoft가 아닌 "프로젝트 선택"이 표시될겁니다.

    [ Google API Console ]

    p20nA1J.png

     

     

    이미 만들어둔 프로젝트가 있다면 그대로 사용해도 되고, ①새 프로젝트를 만들어도 됩니다. 새 프로젝트를 클릭하고, 지침에 따라 이름과 고유한 키등등... 설정하세요.

    SNucfHP.png

     

     

    프로젝트가 생성되었으면, 좌측에 라이브러리를 클릭하세요.

    Fr0CF7L.png

     

     

    검색창에 "youtube"를 입력하고, "YouTube Data API v3"를 클릭합니다.

    vVVC47b.png

     

     

    "사용"을 클릭하세요.

    mynha5i.png

     

     

    여러분들은 새로운 API를 발급 받기 위한 화면이 보일겁니다. API를 사용하는 플랫폼과 목적 그리고 사용자 인증 정보를 입력하면 API가 생성됩니다. 저는 이미 사용자 인증 정보를 확인할 수 있는 키를 생성했으므로 아래와 같은 화면이 표시됩니다. 여러분들도 API 인증 Key를 만들면 아래와 같은 정보를 확인할 수 있게됩니다. 참고로, 신청 후 몇분후에 인증키가 발급되며, 앞으로 YouTube Data API를 이용할 때 이 API 인증 키를 사용하면 됩니다. 인증 키이므로 외부에 노출되지 않게 주의해야 합니다. 일부 API는 일정 사용량이 넘어가면 요금 결제를 해야하기 때문입니다.

    FVWJI3Q.png

     

     

    커스텀 모듈을 만들기 위해 Visual Studio Community를 실행하세요. 그리고, 라이브러리 프로젝트를 추가해 줍니다. 프로젝트의 이름은 CustomGoogleAPI입니다.

    98KvWG7.png

     

     

    아래 그림과 같이 "솔루션 탐색기 (Ctrl+Alt+L)"에서 "CustomGoogleAPI" 프로젝트를 우클릭합니다. 표시되는 콘텍스트(Context) 메뉴에서 "NuGet 패키지 관리"를 클릭하세요.

    mXD1s2f.png

     

     

    찾아보기 탭에서 ①youtube를 검색하세요. 그리고, Google.Apis.YouTube.v3을 선택 후 우측에서 설치합니다.

    nXeb3c3.png

     

     

    안정적인 최신 버전으로 설치하세요.

    ocWrnNA.png

     

     

    클래스 이름도 YouTubeCommentModel로 변경해주세요. 엔지엠 RPA 매크로에서 커스텀 모듈을 사용하기 위해서는 몇가지 이름 규칙(Naming Rule)이 존재합니다. 엔지엠 에디터에서 커스텀 모듈을 사용하기 위해서는 모듈 이름이 Custom으로 시작해야 하고, 액션들은 모두 Model로 이름이 끝나야 합니다. 이 규칙은 그냥 외우세요~ ㅎㅎ; 이제 환경 구성의 마지막 NGM 커스텀 모듈 팩을 참조에 추가해줍니다. 커스텀 모듈 팩은 3개로 이루어져 있으며 엔터프라이즈 라이센스를 가진분은 관리자에게 요청해서 받아야 합니다.

    M1vQKjU.png

     

     

    자~ 이제 원하는 비디오의 댓글을 가져오기 위한 코딩을 해봅시다. 우선, 인터페이스를 상속 받고 아래와 같이 구현 해주세요.

    using Google.Apis.Services;
    using Google.Apis.YouTube.v3;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing.Design;
    using System.IO;
    
    namespace CustomGoogleAPI
    {
        public class YouTubeCommentModel : NGM.Models.Interface.BaseCustomToolModel
        {
            public override string DisplayCategory => "NGMsoftware";
    
            public override string DisplayName => "유튜브 댓글 퍼오기";
    
            public override void Execute()
            { }
        }
    }

     

     

    댓글(Comments, 코멘트)를 수집할 비디오 아이디를 알아야 합니다. 범용성을 위해 하드코딩하지 않고, 속성을 제공 해줍니다. 그리고, 가져올 댓글의 수도 사용자가 임의로 설정할 수 있도록 해줍니다. 또한, 수집된 댓글을 로컬 컴퓨터의 특정 위치에 정리해서 파일로 저장 해줍니다. 이 내용을 아래와 같이 속성 3개로 처리할 수 있습니다. 사용 편의성을 위해 엔지엠 프레임워크에서 제공하는 특성(Attribute)을 추가 해주세요.

            [Category("Action")]
            [DisplayName("비디오 아이디")]
            [Description("코멘트를 가져올 비디오의 아이디를 입력합니다.")]
            [Browsable(true)]
            [DefaultValue(null)]
            public string VideoID { get; set; }
    
            [Category("Action")]
            [DisplayName("결과 갯수")]
            [Description("결과 객수를 제한합니다.")]
            [Browsable(true)]
            [DefaultValue(10)]
            public int MaxResultLimit { get; set; } = 10;
    
            [Category("Action")]
            [DisplayName("파일 저장 위치")]
            [Description("결과를 저장할 파일의 위치를 선택하세요.")]
            [Browsable(true)]
            [DefaultValue(null)]
            [Editor(typeof(NGM.Models.TypeEditor.FolderSelectorEditor), typeof(UITypeEditor))]
            public string SaveFolderSelect { get; set; }

     

     

    마지막으로 엔지엠 에디터 또는 플레이어에서 실행할 때 동작하는 함수입니다. 코드를 이해하기 쉽게 주석을 달아두었으니 참고해주세요.

            public override void Execute()
            {
                var youtube = new YouTubeService(new BaseClientService.Initializer()
                {
                    // 자신의 API 키를 설정해줍니다. 
                    // 만약, 다른 사용자도 커스텀 모듈을 사용하게 하려면 속성으로 처리하세요.
                    ApiKey = "AIzaSyDorfWBc7-******************",
                    ApplicationName = "NGMsoftware"
                });
    
                // 유튜브에서 검색하려면 youtube.Search 함수를 이용할 수도 있습니다.
                // 댓글을 가져오려면 CommentThreads 함수를 사용하세요.
                var request = youtube.CommentThreads.List("snippet,replies");
    
                // 댓글을 수집할 비디오의 아이디입니다.
                // 엑셀로 정리한 비디오 아이디를 반복하면서 수집할수도 있습니다.
                request.VideoId = VideoID;
                request.MaxResults = MaxResultLimit;
    
                // 요청에 대해 수행 명령을 내립니다.
                var result = request.Execute();
    
                // 수집된 결과를 저장할 목록을 만듭니다.
                List<string> itemParserList = new List<string>();
    
                // 수집된 댓글을 보기 좋게(?) 정리해주는 루틴입니다.
                foreach (var item in result.Items)
                {
                    var snippet = item.Snippet.TopLevelComment.Snippet;
                    itemParserList.Add($"{snippet.TextDisplay}, {snippet.AuthorDisplayName}, {snippet.PublishedAt}, {snippet.LikeCount}");
                }
    
                // 파일로 저장해줍니다.
                File.WriteAllText(Path.Combine(SaveFolderSelect, "NGMsoftware.txt"), string.Join(Environment.NewLine, itemParserList));
            }

     

     

    아래는 전체 코드입니다.

    using Google.Apis.Services;
    using Google.Apis.YouTube.v3;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing.Design;
    using System.IO;
    
    namespace CustomGoogleAPI
    {
        public class YouTubeCommentModel : NGM.Models.Interface.BaseCustomToolModel
        {
            public override string DisplayCategory => "NGMsoftware";
    
            public override string DisplayName => "유튜브 댓글 퍼오기";
    
            [Category("Action")]
            [DisplayName("비디오 아이디")]
            [Description("코멘트를 가져올 비디오의 아이디를 입력합니다.")]
            [Browsable(true)]
            [DefaultValue(null)]
            public string VideoID { get; set; }
    
            [Category("Action")]
            [DisplayName("결과 갯수")]
            [Description("결과 객수를 제한합니다.")]
            [Browsable(true)]
            [DefaultValue(10)]
            public int MaxResultLimit { get; set; } = 10;
    
            [Category("Action")]
            [DisplayName("파일 저장 위치")]
            [Description("결과를 저장할 파일의 위치를 선택하세요.")]
            [Browsable(true)]
            [DefaultValue(null)]
            [Editor(typeof(NGM.Models.TypeEditor.FolderSelectorEditor), typeof(UITypeEditor))]
            public string SaveFolderSelect { get; set; }
    
            public override void Execute()
            {
                var youtube = new YouTubeService(new BaseClientService.Initializer()
                {
                    // 자신의 API 키를 설정해줍니다. 
                    // 만약, 다른 사용자도 커스텀 모듈을 사용하게 하려면 속성으로 처리하세요.
                    ApiKey = "AIzaSyDorfWBc7-******************",
                    ApplicationName = "NGMsoftware"
                });
    
                // 유튜브에서 검색하려면 youtube.Search 함수를 이용할 수도 있습니다.
                // 댓글을 가져오려면 CommentThreads 함수를 사용하세요.
                var request = youtube.CommentThreads.List("snippet,replies");
    
                // 댓글을 수집할 비디오의 아이디입니다.
                // 엑셀로 정리한 비디오 아이디를 반복하면서 수집할수도 있습니다.
                request.VideoId = VideoID;
                request.MaxResults = MaxResultLimit;
    
                // 요청에 대해 수행 명령을 내립니다.
                var result = request.Execute();
    
                // 수집된 결과를 저장할 목록을 만듭니다.
                List<string> itemParserList = new List<string>();
    
                // 수집된 댓글을 보기 좋게(?) 정리해주는 루틴입니다.
                foreach (var item in result.Items)
                {
                    var snippet = item.Snippet.TopLevelComment.Snippet;
                    itemParserList.Add($"{snippet.TextDisplay}, {snippet.AuthorDisplayName}, {snippet.PublishedAt}, {snippet.LikeCount}");
                }
    
                // 파일로 저장해줍니다.
                File.WriteAllText(Path.Combine(SaveFolderSelect, "NGMsoftware.txt"), string.Join(Environment.NewLine, itemParserList));
            }
        }
    }

     

    CustomGoogleAPI 프로젝트를 컴파일하세요. 아래 그림과 같이 프로젝트에서 우클릭 후 "다시 빌드"를 클릭하시면 됩니다.

    srgZm7a.png

     

     

    컴파일이 정상적으로 완료 되었으면, CustomGoogleAPI 프로젝트에서 우클릭 후 "파일 탐색기에서 폴더 열기"를 선택하세요.

    l6uhRx7.png

     

     

    bin/Debug 폴더로 이동하세요. 만약, Release 모드로 컴파일했다면 bin/Release 폴더로 이동해야 합니다. 가급적이면 배포시에는 Release로 컴파일하세요. 아래 그림과 같이 CustomGoogleAPI.dll이 있을겁니다. 이 라이브러리를 복사한 후 바탕화면에 붙여넣기하세요.

    rIbiL87.png

     

     

    엔지엠 에디터를 실행한 후 "관리자" 메뉴의 "도구 모듈 설치" 버튼을 클릭하세요. (아래 그림은 함수 모듈 설치지만, 도구 모듈 설치로 해야 합니다.)

    ySJp52M.png

     

     

    모듈이 정상적이라면 아래와 같이 설치 작업이 성공했다는 메시지를 표시합니다.

    baqVyFP.png

     

     

    사용자 도구 상자에 보면 추가한 모듈의 액션이 추가된 것을 확인할 수 있습니다. 새로운 스크립트를 생성하고, 액션을 추가하세요. 속성은 알아서 넣어줍니다.

    HaJSE1t.png

     

     

    스크립트를 실행하고, 바탕화면에 만들어진 NGMsoftware.txt 파일을 열어보세요. 아래 그림과 같이 댓글을 가져온것을 알 수 있습니다. 엑셀에 정리하는게 더 보기 좋을뻔 했습니다. 콤마로 구분해서 댓글과 작성자 그리고, 댓글이 받은 좋아요 수를 넣어줬는데요. 이렇게 봐서는 파악이 어렵군요~ 여러분들은 이보다 더 잘 만드실 수 있을겁니다.

    U8hYHRr.png

     

     

    여기서 테스트하지는 않았지만, 특정 키워드로 동영상을 검색할 수 있습니다. 검색된 동영상의 비디오 아이디로 반복하면서 댓글들을 수집할 수 있죠. 이렇게 수집된 댓글의 특정 키워드를 분석하면 어떤 관심사가 검색 키워드와 매칭되는지 분석할수도 있을겁니다. 또는 시간순으로 등록되는 댓글의 반응에 따라 2차적인 처리도 가능하기 때문에 잘 활용하면 여러가지 긍정적인 결과를 만들어 낼수도 있습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.