PowerShell Invoke-WebRequest: 포괄적인 가이드

웹을 명령줄로 탐색해 본 적이 있나요? 음, 나도 없어요. 하지만 웹 페이지에서 정보를 가져오거나 웹 사이트를 모니터링하거나 자동화를 통해 정보를 제출해야 할 때가 있었는데, 그럴 때 저는 Invoke-Webrequest를 사용해요!

Invoke-WebRequest PowerShell cmdlet은 웹의 스위스 아미 나이프입니다. 이 cmdlet은 HTTP 파라미터와 같은 일반적인 것들과 함께 웹 서비스에 어떤 HTTP 동사를 보낼 수 있습니다. Invoke-WebRequest와 그 형제인 Invite-RestMethod는 웹 자동화를 해야 하는 경우 익숙해져야 하는 두 가지 PowerShell cmdlet입니다.

Invoke-WebRequest cmdlet은 Windows PowerShell과 PowerShell Core와 함께 제공되는 Microsoft.PowerShell.Utility 모듈의 일부입니다. 이 cmdlet은 PowerShell v3부터 포함되어 있으며 매우 강력하면서도 사용하기 쉽습니다.

Invoke-WebRequest를 사용함으로써 PowerShell을 통해 개발자는 다양한 방식으로 웹 사이트, 웹 서비스 및 REST API와 작업할 수 있습니다.

기본 사용법

가장 기본적으로, Invoke-WebRequest cmdlet은 URI 또는 URL과 같은 엔드포인트에 HTTP 요청 메서드를 보냅니다. 이 cmdlet은 모든 일반적인 요청 메서드를 지원합니다.

지금까지 가장 일반적인 방법은 GET 방법입니다. 이 방법은 웹 사이트에서 정보를 읽거나 REST API를 쿼리하는 등의 작업에 사용됩니다. 이 방법은 Method 매개변수를 사용하여 정의됩니다. 쿼리할 엔드포인트가 필요하기 때문에 URI도 필요합니다. 간단하게 하기 위해 아무 웹 사이트나 선택하겠습니다. TechSnips를 무심코 홍보하기 위해 techsnips.io를 선택하겠습니다.

아래에 최근에 게시된 모든 비디오 목록을 얻고 싶다고 가정해 보겠습니다.

Example webpage

I can get an HTML representation of this page by running Invoke-WebRequest -Uri 'https://techsnips.io' -Method GET. When I do this, Invoke-WebRequest downloads the entire web page and returns an output with various parsed information around the elements of the page.

Invoke-WebRequest response

비디오를 얻기 위해서는 조금 더 파고들어야 합니다. 링크 속성을 살펴보면 모든 비디오 링크가 아래와 같이 ng-binding 클래스를 가지고 있다는 공통점을 발견할 수 있습니다.

$result.Links | where {$_.class -eq ‘ng-binding’}

이를 알게 되면, 이러한 요소들을 모두 찾아 innerHTML 속성만 반환하면 됩니다. 그러면 완성!

$result.links | where {$_.class -eq ‘ng-binding’} | Select-Object innerHtml

Invoke-WebRequest를 사용하여 파일 다운로드

또한 Invoke-WebRequest를 사용하여 웹에서 파일을 다운로드할 수 있으며 매우 쉽습니다! Invoke-WebRequest를 파일의 URI를 가리키도록 하고 OutFile 매개변수를 사용하여 파일을 로컬 디스크에 저장하도록 cmdlet에 지시하면 파일을 다운로드할 수 있습니다.

예를 들어, 아래에서는 SysInternals Handle 유틸리티를 다운로드하고 다운로드한 후 zip 파일을 풀고 있습니다. 정말로 그렇게 간단합니다!

Invoke-WebRequest -Uri 'https://download.sysinternals.com/files/Handle.zip' -OutFile C:\handle.zi Expand-Archive -Path C:\handle.zip

양식 제출 및 세션 작업하기

우리는 Invoke-WebRequest를 사용하여 양식을 작성할 수 있습니다. 그러나 이를 위해 일반적으로 웹 세션과 함께 작업해야 합니다. HTTP는 본질적으로 상태 없는 프로토콜이며, 브라우저(이 경우 PowerShell)는 쿠키와 같은 것들을 추적하기 위해 사용될 세션을 생성할 수 있어야 합니다. 일반적인 양식은 로그인/비밀번호 양식이므로 가상 웹사이트에 로그인해 보겠습니다!

우리의 가상 로그인 양식이 URL http://somewebsite.com에 있다고 가정해 봅시다. 먼저 Invoke-WebRequest를 실행하여 HTML 구조를 다운로드하고 세션을 생성해야 합니다.

$response = Invoke-WebRequest -Uri 'http://somewebsite.com' -SessionVariable rb

이렇게 하면 응답에 Forms 속성이 포함되어 있어서 사용자 이름과 비밀번호를 채울 수 있습니다. 이 경우 사용자 이름은 user라는 필드로 나타내고 비밀번호는 password라는 필드에 있어야 합니다. 이는 웹페이지에 따라 다를 수 있습니다.

$form = $response.Forms[0]
$form.Fields["user"] = "username"
$form.Fields["password"] = "password"

양식이 채워지면, 세션을 재사용하고 방금 생성한 세션을 자동으로 사용하여 전송할 URI를 읽어들이기 위해 양식에 있는 Action 속성을 읽어들이기 위해 Invoke-WebRequest를 다시 사용할 수 있습니다(아래에 표시된 것처럼).

$response = Invoke-WebRequest -Uri $form.Action -WebSession $rb -Method POST

적절한 필드 이름을 모두 올바르게 입력하고 웹페이지가 특별한 작업을 수행하지 않는다면, $rb 웹 세션 내에 있는 사용자 이름과 비밀번호로 로그인할 수 있어야 합니다. 이 시점에서는 $rb 웹 세션 변수를 사용하여 해당 인증 뒤에 있는 다양한 페이지를 읽을 수 있습니다.

짧은 URI 해결

Invoke-WebRequest의 또 다른 훌륭한 사용 예는 짧은 URI를 해결하는 것입니다. 아마도 당신이 그 짧은 URL 뒤에 어떤 것이 있는지 알고 싶지만 클릭해서 알아내고 싶지는 않을 수도 있습니다! 문제 없습니다. Invoke-WebRequest를 사용하여 파싱된 응답에서 AbsoluteUri 속성을 읽을 수 있습니다!

아래에서는 UseBasicParsing 매개변수도 사용하고 있습니다. 기본적으로 Invoke-WebRequest는 인터넷 익스플로러(IE)를 사용하여 반환된 HTML을 파싱하려고 시도합니다. 하지만 IE가 없는 시스템에서는 작동하지 않습니다. 이를 해결하기 위해 UseBasicParsing 매개변수를 사용하여 내용을 여전히 다운로드하지만 가벼운 파싱만 수행할 수 있습니다.

$Url = 'buff.ly/2sWvPOH'
$Web = Invoke-WebRequest -Uri $Url -UseBasicParsing
$Web.BaseResponse.ResponseUri.AbsoluteUri

요약

Invoke-WebRequest cmdlet은 PowerShell과 함께 제공되는 가장 다용도 있는 cmdlet 중 하나입니다. 일반적인 그래픽 브라우저를 통해 수행할 수 있는 작업이 있다면 Invoke-WebRequest cmdlet도 수행할 수 있습니다. 이 cmdlet을 사용하는 예제는 REST API 모니터링에 대한 이 문서에서 확인할 수 있습니다.

Source:
https://adamtheautomator.com/invoke-webrequest/