Cuma Eğlencesi: PowerShell ile Tatil Alışverişi


Bir kez daha tatil alışveriş sezonu kapımızda. Ancak belki de PowerShell bunu biraz daha kolaylaştırabilir veya en azından biraz daha eğlenceli hale getirebilir. Eminim çoğunuz NewEgg.com'dan alışveriş yapmışsınızdır. Belki bu yıl da arkadaşlarınız, aileniz ve hatta kendiniz için bunu tekrar yapmayı planlıyorsunuz. Öyleyse neden PowerShell'in bunu biraz daha kolaylaştırmasına izin vermiyorsunuz?

NewEgg, bir dizi satış kategorisi için RSS beslemeleri yayınlayacak kadar bilgilidir. Ana listeyi http://www.newegg.com/RSS/Index.aspx adresinde bulabilirsiniz. Hadi onların Günün Fırsatı yayınını alalım.

$uri = "http://www.newegg.com/Product/RSS.aspx?Submit=RSSDailyDeals&Depa=0"

Invoke-RestMethod'u kullanarak öğeleri almak çok kolaydır.

Invoke-RestMethod -Uri $uri

Ama yine de biraz karmaşık, o yüzden biraz daha seçici olalım.

$data = Invoke-RestMethod -Uri $uri | Select -property @{Name="Published";Expression= {$_.pubDate -as [datetime]}},Title,Link

Ayrıca, orijinal PubDate'i alan ve bunu bir tarih olarak değerlendiren, verilerin sıralanmasını veya filtrelenmesini kolaylaştıran Published adında yeni bir özellik de oluşturdum.

İşte aldıklarımın bir örneği.

Bu verilerle Out-Gridview'i nesne seçici olarak kullanabilirim.

$data | out-gridview -Title "Deal of the Day" -OutputMode Multiple | foreach { Start $_.link }

Birden fazla giriş seçebilirim, Tamam'ı tıklayabilirim ve her bağlantı tarayıcımda açılmalıdır.

Ama hadi işleri biraz daha ilginç hale getirelim. Title özelliği fiyat ve açıklamayı içerir. Bu bağlantıların dünyanın diğer yerlerinde nasıl göründüğüne dair hiçbir fikrim yok, bu nedenle aşağıdaki örnekleri ayarlamanız gerekebilir.

İlk olarak, para birimini (benim durumumda $), fiyatı ve öğe açıklamasını almak için adlandırılmış yakalamaları kullanmak üzere bir normal ifade modeli tanımlayacağım.

[regex]$rx = "(?<currency>.)(?<price>\d+\.\d{2})\s-\s(?<item>.*)"

Başlık alanında fiyat gibi görünmeyen herhangi bir girişi atlayarak verileri yeniden indireceğim.

$dl = Invoke-RestMethod -Uri $uri | where {$_.Title -match "\d+\.\d{2}"}

Amacım Out-Gridview'i para birimi ve fiyat için ayrı özelliklerle tekrar kullanmak. Sıralama yapabilmem için fiyatın sayısal olması gerekiyor. Daha sonra regex ifadesini kullanarak para birimi sembolünü alıyorum.

$c = $rx.match($dl[0].title).groups["currency"].value

Daha sonra fiyatı ve açıklamayı ayrıştırmak için regex nesnesini kullanarak RSS verilerinin geri kalanını işleyebilirim.

$data = $dl |
Select -property @{Name="Published";Expression= {$_.pubDate -as [datetime]}},
@{Name=$c;Expression = {$rx.match($_.title).groups["price"].value -as [double]}},
@{Name="Item";Expression = {$rx.match($_.title).groups["item"].value }},
Link

Dikkat ederseniz özellik adı olarak Currency değerini kullandım. Artık Out-Gridview'i kullandığımda daha esnek bir ekrana sahibim.

$data | Sort $c -descending | Out-GridView -Title $uri -OutputMode Multiple |
foreach {
#open each selected link
start $_.link
}

Yeni bir dizüstü bilgisayar satın alıyorsam birden fazla girişi seçip Tamam'a tıklayıp bunları tarayıcımda inceleyebilirim.

Shell Shocker'larına RSS beslemesini değiştirerek işlemi tekrarlayabilirim

$uri = "http://www.newegg.com/Product/RSS.aspx?Submit=ShellShocker"

Önceki adımları tekrarlarsam bu başarısız olur ve bu da normal ifadelerle ilgili akılda tutulması gereken bir şeyi gündeme getirir: Verilerinizi bilin. Neyi işlediğinizi ve bunun öngörülebilir bir model izlediğini bilmelisiniz. En azından normal ifade kalıplarınızı nispeten basit tutmak istiyorsanız. Buradaki sorun yalnızca tek bir öğenin olmasıdır. Yani para birimi rakamını alma kodum başarısız oluyor çünkü bir dizim yok. Bu durumda şunu yapabilirim:

$c = $rx.match($dl.title).groups["currency"].value

Yine de yeniden kullanabileceğim bir kod bulmak daha mantıklı olabilir.

$entry = $dl | select -first 1
$c = $rx.match($dl.title).groups["currency"].value

Ancak buradan itibaren kod aynıdır.

Bazen RSS beslemeleri sitenin biraz gerisinde kalsa da bu, incelemek istediğim bir şey olabilir. Ne yazık ki bu durumda bağlantı çalışıyor ancak ürün başka bir şey. Ama fikri anladınız.

Hafta sonunuzun tadını çıkarın ve dışarıda dikkatli olun!

İlgili makaleler