Dün Emre (nam-ı diğer kara) arkadaşımla internette gezerken, bir youtube video’suna denk geldik. Emre’nin bilgisayarındaki hosts dosyasında güncel youtube ip adresleri olmadığı için videoyu izleyemedik.
Aklımıza, youtube domainine ait ip adreslerini otomatik olarak bulacak ve hosts dosyasını güncelleyecek bir uygulama yazmak geldi. Öğle yemeğine çıkmamıza 15 dakika olduğu için, bunu bir yarışa dönüştürmeye karar verdik.
İşte Yarışmanın Kuralları;
Sizinde 15 dakikanız var, code challenge‘ımıza katılmak ister misiniz?
Benim çözümümü görmek için
Ben öncelikle http://www.hcidata.info/host2ip.cgi adresindeki formu inceleyerek başladım;
WebRequest sınıfından bir örnek oluşturdum, sayfanın çıktısını GetResponse() methodu ile alarak WebResponse sınıfında bir nesnede sakladım. StreamReader nesnesini kullarak, sayfanın HTML çıktısını string tipinde bir değişkene atadım.
v{1-24}.lscache{1-8}.c.youtube.com adreslerinin ip adreslerini bulmak için içiçe iki paralel for döngüsü kurdum.
response değişkeninde oluşan HTML’i parse ederek, ip adresine ulaştım.
hosts dosyasında youtube.com adresli satırları bulmak ve güncellemek için .Net Regular Expression (Regex) classını kullandım.
Son olarak, bu kodları fonksiyon haline getirdim;
private void btnIPBul_Click(object sender, EventArgs e) { txtHosts.Clear(); StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format(“{0}\t{1}”, FindIP(“youtube.com”), “youtube.com”)); sb.AppendLine(string.Format(“{0}\t{1}”, FindIP(“www.youtube.com”), “www.youtube.com”)); sb.AppendLine(string.Format(“{0}\t{1}”, FindIP(“img.youtube.com”), “img.youtube.com”)); Parallel.For(1, 9, iLoop => { Parallel.For(1, 25, yLoop => { string url = string.Format(“v{0}.lscache{1}.c.youtube.com”, yLoop, iLoop); sb.AppendLine(string.Format(“{0}\t{1}”, FindIP(url), url)); }); });
txtHosts.Text = sb.ToString(); }
private string FindIP(string AddressToLookUp) { WebRequest r = WebRequest.Create(string.Format(“http://www.hcidata.info/host2ip.cgi?domainname={0}&findIP=Find IP Address&ipaddress=127.0.0.1”, AddressToLookUp)); WebResponse s = r.GetResponse();
StreamReader sr = new StreamReader(s.GetResponseStream(), Encoding.UTF8);
string response = sr.ReadToEnd();
sr.Close();
s.Close();
string ipAddress = response.Substring(response.IndexOf("IP Address : ") + 13, 16);
return ipAddress.Substring(0, ipAddress.IndexOf("\n")); }
private void btnHostsGuncelle_Click(object sender, EventArgs e) { if (txtHosts.Text == “”) btnIPBul.PerformClick();
Regex r = new Regex(@"^(.*youtube\.com)");
StringBuilder sb = new StringBuilder();
foreach (string line in File.ReadAllText(@"C:\Windows\System32\drivers\etc\hosts").Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
if (!r.IsMatch(line))
sb.AppendLine(line);
sb.AppendLine();
sb.AppendLine();
sb.AppendLine("# youtube.com IP'leri Buradan Başlıyor");
sb.Append(txtHosts.Text);
File.WriteAllText(@"C:\Windows\System32\drivers\etc\hosts", sb.ToString()); }
Uygulamanın kodlarını buradan indirebilirsiniz.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484