Sayfalar

15 Şubat 2016 Pazartesi

Windows Script Host ( WSH, Vbs) - Regex - Adodb.Stream kullanımına örnek bir uygulama

Dim http,url,pat,count,min,max
'Değişkenlerimizi tanımlıyoruz.

If WScript.Arguments.Count = 0 Then
'Eğer argüman sayısı 0 ise

 url = InputBox("Hedef Url:" & vbCrLf & Chr(214) & "rnek: https://www.youtube.com","Hedef Url Girin")
'input box çıkarıyor ve hedef urlmizi istiyor. başında http olmalı.
'vbCrLf bir alt satıra geç komutudur. \n veya <br /> ile aynı şeyi yapar.
'Chr(124) bildiğimiz Ö harfi için.

 If Len(url)=0 Then
'Eğer girilen url uzunluğu 0 ise

  WScript.Quit
'Scriptten çık

 End If

 pat = InputBox("RegExp Pattern:" &amp; vbCrLf)
'Regexp pattern giriniz örneğin <title>(.*) <\/title>
'burada bulunan sonucu .Submatches(0) ile alıyoruz.
'Eğer birden çok regex eşleştirmemiz varsa; Örneğin
'<a href="(.*)">(.*)</a><img src="(.*)" gibi
'Submatches(0 - 1 , 2 diye uzar gider
'NOT: vbs regexp kalıbı ECMA Standardındadır.

 min = InputBox("Start Loop:" & vbCrLf)
'Bu script örnek url http://www.ornek.com/1 .... 5000 gibi site yapılarından
'bilgileri çekmek için yazılmıştı.
'bu yüzden başlangıç değeri olan minimum değerini girmemizi istiyor.
'eğer tekli bir url olacaksa min i 0 girin

 If Len(min)=0 Then
'Eğer min değer uzunluğu 0 a eşitse yani boş ise

  min = 0
'min değeri 0 yapıyor.

 End If

 max = InputBox("Stop Loop:" & vbCrLf)
'Aynı şekilde bir döngü yaratacağımız için maksimum değerini girmemizi istiyor.

 If Len(max)=0 Then
'Eğer max değeri uzunluğu 0 a eşitse yani boş ise

  max = 0
'max değeri 0 yapıyor.

 End If

End If

'Burada da çıktıyı yazdıracağımız dosyayı yaratıyoruz.
'FileSystemObject (FSO) ile. Adodb.Stream yaptığım araştırmalarda
'Append yani var olan dosyanın içine direkt olarak tekrar yazamıyor.
'Tekrar yazma modunda dosyayı oluşturamadığı için FSO ile ilk önce dosyamız var mı
'kontrol edip Eğer yoksa dosyayı oluşturuyoruz.

Set fso = CreateObject("Scripting.FileSystemObject")
'FSO yu yarattık

 If fso.FileExists("file1.htm") Then
'Eğer file1.htm mevcutsa birşey yapma

 Else
'Değilse

 Set out = fso.CreateTextFile("file1.htm",True)
'file1.htm yi Metin dosyası olarak yarat.
'CreateTextFile parametreleri "dosya_adı", overwrite(üzerine yazma),unicode şeklinde
'Boolean yani True veya False değerini alır.

 out.Close
'dosyayı kapat.

 Set out = Nothing
'değişkeni serbest bırak

 End If

Set fso = Nothing
'fso serbest bırak

For count = min to max
'For döngüsü , count 1 er 1 er artıyor. 2 şer artış için for döngüsünün içine
'count = count + 1 yazılabilir.

 Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
'Burada http nesnemizi yaratıyoruz.

 If max > 1 Then
'Eğer max değeri 1 den çok ise http://www.ornek.com urlsini girdi isek

 http.Open "GET", url & "/" & count , False
'url ye / ekleyip count değişkeniyle çoklu url döndürüyoruz min değerinden başlayarak yani
'http://www.ornek.com/1 oluyor urlmiz.

 Else
'eğer min veya maxa değer girmediysek http://www.ornek.com
'olarak sadece bir url döndürüyor

 http.Open "GET", url , False
'url yi aç. GET metodunu kullandık çünkü herhangi bir form verisi göndermeyeceğiz.
'GET metodu ve POST metodu nasıl kullanılır açıklamasını araştırınız.
'3. parametre http bağlantısını senkron modda açması için False değeri belirledik

 End If

 http.SetRequestHeader "User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36"
'Başlık verilerini Google chrome kullandığımız yönünde gönderiyoruz.

 http.Send
'Sorguyu gönder
'False değeriyle senkron istek gönderimini açmıştık bu da Send işlemini
'tüm sayfa gelene kadar sonlandırmıyor

 If http.Status = 200 Then
'Eğer bu sayfa mevcut ise Status değeri 200 olarak geri döner

  Set Rgx = new RegExp
'Rgx geğişkenine Regexp nesnesini tanımlıyoruz.

  Rgx.Global = True
'Varsayılan olarak False dir.
'Global değişken true iken verilen metin ve regexp patternindeki
'ilk bulunan değil tüm bulunanlar sorgulanır.

  Rgx.IgnoreCase = True
'Büyük küçük harf duyarlılığını iptal eder.

  Rgx.Pattern = pat
'Desen pattern input boxtan geleni atıyoruz.

  Set Esler = Rgx.Execute(http.responseText)
'Esler değişkenine RegExp sorgumuzu çalıştırıyoruz
'http.responseText ile verdiğimiz urlnin kaynak kodunu string olarak atadık.
'http.responseBody gibi bir istek de mevcuttur.
'buna değinmeyeceğiz ama kısaca binary stream için kullanılıyor.
'örneğin video gibi veriler yada exe indiriyorsak.

  Set objStream = CreateObject("ADODB.Stream")
'objStream değişkenimize Adodb.stream nesnemizi yartıp tanımlıyoruz.
'Burada değinmek istediğim adodb.stream ın direkt bir text append yani metin belgesine
'doğrudan satır satır ekleme yapmaması.
'Normalde yaptığı dosyaya satırı 1. sıraya sürekli yazmak.
'Bu yüzden ilk önce önceki var olan satırları okutup, ekleteceğimiz satırlarla birleştirip
'tekrar yazdırmak şeklinde bir çözüm buldum.

  With objStream
'With değişken, tanımlaması; objStream.Charset,  objStream.Type tek tek tanımlamadan
'kurtulmak için kullanılıyor.

   .Charset = "utf-8"
'Karakter türü

   .Type=2
'1 binary, 2 Text akış tipi

   .mode=3
'Okuma/Yazma modu
'parametreler için en açıklayıcı kaynak http://www.w3schools.com/asp/ado_ref_stream.asp

   .Open
'Akışı aç

   .LoadFromFile "file1.htm"
'Fso ile yarattığımız dosyayı hafızaya yüklüyoruz.

   Dim readData
'değişken tanımladık

   readData="" & .readText
'Hafızada bulunan dosyadaki tüm satırları metin formatında okuyoruz.
've "" ile stringe dönüştürüyor.

   .Position = 0
'Okunan akışın başlangıç byte değer posizyonu.

   On Error Resume Next
'Yazma denemesi hata kontrolü hata varsa sonraki komuttan devam et.

   .WriteText readData & count & " : <a href=" & chr(34) & Esler(0).SubMatches(3) & chr(34) & ">" & Esler(0).SubMatches(0) & "</a><br>" & vbCrLf,0
'Bu benim istediğim formatta metin çıktısı veriyor.
'min..max : <a href="bulunan3">bulunan1</a><br> şeklinde siz kendinize göre değiştirebilirsiniz
'Burda birkay şeyi açıklayacağım. Eğer bulunanlardan birinde hata varsa If ten devam eder.
'.Write <buffer>; tek başına binary yazar responseBody ile kullanılır ve Type 1 olmalı.
'.WriteText TextStream,<opt> dir. 0 char, 1 string ile birlikte yeni satır yazar.
'readData da belirttiğim gibi dosyaya alt alta satır ekleme yani append için gereklidir

   If Err.Number <> 0 Then
'Eğer yazmada hata varsa

    .WriteText readData & count & " : <br>" & vbCrLf,0
'boş formatladığımız bir satır yazdırıyoruz.
'count : <br> yeni satır(vbCrLf) çıktısı veriyor.

    Err.Clear
'hatayı temizle

   End If

   .SaveToFile "file1.htm",2
'Dosyaya kaydet, "dosya_adı",opt
'SaveToFile varsayılan olarak opt değeri 1 dir.
'opt 1 dosya mevcut değilse yeni dosya yaratır. Üzerine yazmaz dosya varsa hata verir.
'opt 2 dosya mevcutsa akışı üzerine yazar.

   .Close
'Akışı kapat

  End With
'With i kapat
'Yarattığımız nesneleri serbest bırakıyoruz.

  Set objStream = Nothing
  Set Esler = Nothing
  Set Rgx = Nothing

 Else
'Eğer istediğimiz url yok ise Alttaki işlemleri uygula
'Üst satırlarda değindiğimiz için bunlara değinmeyeceğiz.
'Boş bir değer yazdırıyoruz sadece
'count <br> yeni satır(vbCrLf).
'For döngüsü
'For değişken min to max
'işlemler
'Next kalıbındadır.

  Set objStream = CreateObject("ADODB.Stream")
  With objStream
   .Charset = "utf-8"
   .Type=2
   .mode=3
   .Open
   .LoadFromFile "file1.htm"
   Dim readDt
   readDt="" & .readText
   .Position = 0
   .WriteText readDt & count & " : <br>" & vbCrLf,0
   .SaveToFile "file1.htm",2
   .Close
  End With

  Set objStream = Nothing

 End If

Next

Set http = Nothing

0 yorum:

Yorum Gönder