Ana Sayfa > C#, Programlama > Twitter Arama – Twitter Search

Twitter Arama – Twitter Search

10 Aralık 2009

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;

TwitterSearch_1

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ü;

TwitterSearch_2

İsterseniz uygulamanın kodlarını buradan indirebilirsiniz.


İlgili diğer başlıklar:



  1. Temmuz 10th, 2011 at 17:39 | #1

    Yaklaşık 1 günden beri bu programı arıyordum :) Eline sağlık

  2. ercan
    Ocak 3rd, 2012 at 23:59 | #2

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