ค้นหาเว็บไซต์

PowerShell เรียกใช้-Webrequest | คำขอเว็บอัตโนมัติสำหรับ API


คำจำกัดความของ PowerShell เรียกใช้-Webrequest

ใน PowerShell Inrigg-WebRequest cmdlet ซึ่งเป็นส่วนหนึ่งของ Microsoft.PowerShell.Utility Module เป็นหนึ่งในวิธีการทำลายเว็บ (อีกวิธีหนึ่งคือ Invivo-RestMethod และใน cmd และระบบปฏิบัติการอื่นเรียกว่า CURL) ซึ่งจะส่ง HTTP และคำขอ HTTPS ไปยังหน้าเว็บหรือ URI ที่ร้องขอ ซึ่งเรียกว่าปลายทาง และดึงข้อมูล ลบ อัปเดตเนื้อหาในรูปแบบของส่วนหัว รูปภาพ ลิงก์ และองค์ประกอบสำคัญ HTML อื่น ๆ และสำหรับการใช้วิธีการหลายวิธี เช่น GET, POST, PUT DELETE ฯลฯ เพื่อส่งคำขอ แก้ไขเนื้อหา หรือลบเนื้อหาของหน้าเว็บ เป็นที่ทราบกันดีว่า Invivo-WebRequest สามารถทำงานร่วมกับ REST API ได้

ไวยากรณ์:

Invoke-WebRequest

[-UseBasicParsing]
[-Uri] <Uri>
[-WebSession <WebRequestSession>]
[-SessionVariable <String>]
[-AllowUnencryptedAuthentication]
[-Authentication <WebAuthenticationType>]
[-Credential <PSCredential>]
[-UseDefaultCredentials]
[-CertificateThumbprint <String>]
[-Certificate <X509Certificate>]
[-SkipCertificateCheck]
[-SslProtocol <WebSslProtocol>]
[-Token <SecureString>]
[-UserAgent <String>]
[-DisableKeepAlive]
[-TimeoutSec <Int32>]
[-Headers <IDictionary>]
[-MaximumRedirection <Int32>]
[-MaximumRetryCount <Int32>]
[-RetryIntervalSec <Int32>]
[-Method <WebRequestMethod>]
[-Proxy <Uri>]
[-NoProxy]
[-CustomMethod <String>]
[-ProxyCredential <PSCredential>]
[-ProxyUseDefaultCredentials]
[-Body <Object>]
[-Form <IDictionary>]
[-ContentType <String>]
[-TransferEncoding <String>]
[-InFile <String>]
[-OutFile <String>]
[-PassThru]
[-Resume]
[-SkipHttpErrorCheck]
[-PreserveAuthorizationOnRedirect]
[-SkipHeaderValidation]
[<CommonParameters>]

วิธีการ Invoke-WebRequest ทำงานอย่างไรใน PowerShell

ตั้งแต่ PowerShell v3.0 เป็นต้นไป PowerShell ได้เพิ่ม cmdlet Inrigg-WebRequest ซึ่งมาพร้อมกับโมดูล Microsoft.PowerShell.Utility เพื่อทำงานกับ WebPages เราสามารถดึงข้อมูล ลบ หรืออัปเดตเนื้อหาของหน้าเว็บโดยใช้ PowerShell เห็นได้ชัดว่านี่จะไม่ใช่ประสบการณ์เดียวกับการนำทางเพจโดยใช้ GUI แต่เป็นการทำให้คำขอของเว็บเป็นแบบอัตโนมัติและกำจัดการเรียกดูที่น่าเบื่อและงานที่ต้องทำเองทุกวัน

Invivo-WebRequest ส่งคำขอไปยัง URI (Uniform Resource Identifier) ซึ่งเรียกอีกอย่างว่า Endpoint และดึงข้อมูลจากเว็บเพจ ใช้งานได้โดยตรงกับ URL หรือกับ REST API เนื่องจากบางเว็บไซต์อนุญาตให้แก้ไขเนื้อหาโดยใช้ API เท่านั้น

เมื่อเราทำงานกับ API ข้อมูลเอาต์พุตโดยทั่วไปจะอยู่ในรูปแบบ JSON หรือ XML ตัวอย่างเช่น,

https://yts.mx/api/v2/list_movies.json

หรือ

https://yts.mx/api/v2/list_movies.xml

ในกรณีข้างต้น เมื่อดึงเนื้อหาแล้ว เราสามารถแปลงเนื้อหาเป็นวิธี JSON หรือ XML โดยใช้ PowerShell

ตัวอย่าง

ให้เราหารือเกี่ยวกับตัวอย่างของ PowerShell Inrigg-Webrequest

ก. เรียกใช้ WebRequest เพื่อดึงข้อมูลจากเว็บเพจ

เราสามารถจัดเตรียม URI เพื่อดึงเนื้อหาจากหน้าเว็บได้ มีคุณสมบัติเนื้อหาและ RawContent และคุณสามารถใช้คุณสมบัติเหล่านั้นเพื่อดึงข้อมูลได้ ขึ้นอยู่กับหน้าเว็บและประเภทของข้อมูลที่เรากำลังดึงข้อมูล ข้อมูลสามารถอยู่ในรูปแบบ HTML หรือสามารถอยู่ในรูปแบบ JSON หรือ XML

$req = Invoke-WebRequest -Uri https://theautomationcode.com/feed/
$req

เมื่อคุณเรียกใช้คำสั่งข้างต้น คุณจะเห็นคุณสมบัติต่างๆ เช่น StatusCode, StatusDescription, Content, RawContent, Forms, Headers, Images, InputFields, Links, ParsedHtml, RawContentLength เป็นต้น

คุณยังสามารถตรวจสอบคุณสมบัติของคำสั่งนี้ได้โดยใช้คำสั่ง Get-Member

$req | gm -MemberType Properties

เอาต์พุต:

หากต้องการดึงเนื้อหา

$req = Invoke-WebRequest -Uri "https://theautomationcode.com/feed/"
$req.Content

ข. เรียกใช้ WebRequest เพื่อตรวจสอบรหัสสถานะเว็บไซต์

เมื่อไคลเอนต์ส่งคำขอไปยังปลายทาง สถานะ Handshake จะส่งพร้อมรหัสสถานะต่างๆ ซึ่งแสดงความพร้อมใช้งานของเว็บไซต์หรือข้อผิดพลาดใดๆ บนหน้าเว็บ

คุณสามารถค้นหารหัสต่างๆ พร้อมข้อความสถานะได้ที่ลิงค์ด้านล่าง

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

ในการดึงข้อความสถานะโดยใช้ Invoke-WebRequest เราจำเป็นต้องใช้ StatusCode เป็นคุณสมบัติอ้างอิง ตัวอย่างเช่น,

try{
$uri = "http://theautomationcode.com"
$response = Invoke-WebRequest -Uri $uri -Method Get -ErrorAction Stop
Write-Output "Status Code : $($response.statuscode)"
}
catch{
Write-Output "Status Code : $($_.Exception.Response.StatusCode.Value__)"
}

เอาต์พุต:

หากเราพูดถึงเว็บไซต์ที่ไม่มีอยู่ก็จะให้รหัสสถานะอื่น สำหรับ URI ด้านล่าง

$uri = "http://theautomationcode.com/failed"

เอาต์พุต:

ค. เรียกใช้-WebRequest เพื่อดึงภาพและลิงค์จากเว็บเพจ

เราสามารถดึงภาพและลิงค์จากเว็บเพจได้โดยใช้คำสั่ง Invoke-WebRequest หากต้องการดึงภาพจากหน้าเว็บและจัดเก็บไว้ในตำแหน่งเฉพาะตามคำสั่งด้านล่าง

try{
$wc = New-Object System.Net.WebClient
$uri = "http://theautomationcode.com"
$imgs = (Invoke-WebRequest -Uri $uri -ErrorAction Stop).Images
$count = 0
foreach($imgurl in $imgs.src){
$wc.DownloadFile($imgurl,"C:\temp\WebImages\img$Count.jpg")
$count++
}
}
catch{
Write-Output "Status Code : $($_.Exception.Response.StatusCode.Value__)"
}

เอาต์พุต:

เรียกใช้-WebRequest เพื่อรับลิงก์จากหน้าเว็บ

$uri = "http://theautomationcode.com"
$response = Invoke-WebRequest -Uri $uri
$response.Links.href

เอาต์พุต:

ง. การทำงานกับแบบฟอร์มใน Involve-Webrequest

แบบฟอร์มคือหน้าที่เก็บข้อมูลเกี่ยวกับรายการป้อนข้อมูล เช่น ชื่อผู้ใช้และรหัสผ่าน เราสามารถใช้แบบฟอร์มในการส่งชื่อผู้ใช้และรหัสผ่านโดยใช้วิธี POST

ตัวอย่างเช่น เราจะใช้หน้าเข้าสู่ระบบ Reddit และส่งข้อมูลประจำตัวที่นั่น เพื่อดึงหน้าเข้าสู่ระบบ เรามี URL ด้านล่างสำหรับ Reddit

$Response = Invoke-WebRequest https://www.reddit.com/login/ -SessionVariable sv
$Response.Forms

ที่นี่เราใช้คุณสมบัติแบบฟอร์มเพื่อดึงข้อมูลที่จำเป็นของเรา

เมื่อคุณเรียกใช้คำสั่งข้างต้น คุณจะเห็นวิธี POST ที่นั่น และเราจะใช้มัน

$Response = Invoke-WebRequest https://www.reddit.com/login/ -SessionVariable sv
$form = $Response.Forms[2]
$form.Fields['loginUsername'] = 'reddit'
$form.Fields['loginPassword'] = 'redditpass'
Invoke-WebRequest $Response -Body $form -WebSession $sv -Method Post

สคริปต์ข้างต้นเป็นตัวอย่างของเว็บฟอร์มและวิธีการ POST

จ. เรียกใช้ WebRequest เพื่อรับฟีดจากหน้าเว็บ

บางครั้งเราก็ต้องดึงเนื้อหาของหน้าเว็บออกมา ตัวอย่างเช่น ฟีดจากหน้าเว็บอาจอยู่ในรูปแบบ JSON หรือ XML ในตัวอย่างด้านล่าง เราจะดึงฟีด Reddit RSS จาก URL https://www.reddit.com/.rss จากนั้นจึงแปลงเป็นรูปแบบ XML หรือ JSON ในภายหลังเพื่อดึงฟีดในรูปแบบที่เหมาะสม รูปแบบในคอนโซล ตัวอย่างเช่น,

$response = Invoke-WebRequest "https://www.reddit.com/.rss" -Method Get
$response.Content

เมื่อเรารันคำสั่งข้างต้น มันจะดึงข้อมูลเอาต์พุต XML ดังที่แสดงด้านล่าง

$response = Invoke-WebRequest "https://www.reddit.com/.rss" -Method Get
$feeds = [XML]$response.Content | Select -ExpandProperty Feed
$feeds.Entry | Select Title, Updated

เอาต์พุต:

บทสรุป

Invivo-Webrequest เป็นคำสั่งที่มีประโยชน์มากในการส่งคำขอเว็บอัตโนมัติและสำหรับการทำงานกับ API มี API ฟรีมากมาย เช่น API สภาพอากาศ ฐานข้อมูลภาพยนตร์ และ API ทางการเงินที่อนุญาตให้รวมเข้ากับคำขอเว็บ และในกรณีนั้น เราสามารถดึง อัปเดต โพสต์ หรือลบข้อมูลจาก API ที่ร้องขอได้

บทความที่เกี่ยวข้อง