פוורשל Invoke-WebRequest: מדריך מקיף

שאלון האם אי פעם חלמת לגלוש באינטרנט דרך שורת הפקודה? כן. גם אני לא. אבל האם אי פעם היית צריך למשוך מידע מדף אינטרנט, למעקב אחרי אתר או להגיש מידע באמצעות אוטומציה? אני כן ואני משתמש ב-Invoke-WebRequest כדי לעשות זאת!

ה-cmdlet של PowerShell שנקרא Invoke-WebRequest הוא אחד מכלי ה- swiss army knife של האינטרנט. עם קומנדליין זה, תוכל לשלוח כל פעולת HTTP לשירות אינטרנט יחד עם דברים נפוצים כמו פרמטרים של HTTP, לציין כותרות שונות של HTTP וכדומה. Invoke-WebRequest יחד עם אחיו, Invoke-RestMethod, הם שני קומנדליין של PowerShell שתרצה להתנגד אליהם אם אתה צריך להפקיד אוטומציה כלשהי שלרשותך.

קומנדליין Invoke-WebRequest הוא חלק מהמודול Microsoft.PowerShell.Utility הכלול עם Windows PowerShell ו-PowerShell Core. הקומנדליין כלול ב-PowerShell מאז גרסה 3 והוא אחד שחזק במיוחד אך פשוט לשימוש.

באמצעות Invoke-WebRequest, PowerShell מאפשר למפתח לעבוד עם אתרי אינטרנט, שירותי אינטרנט ו-REST APIs בדרכים רבות.

שימוש בסיסי

בסיסי, קומנדליין Invoke-WebRequest שולח שיטת בקשת HTTP לקצה כמו URI או URL. הקומנדליין תומך בכל השיטות הנפוצות של בקשה.

ברוב המקרים, השיטה הנפוצה ביותר היא השיטה GET. שיטה זו קוראת מידע כגון מידע מאתר אינטרנט או אולי שאילתת REST API. השיטה מוגדרת באמצעות הפרמטר Method. מכיוון שאנו זקוקים לנקודת קצה לשאילתה, נזדקק גם ל-URI. כדי לשמור על קלות זו, אבחר בכל אתר. לחשוף בבגוניות את TechSnips, אבחר בטקסניפס דוט איי או.

נניח שאני רוצה לקבל רשימה של כל הסרטונים האחרונים שפורסמו כפי שמוצג למטה.

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 כדי לספר לקומדלט לשמור את הקובץ בדיסק המקומי.

כדוגמת, למטה אני מוריד את התוכנה 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) ליצור ישיבה שתשמש למעקב אחר דברים כמו עוגיות, לדוגמה. טופס נפוץ הוא טופס התחברות/סיסמה אז בואו נתחבר לאתר בדיוני!

נניח שהטופס שלנו נמצא בכתובת האינטרנט 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"

לאחר שהטופס נמלא, נוכל להשתמש שוב ב־`Invoke-WebRequest` אך הפעם נשתמש באותה הישיבה שיצרנו ונמצא באופן אוטומטי את ה־URI לשליחתו על ידי קריאה למאפיין `Action` שנמצא בטופס כפי שמוצג למטה.

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

אם יש לך את כל שמות השדות המתאימים והדף האינטרנטי לא עושה שום דבר מיוחד, אתה צריך להתחבר עם שם המשתמש והסיסמה בתוך הישיבה ה־`$rb`. בנקודה זו, ניתן לך לקרוא דפים שונים שנמצאים מאחורי האימות הזה אם אתה משתמש במשתנה הישיבה `$rb`.

解決短URI

סוף סוף, שימוש נוסף נהדר של Invoke-WebRequest הוא פתרון לקיצורי כתובות URL. אולי תרצה לדעת מה נמצא מאחורי כתובת ה-URL הקצרה אבל לא תרצה ללחוץ עליה כדי לגלות! אין בעיה. באמצעות Invoke-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

סיכום

פקודת ה-Invoke-WebRequest היא אחת מפקודות ה-PowerShell המותאמות ביותר. אם יש פעולה שניתן לבצע דרך דפדפן גרפי רגיל, פקודת ה-Invoke-WebRequest יכולה לעשות גם זאת. ניתן למצוא דוגמה לשימוש בפקודה זו על ידי הצצה למאמר זה על ניטור של ממשקי REST API.

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