[VB.NET] 차근차근 크롬 브라우저 만들기 - 2. 페이지 이동

2023. 2. 7. 09:00VB.NET/Chrome Browser

지난 강좌에서 잠깐 언급했듯 어찌됐건 브라우저가 하는 일은 원하는 주소지를 찾아가는 것이다. 주소 입력후 이동하는 기능만 넣어도 브라우저 기능의 70% 이상은 완성됐다고 봐도 무방하다. 물론 이게 가능한건 크롬이 제공한 ChromiumWebBrowser 라는 컨트롤이 있으니 손쉽게 구현이 가능한것이긴 하지만 말이다.

덧붙여서 이번 강좌에서는 상대방 서버에서 진짜 크롬브라우저처럼 인식하도록 User Agent를 변경하는 방법도 간략히 소개하고 넘어가도록 하겠다.

TextURL의 KeyPress 이벤트와 ButtonNavigate의 Click 이벤트에 각각 아래 소스를 추가하고 실행하자.

Private Sub TextURL_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextURL.KeyPress
    If e.KeyChar = vbCr Then
        BrowserMain.LoadUrl(TextURL.Text)
    End If
End Sub

Private Sub ButtonNavigate_Click(sender As Object, e As EventArgs) Handles ButtonNavigate.Click
    BrowserMain.LoadUrl(TextURL.Text)
End Sub

실행후 주소창에 https://www.naver.com 을 입력한 후 엔터를 치면 화면이 아래와 같이 나와야 정상

브라우저로 네이버에 접속

잘 된다. 이제 User-Agent를 살펴보자.


주소창에 https://www.abiks.co.kr/?p=54654 을 입력후 엔터를 치면 현재 브라우저의 User-Agent가 아래와 같이 나온다.

내 브라우저의 User-Agent

하지만, 직접 크롬 브라우저를 띄워서 위 주소를 접속해보면 실제 크롬 브라우저의 User-Agent는 아래와 같다.

구글 크롬의 User-Agent

얼핏 보면 비슷하지만 살짝 다르다. 어디가 어떻게 다른지는 중요치 않다. 서로 다르다는게 중요하다. 내 PC에 있는 내 크롬 브라우저가 서로 User-Agent가 다르면 상대 서버측에서는 다른 브라우저로 인식하니 이를 크롬브라우저와 동일하게 맞춰줄 필요가 있다. 위 2개의 User-Agent를 복사해서 아래에 붙여넣어봤다. 같이 붙여놓으니 큰 차이점은 없지만 윈도우버전과 64비트가 약간 다른걸 확인할 수 있다.

내 브라우저 

- Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
구글 크롬

- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
              
자. 이제 내 브라우저의 User-Agent를 크롬브라우저의 User-Agent와 동일하게 맞춰주자. 물론 크롬의 User-Agent를 내것과 동일하게 맞추는 방법도 있지만, 이건 별 의미가 없으니 건너뛰고 내껄 바꿔보자. 그런데 여기서 한가지 문제가 발생했다.

User-Agent를 수정하기 위해서는 ChromiumWebBrowser의 설정을 변경해야 되는데 순서가 설정 변경후 브라우저를 생성해야 된다. 그래서 부득이하게 디자인 모드에서 Form에 추가했던 ChromiumWebBrowser를 삭제하고 Form_Load 이벤트를 비롯해 전체 소스를 아래와 같이 변경하도록 하자.

Imports CefSharp
Imports CefSharp.WinForms

Public Class FormBrowser

    Private WithEvents BrowserMain As CefSharp.WinForms.ChromiumWebBrowser = Nothing

    Private Sub FormBrowser_Load(sender As Object, e As EventArgs) Handles Me.Load

        Dim cfsettings As New CefSettings With {
            .UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
            .Locale = "ko-KR"}
        Cef.Initialize(cfsettings)

        BrowserMain = New CefSharp.WinForms.ChromiumWebBrowser(TextURL.Text) With {.Dock = DockStyle.None, .Visible = False}
        Me.Controls.Add(BrowserMain)
        Call Resize_Browser()
BrowserMain.Visible = True
        Randomize()
    End Sub

    Private Sub FormBrowser_Resize(sender As Object, e As EventArgs) Handles Me.Resize
        ButtonNavigate.Left = Me.Width - ButtonNavigate.Width
        TextURL.Width = ButtonNavigate.Left
        If BrowserMain IsNot Nothing Then Call Resize_Browser()
    End Sub

    Private Sub TextURL_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextURL.KeyPress
        If e.KeyChar = vbCr Then
            BrowserMain.LoadUrl(TextURL.Text)
        End If
    End Sub

    Private Sub ButtonNavigate_Click(sender As Object, e As EventArgs) Handles ButtonNavigate.Click
        BrowserMain.LoadUrl(TextURL.Text)
    End Sub

    Private Sub Resize_Browser()
        BrowserMain.Width = Me.Width
        BrowserMain.Height = Me.Height - TextURL.Top - TextURL.Height
    End Sub

End Class

뭔가 많이 바뀌긴 했지만 차근차근 풀어가보자.

Line 1 : Imports CefSharp
Line 2 : Imports CefSharp.WinForms

ChromiumWebBrowser를 코딩으로 생성하고 설정하기 위해 Imports 해준다.

Line 4 : Private WithEvents BrowserMain As CefSharp.WinForms.ChromiumWebBrowser = Nothing

기존에 디자인모드에서 추가했던 BrowserMain을 코딩으로 추가해준다. 선언시 기본값을 Nothing으로 명시적으로 할당해서 Form_Resize의 오류를 피하도록 하자.

Line 6 ~ 8
Dim cfsettings As New CefSettings With {
    .UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
    .Locale = "ko-KR"}

여기가 이번 User-Agent 관련해서는 메인이다. CefSettings 형으로 변수를 선언해서 UserAgent를 원하는 문자열로 변경할 수 있다. 문자열을 직접 입력하는 방식이기 때문에 크롬뿐만 아니라 익스플로러나 오페라등 다른 브라우저 혹은 다른 OS의 UserAgent로도 변경이 가능하다.
여기에 CefSettings 선언시 설정할 수 있는 값들이 엄청나게 많은데 이건 따로 강좌를 하나 파서 진행해볼 계획이다. Locale 속성은 이것도 그냥 습관적으로 해주는 건데, 혹시 us, en 등으로 국가가 설정될 수 있으니 확실하게 한국으로 못을 박는것이다.
여기서 재밌는거 하나 보면 예전 VB에는 없던 With 문이다. 변수를 선언하면서 동시에 초기화하는 구문으로 아주 유용하게 사용되는 구문이니 이번기회에 알아두도록 하자. 뭐... 웬만하면 이미 알고들 있겠지만...

Line 9 : Cef.Initialize(cfsettings)

위 설정한 cfsettings 값을 Cef에 등록해서 브라우저에 반영한다.

Line 10 : BrowserMain = New CefSharp.WinForms.ChromiumWebBrowser(TextURL.Text) With {.Dock = DockStyle.None, .Visible = False}

ChromiumWebBrowser인 BrowserMain을 메모리에 할당한다. 생성자에 URL을 직접 입력하면 되고(여기서는 TextRUL.Text), 속성도 각각 설정하면 된다. 기존 디자인모드에서 설정한 속성을 여기서 설정하면 된다. 여기서 Visible 속성을 False로 준 이유는 브라우저를 메모리에 할당하고 초기화하고 크기조절 하는동안 화면이 지저분하게 보이는 문제를 방지하기 위해서이다. 작업 완료후 다시 True로 바꿔주면 된다.

Line 11 : Me.Controls.Add(BrowserMain)

디자인모드를 유독 싫어하거나 혹은 코딩으로 각종 컨트롤을 다루는게 더 좋은 사람이면 꼭 알아야 할 구문이다. 내 폼(Me)에 지금 생성한 브라우저(BrowserMain)을 추가하는 구문

Line 12 : Call Resize_Browser()

아래쪽에 새로 추가한 브라우저 크기변경 함수

Line 13 : BrowserMain.Visible = True

위 Line 10에서 설명한대로 브라우저 관련 작업을 모두 마쳤으니 이제 화면에 보여주자.

이외에는 Form_Resize가 살짝 변했으니 위 소스를 그냥 참고하면 될것이다.

이번강좌 처음에는 디자인모드롤 브라우저를 추가했지만, 결국 원하는 기능을 차근차근 추가하기 위해서는 결국 코딩으로 브라우저를 추가해야 한다는 사실을 배웠다.

 

완성됐으면 실행후 위 주소를 접속해서 실제 UserAgent가 변경됐는지 확인해보자. 아래와 같이 크롬브라우저와 동일하게 나오면 성공한것이다.

UserAgent가 변경된 브라우저

브라우저를 다루려면 정말 신경써야 될 다양한 상황들이 많은데 발생 가능한 상황을 하나씩 해결해나가며 강좌를 진행할 예정이다.

반응형