PowerShell Çağırma-Web İsteği | API'ler için Web İsteklerini Otomatikleştirme
PowerShell Invoke-Webrequest'in tanımı
Microsoft.PowerShell.Utility Module'ün bir parçası olan PowerShell Invoke-WebRequest cmdlet'i, HTTP gönderen Web hurdalama yöntemlerinden biridir (diğer yöntem Invoke-RestMethod, cmd ve diğer işletim sistemlerinde CURL olarak bilinir). ve Bitiş Noktası olarak adlandırılan, Başlıklar, Resimler, Bağlantılar ve diğer HTML önemli öğeleri biçimindeki içeriği alan, silen, güncelleyen ve bunun için GET, POST, PUT gibi birden fazla yöntemi kullanan, istenen web sayfasına veya URI'ye HTTPS istekleri, İsteği göndermek, içeriği değiştirmek veya web sayfasının içeriğini silmek için DELETE vb. Invoke-WebRequest'in REST API ile çalıştığı da bilinmektedir.
Sözdizimi:
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 yöntemi PowerShell'de nasıl çalışır?
PowerShell v3.0'dan itibaren PowerShell, Web Sayfalarıyla çalışmak üzere Microsoft.PowerShell.Utility modülüyle birlikte gelen Invoke-WebRequest cmdlet'ini ekledi. PowerShell kullanarak web sayfalarının içeriğini alabilir, kaldırabilir veya güncelleyebiliriz. Görünüşe göre bu, GUI kullanarak sayfada gezinmeyle aynı deneyim olmayacak, ancak web isteklerini otomatikleştirmek ve sıkıcı gezinme ve günlük manuel görevlerden kurtulmak için yapılacak.
Invoke-WebRequest, Endpoint olarak da adlandırılan URI'ye (Uniform Resource Identifier) istek göndererek Web Sayfasından verileri alır. Bazı web siteleri içeriğin yalnızca API'ler kullanılarak değiştirilmesine izin verdiği için doğrudan URL veya REST API ile çalışır.
API'lerle çalıştığımızda çıktı verileri genellikle JSON veya XML formatında olur. Örneğin,
https://yts.mx/api/v2/list_movies.json
veya
https://yts.mx/api/v2/list_movies.xml
Yukarıdaki durumda içerik alındıktan sonra PowerShell kullanarak içeriği JSON veya XML yöntemine dönüştürebiliriz.
Örnekler
PowerShell Invoke-Webrequest örneklerini tartışalım.
a.Invoke-WebRequest, verileri Web sayfasından almak için.
İçeriği web sayfasından almak için URI'yi sağlayabiliriz. Content ve RawContent Özelliği vardır ve verileri almak için bu özellikleri kullanabilirsiniz. Bu, web sayfasına ve ne tür veriler aldığımıza bağlıdır. Veriler HTML formatında olabileceği gibi JSON veya XML formatında da olabilir.
$req = Invoke-WebRequest -Uri https://theautomationcode.com/feed/
$req
Yukarıdaki komutu çalıştırdığınızda, StatusCode, StatusDescription, İçerik, RawContent, Formlar, Başlıklar, Görüntüler, Giriş Alanları, Bağlantılar, ParsedHtml, RawContentLength vb. gibi farklı Özellikleri görebilirsiniz.
Bu komutun özelliklerini Get-Member komutunu kullanarak da kontrol edebilirsiniz.
$req | gm -MemberType PropertiesÇıktı:
İçeriği geri almak için,
$req = Invoke-WebRequest -Uri "https://theautomationcode.com/feed/"
$req.Contentb.Web Sitesi Durum kodunu kontrol etmek için Invoke-WebRequest.
Bir müşteri isteği uç noktaya gönderdiğinde, web sitesinin kullanılabilirliğini veya web sayfasındaki herhangi bir hatayı gösteren çeşitli durum kodlarıyla el sıkışma durumunu gönderir.
Bağlantının altında çeşitli kodları durum mesajlarıyla birlikte bulabilirsiniz.
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
Invoke-WebRequest kullanarak durum mesajlarını almak için, referans özelliği olarak StatusCode'u kullanmamız gerekir. Örneğin,
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__)"
}
Çıktı:
Olmayan bir siteden bahsedersek farklı bir durum kodu verecektir. Aşağıdaki URI için,
$uri = "http://theautomationcode.com/failed"Çıktı:
C. Web Sayfasından görselleri ve Bağlantıları almak için Invoke-WebRequest.
Invoke-WebRequest komutunu kullanarak web sayfasından görselleri ve bağlantıları alabiliriz. Web sayfasından görselleri almak ve bunları belirli bir konumda saklamak için aşağıdaki komut gibi,
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__)"
}Çıktı:
Web Sayfasından bağlantı almak için Invoke-WebRequest.
$uri = "http://theautomationcode.com"
$response = Invoke-WebRequest -Uri $uri
$response.Links.hrefÇıktı:
D. Invoke-Webrequest'te Formlarla Çalışmak.
Formlar, kullanıcı adı ve Şifre gibi Giriş öğelerine ilişkin bilgilerin saklandığı sayfalardır. POST yöntemini kullanarak kullanıcı adını ve şifreyi göndermek için formları kullanabiliriz.
Örneğin, Reddit giriş sayfasını kullanacağız ve kimlik bilgilerini oraya göndereceğiz. Giriş sayfasını almak için aşağıdaki Reddit URL'sine sahibiz.
$Response = Invoke-WebRequest https://www.reddit.com/login/ -SessionVariable sv
$Response.FormsBurada gerekli bilgilerimizi almak için Forms Özelliğini kullandık.
Yukarıdaki komutu çalıştırdığınızda orada POST metodunu göreceksiniz, biz onu kullanacağız.
$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 PostYukarıdaki komut dosyası Web Formları ve POST yönteminin bir örneğidir.
e. Web sayfasından yayınları almak için Invoke-WebRequest.
Bazen sadece web sayfasının içeriğini almamız gerekir. Örneğin, web sayfasındaki Akışlar JSON veya XML biçiminde olabilir. Aşağıdaki örnekte, Reddit RSS beslemelerini https://www.reddit.com/.rss URL'sinden alacağız ve daha sonra beslemeleri doğru şekilde almak için bunları XML veya JSON formatına dönüştüreceğiz. Konsoldaki format. Örneğin,
$response = Invoke-WebRequest "https://www.reddit.com/.rss" -Method Get
$response.ContentYukarıdaki komutu çalıştırdığımızda aşağıda gösterildiği gibi XML çıktısını alır.
$response = Invoke-WebRequest "https://www.reddit.com/.rss" -Method Get
$feeds = [XML]$response.Content | Select -ExpandProperty Feed
$feeds.Entry | Select Title, UpdatedÇıktı:
Çözüm
Invoke-Webrequest, web isteklerini otomatikleştirmek ve API'lerle çalışmak için çok kullanışlı bir komuttur. Hava durumu API'si, film veritabanı ve finans API'leri gibi web isteğiyle entegrasyona izin veren birçok ücretsiz API vardır ve bu durumda, istenen API'lerden verileri alabilir, güncelleyebilir, gönderebilir veya silebiliriz.











