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 ที่ร้องขอได้











