Invoke-WebRequest: PowerShell'in Web İsviçre Çakısı
Hiç komut satırı aracılığıyla web'e göz atmak istediniz mi? Evet. Ben de değil. Peki hiç bir web sayfasından bilgi çekmeniz, bir web sitesini izlemeniz veya otomasyon aracılığıyla bilgi göndermeniz gerekti mi? Bende var ve bunu yapmak için Invoke-Webrequest kullanıyorum!
Invoke-WebRequest PowerShell cmdlet'i web için İsviçre çakısıdır. Bu cmdlet, herhangi bir HTTP fiilini bir web hizmetine, HTTP parametreleri gibi genel şeylerle birlikte gönderebilir, farklı HTTP başlıklarını belirtebilir vb. Invoke-WebRequest ve kardeşi Invite-RestMethod, herhangi bir web otomasyonu yapmanız gerektiğinde aşina olmak isteyeceğiniz iki PowerShell cmdlet'idir.
Invoke-WebRequest cmdlet'i, Windows PowerShell ve PowerShell Core ile birlikte gelen Microsoft.PowerShell.Utility modülünün bir parçasıdır. Bu cmdlet, v3'ten beri PowerShell'e dahil edilmiştir ve son derece güçlü ancak kullanımı kolay bir cmdlet'tir.
PowerShell, Invoke-WebRequest'i kullanarak geliştiricinin web siteleri, web hizmetleri ve REST API'leri ile birçok farklı şekilde çalışmasına olanak tanır.
Temel Kullanım
En temel haliyle Invoke-WebRequest cmdlet'i, URI veya URL gibi bir uç noktaya bir HTTP istek yöntemi gönderir. Cmdlet tüm yaygın istek yöntemlerini destekler.
Şu ana kadar en yaygın yöntem GET yöntemidir. Bu yöntem, bir web sitesinden gelen bilgiler veya belki bir REST API'sinin sorgulanması gibi bilgileri okur. Yöntem, Method parametresi kullanılarak tanımlanır. Sorgulamak için bir uç noktaya ihtiyacımız olduğundan aynı zamanda bir URI'ye de ihtiyacımız olacak. Bunu kolaylaştırmak için herhangi bir web sitesini seçeceğim. TechSnips'i utanmadan tanıtmak için techsnips.io'yu seçeceğim.
Diyelim ki aşağıda gösterildiği gibi en son yayınlanan tüm videoların bir listesini almak istiyorum.
Invoke-WebRequest -Uri 'https://techsnips.io' -Method GET komutunu çalıştırarak bu sayfanın HTML temsilini alabilirim. Bunu yaptığımda, Invoke-WebRequest web sayfasının tamamını indiriyor ve sayfanın öğeleri etrafında çeşitli ayrıştırılmış bilgiler içeren bir çıktı döndürüyor.
Videoları alabilmek için biraz araştırma yapmam gerekecek. links özelliğine baktığımda, tüm video bağlantılarının aşağıda gösterildiği gibi bir ng-binding sınıfına sahip olması gibi bir ortak nokta görüyorum.
Bunu öğrendikten sonra tüm bu öğeleri bulabilir ve yalnızca innerHTML özelliğini döndürebilirim ve işte!
Invoke-WebRequest ile Dosyaları İndirme
Ayrıca Invoke-WebRequest'i web'den dosya indirmek için de kullanabiliriz ve bu gerçekten çok kolaydır! Dosyaları, bir dosyanın URI'sine Invoke-WebRequest işaretini getirerek ve cmdlet'e dosyayı yerel diske kaydetmesini söylemek için OutFile parametresini kullanarak indirebiliriz.
Örnek olarak aşağıda SysInternals Handle yardımcı programını indiriyorum ve indirildikten sonra zip dosyasını genişletiyorum. Gerçekten bu kadar kolay!
Invoke-WebRequest -Uri 'https://download.sysinternals.com/files/Handle.zip' -OutFile C:\handle.zi Expand-Archive -Path C:\handle.zipForm Gönderme ve Oturumlarla Çalışma
Formları doldurmak için de Invoke-WebRequest kullanabiliriz. Ancak bunu yapmak için genellikle web oturumlarıyla çalışmamız gerekir. HTTP doğal olarak durum bilgisi olmayan bir protokoldür ve tarayıcınızın (bu durumda PowerShell), örneğin çerezler gibi şeyleri izlemek için kullanılacak bir oturum oluşturabilmesi gerekir. Yaygın bir form, kullanıcı adı/şifre formudur, o yüzden hadi kurgusal bir web sitesine giriş yapalım!
Diyelim ki kurgusal giriş formumuz http://somewebsite.com URL'sinde. HTML yapısını indirip bir oturum oluşturmak için öncelikle Invoke-WebRequest komutunu çalıştırmamız gerekir.
$response = Invoke-WebRequest -Uri 'http://somewebsite.com' -SessionVariable rbBunu yaptığımızda, yanıtta bir kullanıcı adı ve şifreyle doldurabileceğimiz bir Formlar özelliği olacaktır. Bu durumda kullanıcı adı user adlı alanla temsil edilir ve şifrenin password adlı alanda olması gerekir. Bu web sayfasına bağlı olacaktır.
$form = $response.Forms[0]
$form.Fields["user"] = "username"
$form.Fields["password"] = "password"Form doldurulduktan sonra tekrar Invoke-WebRequest'i kullanabiliriz ancak bu sefer az önce oluşturduğumuz oturumu yeniden kullanabiliriz ve Action'ı okuyarak gönderilecek URI'yi otomatik olarak bulabiliriz. özelliği aşağıda gösterildiği gibi formdadır.
$response = Invoke-WebRequest -Uri $form.Action -WebSession $rb -Method POSTTüm uygun alan adlarını doğru olarak belirlediyseniz ve web sayfası bir işe yaramıyorsa, $rb web oturumunda kullanıcı adı ve şifreyle oturum açmalısınız. Bu noktada $rb web oturumu değişkenini kullanırsanız, bu kimlik doğrulamanın arkasındaki çeşitli sayfaları okuyabilirsiniz.
Kısa URI'leri Çözümleme
Son olarak, Invoke-WebRequest'in bir başka harika kullanımı da kısa URI'leri çözmektir. Belki de bu kısaltılmış URL'nin arkasında ne olduğunu bilmeniz gerekiyor ancak öğrenmek için üzerine tıklamak istemiyorsunuz! Sorun değil. Invoke-WebRequest'i kullanarak AbsoluteUri özelliğini bize verdiği ayrıştırılmış yanıttan okuyabiliriz!
Aşağıdaki uyarıya göre ayrıca UseBasicParsing parametresini de kullanıyorum. Varsayılan olarak Invoke-WebRequest, döndürülen HTML'yi ayrıştırmak için Internet Explorer'ı (IE) kullanmaya çalışır. Bu, IE olmayan sistemlerde çalışmaz. Bunu aşmak için, içeriği indirmeye devam etmek ancak yalnızca hafifçe ayrıştırmak için UseBasicParsing parametresini kullanabiliriz.
$Url = 'buff.ly/2sWvPOH'
$Web = Invoke-WebRequest -Uri $Url -UseBasicParsing
$Web.BaseResponse.ResponseUri.AbsoluteUriÖzet
Invoke-WebRequest cmdlet'i, PowerShell ile birlikte gelen en çok yönlü cmdlet'lerden biridir. Tipik bir grafik tarayıcı aracılığıyla gerçekleştirilebilecek bir eylem varsa Invoke-WebRequest cmdlet'i de bunu yapabilir. REST API'lerini izleme hakkındaki bu makaleye göz atarak bu cmdlet'i kullanmanın bir örneğini bulabilirsiniz.



