Twitter Arama – Twitter Search
Bu yazımda, Twitter‘da arama yapan bir uygulama yazacağım. Siz de yazıyı baştan sona takip ederek, kendi twitter arama uygulamanızı yazabilirsiniz.
Hemen ekran tasarımımızı yapmakla işe başlayalım;

Sayfadaki elemanlar;
- txtSonucAdet
- txtSayfa
- btnGeri
- btnIleri
- txtArama
- btnArama
- flowLayoutPanel1
Öncelikle Twitter Search API‘sini inceleyelim;
Search fonksiyonu geriye JSON formatında bilgi döndürüyor. Uygulamalarınızda JSON verilerini kullanabilmek için, şu sayfadan bulabileceğiniz JSON parser class’ını kullanabilirsiniz.
Şimdi, butonların (btnArama, btnGeri, btnIleri) Click olayını yazalım;
private void btnArama_Click(object sender, EventArgs e)
{
txtSayfa.Text = "1";
AramaYap();
}
private void btnGeri_Click(object sender, EventArgs e)
{
int Sayfa = Convert.ToInt32(txtSayfa.Text) - 1;
txtSayfa.Text = Sayfa < 1 ? "1" : Sayfa.ToString();
AramaYap();
}
private void btnIleri_Click(object sender, EventArgs e)
{
txtSayfa.Text = (Convert.ToInt32(txtSayfa.Text) + 1).ToString();
AramaYap();
}
Butonların Click olaylarının kalbinde AramaYap() methodu yatıyor. Hemen yazalım;
private void AramaYap()
{
flowLayoutPanel1.Controls.Clear();
WebRequest wr = WebRequest.Create(string.Format("http://search.twitter.com/search.json?q={0}&rpp={1}&page={2}", txtArama.Text, txtSonucAdet.Value, txtSayfa.Text));
Stream s = wr.GetResponse().GetResponseStream();
StreamReader sr = new StreamReader(s);
string Sonuc = sr.ReadToEnd();
Hashtable hs = (Hashtable)JSON.JsonDecode(Sonuc);
foreach (Hashtable oItem in (ArrayList)hs["results"])
flowLayoutPanel1.Controls.Add(CreateTwitItem(oItem));
}
AramaYap() method’unda ilk iş, flowLayoutPanel’i temizliyoruz.
Daha sonra, Twitter Search API‘den öğrendiğimiz gibi, http://search.twitter.com/search.json adresine uygun parametreler ile sorgu atıyoruz.
Gelen bilgi JSON formatında olduğu için, JSON parser class’ımızı kullanıyoruz (JSON.JsonDecode) ve sonuç bilgisini Hashtable formatına çeviriyoruz.
Hashtable‘ın results öğesi ArrayList formatındadır ve arama sonucunun herbir satırını ifade etmektedir. Bu yüzden basit bir foreach döngüsü ile flowLayoutPanel’e ekleme yapıyoruz.
flowLayoutPanel’e ekleyeceğimiz her nesne CreateTwitItem fonksiyonunda oluşturuluyor;
private Panel CreateTwitItem(Hashtable TwitItem)
{
Panel p = new Panel();
string from_user = TwitItem["from_user"] != null ? TwitItem["from_user"].ToString() : "";
string to_user = TwitItem["to_user"] != null ? TwitItem["to_user"].ToString() : "";
string text = TwitItem["text"] != null ? TwitItem["text"].ToString() : "";
string profile_image_url = TwitItem["profile_image_url"] != null ? TwitItem["profile_image_url"].ToString() : "";
string tweet_id = TwitItem["id"] != null ? TwitItem["id"].ToString() : "";
DateTime created_at = TwitItem["created_at"] != null ? DateTime.Parse(TwitItem["created_at"].ToString()) : DateTime.Now;
string twitter_url = string.Format("http://twitter.com/{0}/statuses/{1}", from_user, tweet_id);
p.Size = new Size(flowLayoutPanel1.Width - 23, 60);
p.BorderStyle = BorderStyle.FixedSingle;
PictureBox pb = new PictureBox();
pb.Dock = DockStyle.Left;
pb.Size = new Size(50, 50);
pb.BorderStyle = BorderStyle.FixedSingle;
pb.Load(profile_image_url);
Label l1 = new Label();
l1.AutoSize = false;
l1.Location = new Point(pb.Width, 2);
l1.Size = new Size(300, 15);
l1.Text = string.Format("@{0} -> @{1} ({2} {3})", from_user, to_user, created_at.ToShortDateString(), created_at.ToShortTimeString());
Label l2 = new Label();
l2.AutoSize = false;
l2.Location = new Point(pb.Width, 19);
l2.Size = new Size(flowLayoutPanel1.Width - pb.Width - 20, 38);
l2.Text = text;
LinkLabel l3 = new LinkLabel();
l3.Text = "Sayfaya Git";
l3.Location = new Point(flowLayoutPanel1.Width - (l3.Width - 10), 2);
l3.Click += delegate { Process.Start(twitter_url); };
p.Controls.Add(pb);
p.Controls.Add(l1);
p.Controls.Add(l2);
p.Controls.Add(l3);
p.MouseEnter += delegate { p.BackColor = Color.LightYellow; };
pb.MouseEnter += delegate { p.BackColor = Color.LightYellow; };
l1.MouseEnter += delegate { p.BackColor = Color.LightYellow; };
l2.MouseEnter += delegate { p.BackColor = Color.LightYellow; };
p.MouseLeave += delegate { p.BackColor = SystemColors.Control; };
l2.MouseLeave += delegate { p.BackColor = SystemColors.Control; };
return p;
}
CreateTwitItem() fonksiyonunda bir Panel nesnesi oluşturup, içerisine bir picturebox, iki label, bir linklabel ekliyoruz ve geriye Panel nesnesini döndürüyoruz. Böylece foreach’in her adımında flowLayoutPanel’e yeni Panel nesnesi ekleniyor.
Uygulamamızı çalıştırıyoruz ve işte örnek ekran görüntüsü;

İsterseniz uygulamanın kodlarını buradan indirebilirsiniz.
İlgili diğer başlıklar:
- C# ile Google Url Kısaltma Servisini Kullanmak
- C# ile Ping Uygulaması
- C# Null Coalescing (??) Operatörü
- Birkaç Faydalı Extension Method
- C# String Dizisini String Uzunluğuna Göre Sıralama
- C# ile Web Sayfasından Sözlük Oluşturma
- C# ile Image Crawler Uygulaması
- C# ile Google PageRank Bulma
- Code Challenge #1
- Kelimenin son harfi ile başlayan kelime oyunu
Yaklaşık 1 günden beri bu programı arıyordum :) Eline sağlık
öncelikle detaylı anlatım ve örnek için teşekkurler
ben aynı örneği web tabanlı yapmak istiyorum. Sizin AramaYap methodunuzdaki kullandiğiniz WebRequest in yerine ne kullanmam gerekiyor json data yı çekebilmek için?
XML için XDocument xx= XDocument.Load(url) kullanmak yeterli oluyordu fakat JSON için ne kullanacağımı bilemedim. Yardımcı olursanız memnun olurum.