Daha önce bir captcha okuma uygulaması yazmaya karar vermiştim. Karşıma çıkan engellerden biri, dinamik captcha resmini sayfa ile birlikte alıp düzenleyebileceyim bir picturebox nesnesine kopyalayamamaktı. Resmin adresini alıp resmi okursam sayfayı aldığımda üretilecek kod farklı olacağı için bu işime yaramayacaktı...
Kodları denemek için form içerisinde hem vbasic6 hem de vbasic.net için Tarayici adında bir WebBrowser ve GuvenlikKodu adında bir PictureBox nesnesi bulunuyor olması gerekiyor.
Kodlardaki Images(0), html dosyası içerisindeki ilk resimdir. Resimlerin indexi, sayfada bulunma sıralarına göre belirlenir. Onu ihtiyacınıza göre değiştirirsiniz artık.
Aşağıdaki kodla sadece resimlere değil, sayfa içerisinde herhangi bir html etiketinin içeriğine erişebilirsiniz. İsterseniz getElementById(), getElementByTagName() gibi fonksiyonları da kullanabilirsiniz. Ama her html elemanının bir id veya isim bulundurması bir zorunluluk olmadığı için ilk yöntem resimler için daha kullanışlı.
Visual Basic 6.0:
Dim Nesne As Object Set Nesne = Tarayici.Document.body.createControlRange() Nesne.Add Tarayici.Document.Images(0) Nesne.execCommand "Copy" GuvenlikKodu.Picture = Clipboard.GetData
Visual Basic.Net:
Dim Nesne As Object Nesne = Tarayici.Document.DomDocument.body.createControlRange() Nesne.Add(Tarayici.Document.Images(0).DomElement) Nesne.execCommand("Copy") GuvenlikKodu.Image = My.Computer.Clipboard.GetImage()
Haklısın, etiket ismini belirtmedik.
Tarayici.Document.GetElementsByTagName.DomDocument.Images(0)
ifadesi yerine
Tarayici.Document.GetElementsByTagName("img").Item(0).DomElement
ifadesini veya daha dolaysız olacak şekilde
Tarayici.Document.Images(0).DomElement
ifadesini kullanabiliriz...
Teşekkür ederim bu sefer çalıştı ve sitenin güvenlik kodunu formdaki picturebox a almayı başardım.
Öncelikle iyi çalışmalar dilerim. Sitenizde forum olmadığı için buradan yazma ihtiyacı duydum..
webbrowser ile bağlandığım sitedeki textboxlara vb net ile hazırladığım programla veri aktaracm..
WebBrowser1.Document.GetElementById("Kullanıcı").InnerText = Textbox1.text
yukardaki bu kodla bir kısmını hallettim fakat sitede 2 form iç içe yapılmış 2. formdaki textboxlara nasıl ulaşırım..Aşağıdaki kodu denedim ama hata verdi..
WebBrowser1.Document.Forms(1).GetElementById("Kullanıcı").InnerText = Textbox1.text
'GetElementById' is not a member of 'System.Windows.Forms.HtmlElement' Hatası veriyor.
Eğer erişmek istediğiniz farklı iki textbox aynı idye sahipse bu aslında bir hata. id benzersiz olmalı. id özniteliği dışında name özniteliğinden yararlanarak da onlara erişebilirsiniz. İçeriği ile uğraştığınız html sayfasının kodu elimde olmadığı için kesin birşey söyleyemeyeceğim, ama örnek vereyim. Mesela google.com.tr sayfasındayken arama çubuğuna istediğinizi yazmak için aşağıdaki ifadeyi kullanabilirsiniz:
WebBrowser1.Document.All.GetElementsByName("q").Item(0).InnerText = "kelime"
Erişmek istediğiniz eleman id ve name özniteliklerinin hiçbirini taşımıyorsa DOM özelliklerini kullanarak istediğiniz elemana ulaşabilirsiniz. childNodes, previousSibling, nextSibling ve parentNode özellikleri ile html sayfasını bir ağaç gibi ele alıp, istediğiniz konumdan istediğiniz konuma erişebilirsiniz. Daha fazla bilgi için http://www.w3schools.com/dom/dom_element.asp adresini ziyaret edebilirsiniz.
Eğer yazdığınız ifadeyi düzeltmeye çalışırsak şuna benzer bir ifade kullanabiliriz:
WebBrowser1.Document.Forms(1).DomElement.ismi.value='değer'
Burada ismi dediğimiz şey, id özniteliği değil de name özniteliği. Bu şekilde de nesneye erişmeniz mümkün.
Görüldüğü gibi pekçok yolu var, html sayfasının içeriğine göre en kısa yolu seçip onu kullanmak gerek. İyi çalışmalar...
iyi günler bende forumdaki bir guvenlik kodunu almaya calışıyorum ama dediğiniz kodu yapmama rağmen sitedeki başka bir resmi alıyor :)
ordaki "img" kısmını değiştereyim dedimde tüm resimler icin aynı şey yazıyor img yazıyor
ne yapmam lazım anlayamadım gitti acaba orda belirttiğiniz 0 rakamını değiştirirsem olurmu sorun omu acaba teşekürler...
tamamdır resmi buldum ama sayfayı yenilediğim zaman yine picturebox a ilk kodu gonderiyor yeni kodu almak icin ne yapmalıyım ?
Sayfayı yeniledikten sonra yeni resmi almak için aynı işlemleri takrarlamanız yeterli.
bir onceki sorunun cevabı için teşekür ederim şimdi ben resmi aldım artık kuallanabiliyorum cok teşekür ederim yanlız bir sorum oluacak siz sanki resmin üzerindeki yazıyı okuyabiliyorsunuz benimde cektiğim resim beyaz fon üzerine siyah yazı yani cok kolay bir yazı net anlaşılır bunu nasıl okutacam acaba (örnek vermişsiniz yukarda ama kod yok onun icin ) tekrar teşekürler
selam hocam
Dim Nesne As Object
Nesne = Tarayici.Document.DomDocument.body.createControlRange()
Nesne.Add(Tarayici.Document.Images(0).DomElement)
Nesne.execCommand("Copy")
GuvenlikKodu.Image = My.Computer.Clipboard.GetImage()
burdaki images yerine sayfa üzerindeki textbox lara erişim için
images yerine forms yazıyorum ama hata veriyor acaba ordaki textleri bu şekilde doldurma şansım yokmu sayfada görülen textbox lara :)
Böyle bir şansımız elbetteki var:
Tarayici.Document.Forms(0).InputIsmi.Value="İcerik"
'InputIsmi' yerine, doldurulmak istenen input elemanının name özniteliğine yazılmış olan değer yazılmalı.
peki bu son yazdığımızın
webbrowser1.document.getelementbyid("id ismi").domelement.value
den bir farkı varmı bana kolaylık sağlarmı ?
benim amacım direkt birinci sıradaki boxların dolumu gibi bişe aslında :)
ha sendkeys komutunu da kullanabiliriz aslında ama o zamanda formun sürekli aktif olması lazım oda pek bir fayda etmez :)
Her elemanın bir isim özniteliği olmayabilir. Eğer elemanın kimlik(id) özniteliği doldurulmuşsa yazdığınız ifadeyi kullanabilirsiniz('.DomElement' denmesine gerek yok.)
Ek olarak .NET ile çalışıyorsanız şunu da kullanabilirsiniz:
webbrowser1.Document.GetElementById("ElemanınIDsi").SetAttribute("value", "Yerleştirilecek Değer")
öncelikle böyle ilgili ve siteye hassas davradnığınız için çok teşekür ediyorum hüseyin bey bilginizin ne kadar çok olduğunu inanın gördükçe .net öğrenme azmim daha cok artıyor ben sadece vb.NET calışıyorum ki nete en hakim programın da dotnet olduğunu tahmin ediyorum tekrar çok teşekür ediyorum
Hocam merhabalar. Sizin bu projelerinizi görünce bende heves ettim bu chapta okuma işine ama anlamadığım birşey var. Program chapta daki karakterlerin hangi harf yada sayı oldugunu neye göre anlıyor neyi kontrol ediyor?
Ben şöyle birşey düşündüm Misal diyelim picturebox ta A harfi var. Picturebox üzerindeki siyah yerleri taricak. x ekseni üzerinde en büyük poziitif degeri ve en küçük negatif değeri alıp kaydedicek aynısını y ekseni içinde yapıcak. Böylece elinde kare benzeri bir şekil çıkıcak. Buna göre mi kontrol ediyor tam anlayamadım.
Veya bu picturebox üzerindeki kırmızı renkli çizgiler taramayı hangi kodla yapıyor nasıl yapıyor bi anlatırmısınız rica etsem?
Sayın hocam; yazmış olduğunuz kdu kullandım ve sonuç aldım. Yanlız bir ek ricasında bulunmak istiyorum. PictureBox a aldığımız kodu text e çevirip textbox a nazıl yazdırabiliriz
Öncelikle teşekkürler çok güzel çalışma olmuş verdiğiniz kodlarla sadece captcha daki harfler pictureboxa aktarılıyor. pictureboxtan peki nasıl aktaracağız texte. Sonuçta image uzantılı txtye çevirmemiz lazım onun kodu yok mu? Gyysa.dll inceledim ama bişe anlamadım kodları yok...
WebBrowser1.Document.GetElementById("code").SetAttribute("value", Captcha.Text) yapmak istediğim olay bu...
Bahsettiğiniz konu biraz zahmetli.
Eğer böyle birşeyi sıfırdan yazmanız gerekmiyorsa, internette bir OCR kütüphanesi arayabilirsiniz. Ücretsiz sunulan bazı kütüphaneler vardı hatırladığım kadarıyla.