เรียกใช้ WebRequest: Web Swiss Army Knife ของ PowerShell
คุณเคยต้องการท่องเว็บผ่านบรรทัดคำสั่งหรือไม่? ใช่. ฉันก็ไม่เหมือนกัน. แต่คุณเคยจำเป็นต้องดึงข้อมูลจากหน้าเว็บ ตรวจสอบเว็บไซต์ หรือส่งข้อมูลผ่านระบบอัตโนมัติหรือไม่? ฉันมีและฉันใช้ Invoke-Webrequest เพื่อทำมัน!
Inrigger-WebRequest PowerShell cmdlet คือมีดทหารสวิสสำหรับเว็บ cmdlet นี้สามารถส่งกริยา HTTP ใดๆ ไปยังบริการเว็บพร้อมกับสิ่งทั่วไปเช่นพารามิเตอร์ HTTP ระบุส่วนหัว HTTP ที่แตกต่างกันเป็นต้น Invive-WebRequest พร้อมด้วย Invite-RestMethod คือ PowerShell cmdlet สองตัวที่คุณจะต้องการทำความคุ้นเคยหากคุณต้องการทำเว็บอัตโนมัติประเภทใดก็ตาม
Inrigger-WebRequest cmdlet เป็นส่วนหนึ่งของโมดูล Microsoft.PowerShell.Utility ที่มาพร้อมกับ Windows PowerShell และ PowerShell Core cmdlet นี้รวมอยู่ใน PowerShell นับตั้งแต่ v3 และเป็นอันที่ทรงพลังอย่างยิ่งแต่ใช้งานง่าย
ด้วยการใช้ Invoke-WebRequest PowerShell ช่วยให้นักพัฒนาทำงานกับเว็บไซต์ บริการเว็บ และ REST API ได้หลายวิธี
การใช้งานขั้นพื้นฐาน
โดยพื้นฐานแล้ว Invoke-WebRequest cmdlet จะส่งวิธีการร้องขอ HTTP ไปยังตำแหน่งข้อมูล เช่น URI หรือ URL cmdlet รองรับวิธีการร้องขอทั่วไปทั้งหมด
จนถึงตอนนี้ วิธีการที่ใช้บ่อยที่สุดคือวิธี GET วิธีนี้จะอ่านข้อมูล เช่น ข้อมูลจากเว็บไซต์หรืออาจสอบถาม REST API วิธีการถูกกำหนดโดยใช้พารามิเตอร์ Method เนื่องจากเราต้องการตำแหน่งข้อมูลในการสืบค้น เราจึงต้องมี URI ด้วยเช่นกัน เพื่อให้ง่าย ฉันจะเลือกเว็บไซต์ใดก็ได้ เพื่อโปรโมต TechSnips อย่างไร้ยางอาย ฉันจะเลือก techsnips.io
สมมติว่าฉันต้องการรับรายการวิดีโอที่เผยแพร่ล่าสุดทั้งหมดตามที่แสดงด้านล่าง
ฉันสามารถรับการแสดง HTML ของหน้านี้ได้โดยการเรียกใช้ Inrigg-WebRequest -Uri 'https://techsnips.io' -Method GET เมื่อฉันทำเช่นนี้ Inrigger-WebRequest จะดาวน์โหลดหน้าเว็บทั้งหมดและส่งกลับผลลัพธ์ที่มีข้อมูลที่แยกวิเคราะห์ต่างๆ รอบๆ องค์ประกอบของหน้า
ฉันต้องขุดลึกเพื่อให้ได้วิดีโอนี้ เมื่อฉันดูคุณสมบัติลิงก์ ฉันพบว่าลิงก์วิดีโอทั้งหมดมีคลาส ng-binding ดังที่แสดงด้านล่าง
เมื่อฉันรู้สิ่งนี้แล้ว ฉันสามารถค้นหาองค์ประกอบเหล่านั้นทั้งหมดและส่งคืนเฉพาะคุณสมบัติ innerHTML และ voila!
การดาวน์โหลดไฟล์ด้วย Invivo-WebRequest
เรายังสามารถใช้ Invoke-WebRequest เพื่อดาวน์โหลดไฟล์จากเว็บได้เช่นกัน ซึ่งง่ายมาก! เราสามารถดาวน์โหลดไฟล์ได้โดยเพียงแค่ชี้ Intake-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 ก่อนอื่น เราต้องเรียกใช้ Inrigg-WebRequest เพื่อดาวน์โหลดโครงสร้าง HTML และสร้างเซสชัน
$response = Invoke-WebRequest -Uri 'http://somewebsite.com' -SessionVariable rbเมื่อเราทำเช่นนี้ การตอบสนองจะมีคุณสมบัติ Forms ที่เราสามารถใส่ชื่อผู้ใช้และรหัสผ่านได้ ในกรณีนี้ ชื่อผู้ใช้จะแสดงด้วยฟิลด์ชื่อ ผู้ใช้ และรหัสผ่านควรอยู่ในฟิลด์ชื่อ รหัสผ่าน ขึ้นอยู่กับหน้าเว็บ
$form = $response.Forms[0]
$form.Fields["user"] = "username"
$form.Fields["password"] = "password"เมื่อกรอกแบบฟอร์มแล้ว เราสามารถใช้ Invoke-WebRequest อีกครั้ง แต่คราวนี้ใช้เซสชันที่เราเพิ่งสร้างขึ้นอีกครั้ง และค้นหา URI ที่จะส่งไปโดยอัตโนมัติโดยการอ่าน Action คุณสมบัติที่อยู่ในแบบฟอร์มดังที่แสดงด้านล่าง
$response = Invoke-WebRequest -Uri $form.Action -WebSession $rb -Method POSTหากคุณมีชื่อฟิลด์ที่เหมาะสมทั้งหมดและหน้าเว็บไม่ได้มีลักษณะพิเศษใดๆ คุณควรเข้าสู่ระบบด้วยชื่อผู้ใช้และรหัสผ่านภายในเซสชันเว็บ $rb ณ จุดนี้ คุณสามารถอ่านหน้าต่างๆ ที่อยู่เบื้องหลังการรับรองความถูกต้องนั้นได้ หากคุณใช้ตัวแปรเซสชันเว็บ $rb
การแก้ไข URI แบบสั้น
สุดท้าย การใช้ Inrigg-WebRequest ที่ยอดเยี่ยมอีกอย่างหนึ่งก็คือการแก้ไข URI แบบสั้น บางทีคุณอาจต้องรู้ว่าอะไรอยู่เบื้องหลัง URL แบบสั้นนั้น แต่ไม่ต้องการคลิกเพื่อดู! ไม่มีปัญหา. เมื่อใช้ Invive-WebRequest เราสามารถอ่านคุณสมบัติ AbsoluteUri จากการตอบกลับแบบแยกวิเคราะห์ที่มอบให้เรา
โปรดสังเกตด้านล่างว่าฉันกำลังใช้พารามิเตอร์ UseBasicParsing ด้วย ตามค่าเริ่มต้น Invoke-WebRequest จะพยายามใช้ Internet Explorer (IE) เพื่อแยกวิเคราะห์ HTML ที่ส่งคืน สิ่งนี้ใช้ไม่ได้กับระบบที่ไม่มี IE เพื่อแก้ไขปัญหานี้ เราสามารถใช้พารามิเตอร์ UseBasicParsing เพื่อดาวน์โหลดเนื้อหาแต่แยกวิเคราะห์เพียงเล็กน้อยเท่านั้น
$Url = 'buff.ly/2sWvPOH'
$Web = Invoke-WebRequest -Uri $Url -UseBasicParsing
$Web.BaseResponse.ResponseUri.AbsoluteUriสรุป
Inrigger-WebRequest cmdlet เป็นหนึ่งใน cmdlet ที่หลากหลายที่สุดที่มาพร้อมกับ PowerShell หากมีการดำเนินการที่สามารถทำได้ผ่านเบราว์เซอร์กราฟิกทั่วไป Inrigger-WebRequest cmdlet ก็สามารถทำได้เช่นกัน คุณสามารถดูตัวอย่างการใช้ cmdlet นี้ได้โดยดูบทความเกี่ยวกับการตรวจสอบ REST API



