Visual Basic
 
Üye Girişi
E-mail:

Şifre:



 
Blog Arama Motoru
 
Email Aboneliği
Yeni yazılar yazıldığında email adresinize bildirim gelmesini isterseniz aşağıdaki formu doldurabilirsiniz.
(Hizmet FeedBurner tarafından sağlanmaktadır.)

Email:

 
 
WebBrowserdan PictureBoxa Dinamik Resim Aktarımı
Captcha resmi picturebox içine kopyalanıyor.   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ı. Bunu yapmanın yolunu uzun süre aradıktan sonra buldum...

   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.

   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(Javascriptteki gibi). 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 kodu:
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 kodu(arada çok az bir fark var):
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()

   Captcha okutmaya çalışıyorsanız bunun o kadar kolay bir iş olmadığını anlamışsınızdır. Hele de ttnet, oldukça gürültülü resimler gösteriyor. Önceleri "Arkaplan resimlerini elde edersem, karakterleri saf olarak ayıklayabilirim" diye düşünmüştüm ama ttnet gelen resimlerin kalitelerinde bile değişiklik yapıyor. Yani aynı arkaplanın kullanıldığı güvenlik kodlarında bile belli bir pixel farklı renk değerlerine sahip oluyor. Ama ttnetin karakterleri okumamıza engel olabilmesi için daha çok uğraşması lazım. Rapidshare'in kedili köpekli güvenlik kodları vardı. Onlar gibi olabilir mesela. Ama buna ttnet neden buna ihtiyaç duyuyor anlamıyorum. Program kontrol etsin kotayı ne olacak? Neyse zor bir iş, kolay gelsin...
Yayınlanma Tarihi: 02 Kasım 2009 Pazartesi - 08:35
Anahtar Kelimeler: visual basic, basic.net, picturebox, resim aktarmak, dinamik resim, execCommand, captcha, ttnet, güvenlik kodu
Yorumlar ( 17 )
aydın
#8

27/02/2011, 19:12

tamamdır resmi buldum ama sayfayı yenilediğim zaman yine picturebox a ilk kodu gonderiyor yeni kodu almak icin ne yapmalıyım ?
Hüseyin Atasoy
#9

28/02/2011, 16:13

Sayfayı yeniledikten sonra yeni resmi almak için aynı işlemleri takrarlamanız yeterli.
aydın kaya
#10

28/02/2011, 18:00

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
Hüseyin Atasoy
#11

01/03/2011, 08:00

Şu konuya göz atabilirsiniz:
http://www.atasoyweb.net/blog/yapay-sinir-aglari-k5s0/gyysa.dll-ile-ocr-y102.html
aydın kaya
#12

24/03/2011, 14:45

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 :)
Hüseyin Atasoy
#13

24/03/2011, 15:29

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ı.
aydın kaya
#14

24/03/2011, 17:54

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 :)
Hüseyin Atasoy
#15

24/03/2011, 18:21

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")
aydın kaya
#16

24/03/2011, 21:37

ö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
Hüseyin Atasoy
#17

26/03/2011, 10:58

Rica ederim. İyi çalışmalar.
Yorum/Görüş Bildir
Yorumları html kodu veya özel karakter kullanmadan, yazım kurallarına
dikkat ederek ve düzgün bir Türkçe kullanarak yazalım...
 
Atasoy Blog v3.0 © 2009-2012 Hüseyin Atasoy | Tema Tasarımı: Hüseyin Atasoy