Bir bilgisayar mühendisi için programlama dili, öğrendiklerini sınadığı, deneyler yaptığı bir laboratuardır ve mühendisler deneylerini, kestiremedikleri sonuçları gözlemlemek için değil, öngördükleri sonuçları doğrulamak için yapar...

WebBrowserdan PictureBoxa Dinamik Resim Aktarımı

Webbrowser nesnesinden picturebox içerisine nasıl resim kopyalanabilir? Captcha okumak için dinamik captcha resimleri nasıl elde edilebilir?

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ı...

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()
Sayfayı
Yayın tarihi: 02 Kasım 2009 Pazartesi, 08:35
Anahtar kelimeler: pictureboxtan resim aktarmak, dinamik resim, captcha, güvenlik kodu

Yorum Gönder

 
Yorumunuzu -1. yoruma yanıt olarak gönderiyorsunuz. Yanıtlamayı iptal etmek için buraya tıklayabilirsiniz.

 

Yorumlar (21)

Hüseyin Atasoy
Yanıtla
31 Ekim 2010 Pazar, 08:05
#2

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...

Turgut Akdağ
Yanıtla
01 Kasım 2010 Pazartesi, 00:36
#3

Teşekkür ederim bu sefer çalıştı ve sitenin güvenlik kodunu formdaki picturebox a almayı başardım.

Hüseyin Atasoy
Yanıtla
01 Kasım 2010 Pazartesi, 18:34
#4

Rica ederim...

Turgut Akdağ
Yanıtla
02 Kasım 2010 Salı, 23:54
#5

Ö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.

Hüseyin Atasoy
Yanıtla
03 Kasım 2010 Çarşamba, 20:06
#6

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...

aydın
Yanıtla
27 Şubat 2011 Pazar, 18:19
#7

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...

aydın
Yanıtla
27 Şubat 2011 Pazar, 19:12
#8

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
Yanıtla
28 Şubat 2011 Pazartesi, 16:13
#9

Sayfayı yeniledikten sonra yeni resmi almak için aynı işlemleri takrarlamanız yeterli.

aydın kaya
Yanıtla
28 Şubat 2011 Pazartesi, 18:00
#10

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
Yanıtla
01 Mart 2011 Salı, 08:00
#11

Şu konuya göz atabilirsiniz: GYYSA.dll İle OCR

aydın kaya
Yanıtla
24 Mart 2011 Perşembe, 14:45
#12

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
Yanıtla
24 Mart 2011 Perşembe, 15:29
#13

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
Yanıtla
24 Mart 2011 Perşembe, 17:54
#14

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
Yanıtla
24 Mart 2011 Perşembe, 18:21
#15

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
Yanıtla
24 Mart 2011 Perşembe, 21:37
#16

ö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
Yanıtla
26 Mart 2011 Cumartesi, 10:58
#17

Rica ederim. İyi çalışmalar.

Selami
Yanıtla
22 Haziran 2012 Cuma, 12:06
#18

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?

Ömüt Can
Yanıtla
12 Temmuz 2012 Perşembe, 17:00
#19

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

Halil
Yanıtla
27 Ağustos 2012 Pazartesi, 16:44
#20

Ö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...

Hüseyin Atasoy
Yanıtla
21 Eylül 2012 Cuma, 17:47
#21

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.

 
 
Sayfa 56 sorgu ile 0.04 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2017 Hüseyin Atasoy