AtasoyWeb - Hüseyin Atasoy
AtasoyWeb
Hüseyin Atasoy'un Programlama Günlüğü

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()
Yazar: Hüseyin Atasoy
Posted: 02/11/2009 09:35
Keywords: pictureboxtan resim aktarmak, dinamik resim, captcha, güvenlik kodu

Leave Comment

 
You are replying to comment #-1. Click here if you want to cancel replying.

 

Comments (21)

Hüseyin Atasoy
Reply
31/10/2010 09: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ğ
Reply
01/11/2010 01: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
Reply
01/11/2010 19:34
#4

Rica ederim...

Turgut Akdağ
Reply
03/11/2010 00: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
Reply
03/11/2010 21: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
Reply
27/02/2011 19: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
Reply
27/02/2011 20: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
Reply
28/02/2011 17:13
#9

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

aydın kaya
Reply
28/02/2011 19: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
Reply
01/03/2011 09:00
#11

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

aydın kaya
Reply
24/03/2011 15: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
Reply
24/03/2011 16: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
Reply
24/03/2011 18: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
Reply
24/03/2011 19: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
Reply
24/03/2011 22: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
Reply
26/03/2011 11:58
#17

Rica ederim. İyi çalışmalar.

Selami
Reply
22/06/2012 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
Reply
12/07/2012 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
Reply
27/08/2012 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
Reply
21/09/2012 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.

 
Şu an bu sayfada 1, blog genelinde 3 çevrimiçi ziyaretçi bulunuyor. Ziyaretçiler bugün toplam 532 sayfa görüntüledi.
 
Sayfa 63 sorgu ile 0.237 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2024 Hüseyin Atasoy