الطاقة النفاذة – اعرف-الطلب-الويب: دليل شامل

هل سبق لك أن تمنيت تصفح الويب عبر سطر الأوامر؟ نعم، أنا أيضًا. لكن هل سبق لك أن احتجت إلى استخراج معلومات من صفحة ويب، أو مراقبة موقع ويب أو إرسال معلومات عبر التحكم التلقائي؟ لقد فعلت ذلك، واستخدمت Invoke-Webrequest للقيام بذلك!

أمر Invoke-WebRequest في PowerShell هو السكينة السويسرية للويب. يمكن لهذا الأمر إرسال أي فعل HTTP إلى خدمة ويب مع الأشياء الشائعة مثل معلمات HTTP، وتحديد رؤوس HTTP المختلفة وما إلى ذلك. Invoke-WebRequest جنبا إلى جنب مع أخيه، Invite-RestMethod، هما الأمران في PowerShell اللذان سترغب في تعرفهما إذا كنت بحاجة إلى القيام بأي نوع من الأتمتة على الويب.

أمر Invoke-WebRequest هو جزء من وحدة Microsoft.PowerShell.Utility التي تأتي مع Windows PowerShell وPowerShell Core. تم تضمين هذا الأمر مع PowerShell منذ الإصدار v3 وهو واحد من الأوامر القوية للغاية وسهلة الاستخدام.

من خلال استخدام Invoke-WebRequest، يسمح PowerShell للمطور بالعمل مع مواقع الويب وخدمات الويب وواجهات برمجة التطبيقات REST بطرق مختلفة كثيرة.

الاستخدام الأساسي

عند استخدامه بشكله الأبسط، يرسل أمر Invoke-WebRequest طريقة طلب HTTP إلى نقطة النهاية مثل URI أو URL. يدعم الأمر جميع الطرق الشائعة للطلب.

بواسطة بعيدًا، أكثر الطرق شيوعًا هي الطريقة GET. تقوم هذه الطريقة بقراءة المعلومات مثل المعلومات من موقع الويب أو ربما استعلام واجهة برمجة التطبيقات البيانية. تتم تحديد الطريقة باستخدام Method المعلمة. نظرًا لأننا بحاجة إلى نقطة نهاية للتحقيق، سنحتاج أيضًا إلى معرف موارد متميز. لجعل الأمر سهلاً، سأختار أي موقع. للترويج بشكل فاضح لـ 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 إلى معرف موارد متميز لملف واستخدام المعلمة 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.

أخيرًا ، استخدام رائع آخر لـ 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

الملخص

إن cmdlet Invoke-WebRequest هو واحد من أكثر الcmdlets المتنوعة التي تأتي مع PowerShell. إذا كان هناك إجراء يمكن أداؤه عبر مستعرض رسومي نموذجي ، فإن cmdlet Invoke-WebRequest يستطيع فعل ذلك أيضًا. يمكنك العثور على مثال على استخدام هذا cmdlet عن طريق النظر في هذا المقال حول مراقبة واجهات برمجة تطبيقات REST.

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