NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 셀레니움 없이 웹업무를 자동화 하는 방법.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 셀레니움을 사용하면 대부분의 웹업무를 자동화 할 수 있습니다. 하지만, 일부 인터넷 환경에서는 셀레니움을 사용할 수 없는 경우들이 있는데요. 이런 경우에는 어쩔 수 없이 직접 코딩해야 합니다. 엔지엠 매크로에는 사용자가 액션을 만들어서 사용할 수 있는 커스텀 액션 기능이 포함되어 있습니다. C# 또는 파이썬 코딩을 할 수 있다면 모듈화해서 엔지엠 매크로에 추가해서 사용할 수 있습니다.

    [ 커스텀 액션 제작 가이드 ]

     

    Visual Studio를 설치하고, C# 개발 환경을 만듭니다. 저는 윈도우 바탕화면에 새로운 솔루션을 하나 추가했습니다. 프로젝트는 콘솔입니다. 콘솔 프로젝트를 만들면 기본적으로 아래와 같이 Program.cs 파일이 하나 만들어집니다.

    kyto7eQ.jpg

     

     

    Program.cs 파일을 더블 클릭하면 소스가 표시됩니다. WinForm이나 WPF를 사용해도 되지만, 간단한 테스트라서 콘솔 프로그램으로 만들었습니다. 기본 참조 라이브러리의 목록은 아래와 다를 수 있습니다. 필요할 때 추가하면 되므로 크게 신경쓰지 않아도 됩니다.

    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Net.Http;
    using System.Net.WebSockets;
    using System.Security.Policy;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
        internal class Program
        {
            static void Main(string[] args)
            {
    
            }
        }
    }

     

    웹브라우저를 실행하기 위해 Process를 사용합니다. 엔지엠 매크로에는 [ 커멘드 ]라는 액션으로 제공되고 있습니다. 아무튼, 크롬 또는 엣지 웹브라우저를 실행하기 위해 아래와 같은 비동기 함수(Method: 메소드)를 하나 정의 했습니다.

    public static async void Start()
    {
    
    }

     

    아래는 크롬 웹브라우저를 디버깅 모드로 실행하는 코드입니다. node.js를 사용하면 자동으로 처리되는 기능들도 직접 만들어야 하는 불편함이 있습니다^^;

    참고로, 크롬 웹브라우저가 설치된 위치는 사용자마다 다를 수 있습니다. 경로는 자신의 컴퓨터 환경에 맞게 수정하세요.

    Process process = new Process();
    process.StartInfo.FileName = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
    process.StartInfo.Arguments = "--allow-insecure-localhost --remote-debugging-port=9999";
    process.Start();

     

    제어하려는 대상(웹사이트 또는 웹앱)이 https라면 아래 옵션을 적용해야 합니다. localhost에서 암호화키(SSL/TLS)를 확인하지 않고 통과시켜줍니다. 만약, 이 옵션을 사용하지 않으려면 https 공인 인증 기관에서 인증서를 발급 받아서 별도의 처리를 해야 합니다. 보통 개발 단계에서는 SSL 인증서를 사용하는데요. crt나 cer 파일을 openssl과 mkcert를 사용해서 처리합니다.

    • --allow-insecure-localhost
    • --remote-debugging-port=<중복되지 않는 포트 번호>

     

    웹소켓으로 연결할 주소는 http://localhost:9999입니다. 위의 디버그 포트와 동일해야 합니다. while문은 크롬 브라우저의 정보를 가져오기 위한 반복기입니다. 브라우저 정보는 디버거에 연결한 후 json을 요청하면 보안, 확장, 탭등등의 정보를 가져올 수 있습니다.

    [ 엔지엠 매크로에서 웹브라우저의 정보 확인하는 방법 ]

    string webSocketUrl = "http://localhost:9999";
    DebugData[] debugDatas = null;
    
    while (true)
    {
        string json = await GetJsonFromUrl($"{webSocketUrl}/json");
        debugDatas = JsonConvert.DeserializeObject<DebugData[]>(json);
    
        if (debugDatas != null )
            break;
    
        System.Threading.Thread.Sleep(1000);
    }

     

    프로그램을 실행하면 아래와 같은 내용을 확인할 수 있습니다. 여기서 중요한 정보는 page(탭)입니다. 실제로 사용자에게 보여지는 페이지에서 모든 작업을 수행해야 합니다. 만약, 동시 다발적으로 자동화 매크로를 만든다면 각각의 탭 세션 정보를 글로벌하게 유지할 수 있게 해야 합니다. 보통은 목록(Array or List)에 담아두고 아이디를 비교하면서 처리해야 합니다. 연속된 루틴은 탭의 유니크한 아이디를 계속 유지해야 연속성을 가질 수 있습니다.

    wdck3Ar.png

     

     

    debugPages는 여러가지 디버그 데이타에서 페이지만 추출하여 담아놓은 배열입니다. 지금은, 탭이 하나만 담겨 있습니다. 그리고, 유니크한 탭 아이디를 모두 저장 해줍니다.

                DebugData[] debugPages = debugDatas.Where(w => w.Type == "page").ToArray();
                string[] pageIDs = debugPages.Select(s => s.Id).ToArray();

     

    저는 현재 5개의 탭이 열려 있습니다.

    7Xq5vyf.jpg

     

     

    지금 유튜브를 틀어놓고 글을 작성하고 있기 때문에 마지막 page의 정보가 유튜브로 나옵니다. 기본적으로 제공되는 정보들은 모두 자동화 매크로에 필요한 내용들입니다. 페이지를 이동할 때마다 바뀌는 Title을 비교하여 정상적으로 이동했는지 또는 내가 원하는 로케이션인지 판단할 수 있습니다. 그리고, 탭을 닫지 않는 이상 Id는 유지되므로 소켓 연결을 유지할 수 있습니다. 이 때 중요한 내용이 WebSocketDebuggerUrl입니다.

    XpMUdEX.jpg

     

     

    웹소켓으로 탭페이지에 연결되었는지 체크합니다.

                try
                {
                    await webSocket.ConnectAsync(new Uri(debugPages.First().WebSocketDebuggerUrl), CancellationToken.None);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
    
                if (webSocket.State != WebSocketState.Open)
                {
                    Console.WriteLine("탭 페이지를 찾을 수 없습니다.");
                    return;
                }

     

    크롬 데브툴 프로토콜을 사용하기 위해 아래 내용을 어느정도 숙지하고 있어야 합니다. 또는 주소를 저장해놓고, 필요할 때마다 열람하면서 개발을 이어 나가세요. 웹개발을 오래 하신 분들은 아래 내용만 봐도 어떤것들을 개발할 수 있는지 감이 오실겁니다. 슬롯이나 선착순, 예매, 응모, 부킹등등... 다양한 곳에 활용할 수 있습니다.

    [ Chrome DevTools Protocol ]

     

    아래와 같이 웹소켓으로 크롬 개발자 도구에 메소드와 파라메터를 전달하세요. SyntaxChrome DevTools Protocol 페이지를 참고하시면 됩니다. 메소드는 Page.navigate이므로 페이지를 이동한다는 뜻입니다. 그리고, params로 Json 형식의 오브젝트를 넘겨주는데요. url은 Required고 나머지 옵션들은 Optional입니다. 그래서, url 하나만 넘겨도 메소드를 실행하는데 아무런 문제가 발생하지 않습니다.

                    var request = new
                    {
                        id = Interlocked.Increment(ref _requestID),
                        method = "Page.navigate",
                        @params = new
                        {
                            url = "https://naver.com"
                        }
                    };

     

    웹소켓에 ArraySegment를 전달하기 위해 아래와 같이 제이슨 오브젝트를 바이트 배열로 변환 해줍니다.

                    string requestJson = JsonConvert.SerializeObject((object)request);
                    byte[] requestBytes = Encoding.UTF8.GetBytes(requestJson);
                    await webSocket.SendAsync(new ArraySegment<byte>(requestBytes), WebSocketMessageType.Text, true, CancellationToken.None);

     

    이제 완성된 웹 업무 자동화 매크로 프로그램을 실행 해볼까요? 프로그램을 빌드하고, exe 실행 파일을 더블 클릭해보세요. exe 파일은 빌드된 폴더 안에 있습니다. 아래 동영상과 같이 크롬 웹브라우저가 실행되고, 자동으로 네이버 페이지가 열리는걸 확인할 수 있습니다.

     

     

    생각보다 웹업무 자동화 매크로를 제작하는게 어렵지는 않습니다. 하지만, 멀티 환경으로 실행할 때는 각각의 브라우저 세션별로 유지하면서 간섭이 없도록 만드는게 중요합니다. 이 부분이 어렵기도 하고요. 일반적으로 컴퓨터 리소스는 남는데 가벼운 프로그램 하나만 돌리기에는 낭비가 많습니다. 가능하면 컴퓨터의 리소스를 최대한 활용하는게 좋을겁니다. 하지만, 윈도우 환경에서는 어느정도 제약이 따르기 때문에 자바를 이용하거나 파이썬 또는 리액트를 이용해서 서버 사이드에서 실행하는게 효율적입니다^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.