4 Temmuz 2013 Perşembe

Bir Web Sitesindeki E-Mail Adreslerini Yakalamak

       Gene şu sıkıcı düzenli ifadeler değil mi? Bu makalede düzenli ifadelerin ne kadar etkileyici olduğunu bir örnek üzerinde anlatmaya çalışacağım.
Web sitelerinin birebir kopyasını kendi bilgisayarınıza kopyalayan ( Teleport gibi) programları bilirsiniz. Önce bir sayfanın kaynak kodunu indirir. İçindeki linkleri ve resim dosyalarını belirler. Sonra sıra bu link ve resim dosyalarına gelir.

Hiç elinizdeki kaynak kodun linklerini nasıl ayıklayacağınızı düşündünüz mü?
İşte düzenli ifadeler burada gerçekten harikalar yaratır.
Fazla uzatmadan örneğimize geçelim...

E-Mail Yakalayıcı

Şimdi yapacağımız örnekte önce bir web sitesinin kaynak kodunu indirip, içerisindeki e-mail linklerini elde edeceğiz.
Öncelikle sayfanın kaynak kodunu indirelim
Bunun için iki basit metod yazdım. İlki sayfanın adresini kullanıcıdan alıyor, ikincisi sayfaya bağlanıp kaynak kodu indiriyor :


// Adresi Alan Metod :
private string AdresiAl()
{
string adres="http://" + txtAdres.Text;
return adres;
}

// Sayfanın Kaynak Kodunu Döndüren Metod :
private string KaynakAl(string adres)
{
lblStat.Text="Siteye Bağlanıyor...";
WebResponse benimResponse=null;
try
{
WebRequest benimWebRequest=WebRequest.Create(adres);
benimResponse=benimWebRequest.GetResponse();
}
// Eğer internet bağlantısı yoksa yada site adresi yanlış ise :
catch(WebException e)
{
lblStat.Text="Siteye Bağlanamıyor.";
return null;
}
// Site içeriği stream olarak alınıyor :
Stream str=benimResponse.GetResponseStream();
StreamReader reader=new StreamReader(str);
string kaynak=reader.ReadToEnd();
// Tüm içerik küçük harfle döndürülüyor.
//Daha fazla kontrol yapmamak için bir önlem

return kaynak.ToLower();
}

Sayfanın kaynak kodunu indirdikten sonra içindeki e-mail linklerini bulup bir diziye atan bir başka fonksiyon daha yazdım. Öncelikler e-mail linkini yakalayan deseni (pattern) açıklamaya çalışalım.

Bildiğiniz gibi e-mail linkleri
<a href="mailto:aaa@bbb.ccc"> gibi ifade edilir.

O zaman desenimiz (href=) ifadesi ile başlamalıdır.
Ardından (’) yada (") karakterleri gelebilir.

"(href=)((’)|(""))"

Sonra "mailto:" ifadesi gelir :


"(href=)((’)|(""))(mailto:)"

"mailto:" ifadesinden sonra istediğimiz ifade yani e-mail adresi gelir. Bunu "mail" isminde bir grup tanımlayarak elde edeceğiz.

"(href=)((’)|(""))(mailto:)(?<mail>(.*))"
// (.*) ifadesi kendinden sonra gelen desene kadar her karakteri alan bir desendir.

Şimdi desenimizi sonlandıralım :

"(href=)((’)|(""))(mailto:)(?<mail>(.*))((’)|(""))"

Kısaca, "mailto:" ile tırnak karakterleri arasındaki her ifade bizim için mail grubuna dahil oldu.

Şimdi E-mail adreslerini dizi şeklinde döndüren metodumuzu yazalım :

// Sayfanın içindeki mail adreslerini dizi şeklinde döndüren metod :
private string[] MailAl(string kaynak)
{
lblStat.Text+= "Kaynak kod alındı... " + "Mailler ayrıştırılıyor... ";
// Desenimiz :
string mailDeseni=@"(href=)((’)|(""))(mailto:)(?<mail>(.*))((’)|(""))";
int i=0;
// Regular Expressionumuzu tanımlıyoruz :
Regex benimRegex=new Regex(mailDeseni);
Match str=benimRegex.Match(kaynak);
// Oluşturduğumuz deseni sitenin kaynak kodunda karşılaştırıyoruz :
MatchCollection mailCol=benimRegex.Matches(kaynak);
string[] mail=new string[mailCol.Count];
// Bulunan her e-mail adresini mail[] dizisine atıyoruz :
foreach(Match mailMatch in mailCol)
{
mail[i]=mailMatch.Groups["mail"].ToString();
i++;
}
return mail;
}

Şimdi Yakala butonuna basılınca icra edilecek olay kodunu yazalım :

// Şimdi e-mail yakalamak için bu yazdığımız metodları button_Click olayı ile birleştirelim :
private void btnYakala_Click(object sender, System.EventArgs e)
{
lblStat.Text="";
if(txtAdres.Text=="")
{
MessageBox.Show("Lütfen Bir Adres Girin !");
}
else
{
// Sitenin Adresini alıyoruz :
string adres=AdresiAl();
// Sitenin Kaynak Kodunu alıyoruz :
string kaynak=KaynakAl(adres);
// E-Mail adreslerini alıyoruz :
if(kaynak!=null)
{
string[] mail=MailAl(kaynak);
lblStat.Text+="İşlem sona erdi." + mail.Length + " tane mail adresi yakalandı.";
foreach(string yakalananMail in mail)
{
// Her e-mail adresi listbox’a giriliyor :
lbxEmail.Items.Add(yakalananMail);
}
}
}
}

Açıklama
Bazı sitelerde frameset kullanıldığından sayfada e-mail linki görülse bile programımız bunları döndürememekte. Bu sayfaların framelerinin linkleri verilerek e-mail adresleri elde edilebilir.
Yine bazı sitelerde linkler javascript kodu ile erişildiğinden bu adreslerde programımız tarafından erişilememektedir.




Hiç yorum yok:

Yorum Gönder