Digg Gezgini
PyDigg modülünü yazarken Digg apisinden haberim yoktu. Bu apiden az önce haberdar oldum. PyDigg modülünü kullanarak Digg Gezgini adında bir program geliştirmiştim. Program içerisindeki digg.com a bağlı rss adreslerini arttırma işlemi için bu siteye girdiğimde api kısmı gözüme çarptı. Ardından kısa süre içerisinde programın apiyi kullanarak işlevini yerine getirmesini sağladım. PyDigg modülüne göre doğal olarak epey hızlı çalışıyor.
Programın amacı hem digg.com içeriğine ulaşmak hem de digg.com sitesine girmeden içeriklerin kaynak adreslerine yönelebilmek. Şu anda bunu gerçekleştirebiliyor. Test sürümü olduğu için daha çok değişiklik geçireceği kesin. Kodlara aşağıdan ulaşabilirsiniz. Çalıştırabilmeniz için wxPython kütüphanesine ihtiyacınız var.
dg.py:
# -*- coding: utf-8 -*- """ { Digg.com haber başlıklarına göz atmanızı ve bu haberleri okumak için digg.com sitesine uğramadan sizi kaynak adrese yönlendiren bir program. } {Test Sürümü} Copyright (C) {11 Aralık 2007} {Ömer Ücel} omerucel@gmail.com http://omerucel.com/gunluk/digg-gezgini/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ import wx import thread import urllib2 import webbrowser import wx.lib.newevent from wx.lib.splitter import MultiSplitterWindow (KategoriAlPostala, EVT_TI_KATEGORI_AL) = wx.lib.newevent.NewEvent() (BaslikAlPostala, EVT_TI_BASLIK_AL) = wx.lib.newevent.NewEvent() API_KEY = "http%3A%2F%2Fomerucel.com%2fgunluk%2fdigg%2dgezgini" class ThreadKategoriAl: def __init__(self,parent): self.parent = parent self.adres = "http://services.digg.com/topics?type=json&appkey=%s" %(API_KEY) def Start(self): self.running = True thread.start_new_thread(self.Run, ()) def IsRunning(self): return self.running def Run(self): kategoriler = eval(urllib2.urlopen(self.adres).read()) wx.PostEvent(self.parent,KategoriAlPostala(kategoriler=kategoriler)) self.running = False class ThreadBaslikAl: def __init__(self,parent,kategori): self.parent = parent self.adres = "http://services.digg.com/stories/topic/%s?type=json&count=40&appkey=%s" %(kategori,API_KEY) def Start(self): self.running = True thread.start_new_thread(self.Run, ()) def IsRunning(self): return self.running def Run(self): basliklar = eval(urllib2.urlopen(self.adres).read()) wx.PostEvent(self.parent,BaslikAlPostala(basliklar=basliklar)) self.running = False class Cerceve(wx.Frame): def __init__(self,parent,ID,title): wx.Frame.__init__(self,parent,ID,title, wx.DefaultPosition, wx.Size(650,450)) # Alınan kategorileri tutar. self.kategoriler = {} # Alınan başlıkları tutar. self.basliklar = {} # Olay atamaları yapılıyor. self.Bind(wx.EVT_CLOSE,self.ProgramCikis) self.Bind(wx.EVT_SIZE,self.ProgramBoyutDegisimi) self.CenterOnScreen() # Panel oluşturuluyor. self.panel = wx.Panel(self,-1) # Taşıyıcı oluşturuluyor. self.kutu_tasiyici = wx.BoxSizer(wx.HORIZONTAL) self.bolum_ayirici = MultiSplitterWindow(self,style=wx.SP_LIVE_UPDATE) self.kutu_tasiyici.Add(self.bolum_ayirici,1,wx.EXPAND) # Rss listesi bölümü self.BolumRss() self.BolumIcerik() self.panel.SetSizer(self.kutu_tasiyici) self.kutu_tasiyici.Fit(self.panel) self.Fit() self.durum_cubugu = self.CreateStatusBar() self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED,self.BolumBoyutDegisimi) self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGING,self.BolumBoyutDegisimi) # Thread Bind self.Bind(EVT_TI_KATEGORI_AL,self.ThreadIslem_KategoriAl) self.Bind(EVT_TI_BASLIK_AL,self.ThreadIslem_BaslikAl) self.durum_cubugu.SetStatusText("Kategoriler alınıyor...") self.thread_kategori_al = ThreadKategoriAl(self) self.thread_kategori_al.Start() def BolumBoyutDegisimi(self,olay=None): self.il.SetSize((self.GetSize()[0]-olay.GetSashPosition()-20,self.GetSize()[1]-30)) self.il.SetColumnWidth(0,self.GetSize()[0]-olay.GetSashPosition()-20) def BolumRss(self): self.rl = wx.ListCtrl(self.bolum_ayirici,wx.NewId(),size=(200,450),style=wx.LC_REPORT) self.rl.Bind(wx.EVT_LEFT_DCLICK,self.AcKategori) self.rl.InsertColumn(0,"Kategoriler",format=wx.LIST_FORMAT_LEFT,width=200) self.bolum_ayirici.AppendWindow(self.rl,200) def BolumIcerik(self): self.il = wx.ListCtrl(self.bolum_ayirici,wx.NewId(),size=(400,450),style=wx.LC_REPORT) self.il.Bind(wx.EVT_LEFT_DCLICK,self.AcBaslik) self.il.InsertColumn(0,"Başlıklar",format=wx.LIST_FORMAT_LEFT,width=400) self.bolum_ayirici.AppendWindow(self.il,400) def AcKategori(self,olay=None): eleman = self.rl.GetNextItem(-1,state = wx.LIST_STATE_SELECTED) if eleman: self.durum_cubugu.SetStatusText("Başlıklar alınıyor...") self.thread_baslik_al = ThreadBaslikAl(self,self.kategoriler[self.rl.GetItemText(eleman)]) self.thread_baslik_al.Start() def AcBaslik(self,olay=None): eleman = self.il.GetNextItem(-1,state = wx.LIST_STATE_SELECTED) if eleman: adres = self.basliklar[self.il.GetItemText(eleman)] adres = adres.replace("\\","") self.durum_cubugu.SetStatusText("Başlık açılıyor...") webbrowser.open_new_tab(adres) self.durum_cubugu.SetStatusText("Başlık açıldı.") def ThreadIslem_KategoriAl(self,olay): no = 0 for i in olay.kategoriler["topics"]: eleman = self.rl.InsertStringItem(0,i["name"]) self.rl.SetItemData(eleman,no) kategori = { i["name"] : i["short_name"]} self.kategoriler.update(kategori) no +=1 self.durum_cubugu.SetStatusText("Kategoriler alındı.") def ThreadIslem_BaslikAl(self,olay): no = 0 self.basliklar = {} self.il.DeleteAllItems() for i in olay.basliklar["stories"]: eleman = self.il.InsertStringItem(0,i["title"]) self.il.SetItemData(eleman,no) baslik = { i["title"] : i["link"]} self.basliklar.update(baslik) no +=1 self.durum_cubugu.SetStatusText("Başlıklar alındı.") def ProgramBoyutDegisimi(self,olay=None): self.bolum_ayirici.SetSize((olay.GetSize()[0],olay.GetSize()[1]-30)) self.il.SetSize((olay.GetSize()[0]-205,olay.GetSize()[1]-30)) self.il.SetColumnWidth(0,olay.GetSize()[0]-205) self.Update() self.Refresh() def ProgramCikis(self,olay=None): try: self.thread_baslik_al.Stop() except: pass try: self.thread_kategori_al.Stop() except: pass self.Destroy() if __name__=="__main__": uyg=wx.App(0) cerceve=Cerceve(None,-1,"Digg Gezgini - Test Sürümü") cerceve.Show(True) uyg.MainLoop()