로그인 기능 - 1부 크롤링

크롤링은 웹 페이지를 그대로 가져와 거기서 데이터를 추출해 내는 행위이다. 주로 python에서 많이 사용되었다. C#에서도 크롤링을 사용할 수 있는데 Selenium이라는 라이브러리를 활용하면 할 수 있다. 이러한 크롤링 기능을 이용하여 웹페이지에서 로그인한 후 캐릭터 이미지와 닉네임 등 정보를 가져올 것이다.

1.Selenium 설치

우선 Selenium을 유니티에서 설치하려면 여러 과정을 거쳐 진행된다. 먼저, nuget 패키지를 유니티 엔진에 import 시켜야 된다.
nuget 패키지 설치
위의 링크로 들어가 설치한 폴더 그대로 Assets에 import하면 Nuget을 사용할 수 있게 된다. 이제 유니티 탭을 보면 NuGet 탭이 생길 것이다.

< NuGet tab(형광색) >
이제 이 NuGet을 누르고 Manage NuGet Packages를 누르면 아래와 같은 창이 뜨게 된다.

< Manage NuGet Packages >
이제 Installed tab을 누르고 Selenium에 필요한 Packag들을 설치하면 된다.

* Selenium.WebDriver

* Selenium.Support

* Selenium.WebDriver.ChromeDriver

* DotNetSeleniumExtras.WaitHelpers

위 항목들을 모두 설치하여 준다.

2.크롤링 code

먼저 지시문을 사용하여 Selenium을 사용할 수 있게 한다.

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System.Threading;
using System.Net;

다음으로 로그인을 할 code 전체를 살펴보면

    bool IsElementPresent(IWebDriver _driver, By _by) //driver에서 필요한 정보가 존재 하는가 확인
    {
        try
        {
            _driver.FindElement(_by);
            return true;
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }
    public string _name;
    public void login()
    {
        ChromeOptions options = new ChromeOptions(); // 크롤링할 때의 옵션 설정
        options.AddArguments(new List<string>()
            {
                  "no-sandbox", // 크롤링 중 크롬 창이 뜨지 않게 
                  "headless" // 크롤링 중 크롬 창이 뜨지 않게 
            });
        using (IWebDriver driver = new ChromeDriver(@"C:\test_nexon_maplestory_battle_monsters_league\Assets\Packages\Selenium.WebDriver.ChromeDriver.94.0.4606.6100/driver/win32", options)) // 크롬 드라이버 설정(최신 버전)
        {
            driver.Url = "https://nxlogin.nexon.com/common/login.aspx?redirect=https%3A%2F%2Fmaplestory.nexon.com%2FHome%2FMain"; //크롤링 하려는 url 
            IWebElement email = driver.FindElement(By.Id("txtNexonID")).SendKeys(id.text); // e-mail 입력란에 InputField 정보 입력
            driver.FindElement(By.Id("txtPWD")).SendKeys(pw.text); // password 입력란에 InputField 정보 입력
            driver.FindElement(By.XPath("//" + "*[@id=\"nexonLogin\"]/fieldset/div[4]/button")).Click(); // 로그인 버튼 클릭
            Thread.Sleep(1000); // 로그인 하는 시간을 기다리기 위해 1초 대기
            if (check.isOn == true) //자동 로그인이 check 되어 있으면 계정 정보를 PlayerPrefs에 저장
            {
                PlayerPrefs.SetString("nexon_id", id.text);
                PlayerPrefs.SetString("nexon_pw", pw.text);
                Debug.Log(PlayerPrefs.GetString("nexon_id"));
                Debug.Log(PlayerPrefs.GetString("nexon_pw"));
            }
            if (IsElementPresent(driver, By.ClassName("login_id"))) // 로그인에 성공하였으면 "login_id"라는 ClassName이 존재
            {
                PlayerPrefs.SetString("nexon_id", id.text); // 메인 scene에 필요한 정보이므로 저장
                _name = driver.FindElement(By.ClassName("login_id")).FindElement(By.CssSelector("a")).Text.Trim(); // 캐릭터 이름 가져오기
                Thread.Sleep(1000); // 대기 
                string url = driver.FindElement(By.ClassName("login_char")).FindElement(By.TagName("img")).GetAttribute("src"); //캐릭터 사진을 저장하기 위한 url
                string ser_url = driver.FindElement(By.ClassName("login_after_id")).FindElement(By.TagName("img")).GetAttribute("src"); //서버 사진
                driver.Close(); // 필요한 정보를 모두 가져왔으니 Chromedriver 종료
                using (WebClient client = new WebClient())
                {
                    client.DownloadFile(new Uri(url), @"C:\nexon_maplestory_battle_monsters_league_s\Assets\cashe\mychar.png"); // url에서 이미지를 내 프로젝트에 저장
                }
                using (WebClient client = new WebClient())
                {
                    client.DownloadFile(new Uri(ser_url), @"C:\nexon_maplestory_battle_monsters_league_s\Assets\cashe\mychar_server.png");
                }
                Thread.Sleep(1000); // 대기
                successpanel.SetActive(true); //로그인 성공 패널 띄우기
                nametext.text = _name; //성공 패널의 캐릭터 이름 넣기
                PlayerPrefs.SetString("charname", _name); //캐릭터 닉네임 저장
                PlayerPrefs.SetString("nexon_view_id", id.text);
                login_panel.SetActive(false);
            }
            else // 로그인 실패
            {
                StartCoroutine(LoginFail(panel));
                driver.Close();
            }
        }
    }

위와 같은 방법으로 크롤링을 통해 넥슨 계정을 로그인하고 여러 정보를 가져올 수 있다.