10.08.2008

Google App Engine Üzerinden YouTube'a Nasıl Erişilir?

Bu yazıda Google App Engine kullanarak Türkiye’den erişilebilen YouTube proxy uygulaması nasıl oluşturulur, onu öğreneceğiz. Bu, ucuz reklamlar ve ‘ninja hakaretlerinin’ yer almadığı, sıfır maliyetli ve Google engellenmediği sürece varlığını sürdürecek basit bir uygulama olacak. İki tane çalışan YouTube uygulamasını şuradan (evet Türkiye’den de) görebilirsiniz:

Yazıya “Meet the Sniper” videosu eşliğinde devam ediyoruz :). App Engine YouTube uygulamanın nasıl çalıştığını merak ediyorsanız, okumaya devam edin.

Google App Engine Nedir?

Bildiğiniz gibi Google bir süre önce çok şık bir hareket yaptı, ve muhteşem altyapısının bazı parçalarını Google App Engine adıyla paketleyerek kamuoyuna sundu.

Google App Engine, Google mimarisinden faydalanarak web uygulamaları geliştirmenizi ve yayınlamanızı sağlayan bir platform. Üstelik bedava.

Bu sayede mesela kullanıcı zaten Google üyesi ise, bu kişiye ait kullanıcı adı, email gibi bilgileri kullanabiliyorsunuz, hatta Google Query Language (GQL) ile de erişebildiğiniz bir veritabanınız, imaj işlemleri yapabilmenizi sağlayan Images API‘ınız ve üstüne mail falan da yollamanızı sağlayan Mail API cabası.

Google App Engine sayesinde Google’ın hem CPU gücünden, hem depolama gücünden, etinden sütünden herşeyinden faydalanabilirsiniz. Bu henüz ilk sürüm, ileride bunu bir çeşit iş modeli haline getireceklerine kuşku yok. Hatta Users API ile uğraşırken, Google’ın internetin “kullanıcı veritabanı” olması gerektiğine bile karar verdim. Kesinlikle kullanıcı işini bu adamlar halletmeli. Bırakalım e-mailleri falan Google toplasın.

Google App Engine, arkasında Guido Von Rossum gibi bir idolün de bulunduğu, ‘internetin framework’ü olabilecek potansiyelde, Google ile birlikte nefes alan bir platform :).

Daha detaylı bilgi ve dökümantasyon için, http://code.google.com/appengine/docs/ adresine gözatın.

Hangi programlama dilleri destekleniyor

App Engine servisi şimdilik sadece Python ile kodlayabiliyorsunuz, ama Ruby, PHP gibi dilleri de implemente etmeleri an meselesi. (Bunun gibi bir Ruby on Rails servisine de heroku.com adresinden ulaşabilirsiniz.)

Görülen o ki, bir takım limitler koymuşlar. Mesela boyutu 1mb den fazla olan HTTP responselar bloklanıyor, günlük 2GB trafik limitiniz ve toplam 500MB dosya depolama izniniz var. Yine de appengine küçük ve orta ölçekli işler için uygun. Hatta büyük ölçekli işlerde de yardımcı bir backend olabilir.

App Engine YouTube uygulamsına başlamadan önce

Bu yazı zaten ‘derdinizi anlatacak kadar’ Python bildiğinizi ve bir appengine uygulaması kurmuş ve çalıştırmış olduğunuzu varsayarak yazıldı. Eğer bu konularda hiç bir fikriniz yoksa, önce Google App Engine indirin. Sonra 10 adımda nasıl appengine uygulaması çalıştırılır öğrenin ve buraya dönün. Bu işlem yaklaşık 20 dakikanızı alacak.

Python’a bir kaç saat içinde güzel bir başlangıç yapmak isterseniz, bedava dağıtılan “A Byte of Python” kitabına göz atabilirsiniz.

Başlıyoruz…

Öncelikle uygulamanıza ait dosyaları koyacağınız klasörü oluşturun, benimkinin adı “itube” olacak.

Başlangıç için bu itube klasörü altında “app.yaml” adinda bir dosya oluşturuyorum, bu dosya içerisinde uygulamam ile ilgili bir takım önemli bilgileri ve URL Handler ları tanımlıyorum.

app.yaml

application: itube
version: 1
runtime: python
api_version: 1

handlers:
- url: /assets
  static_dir: assets
- url: /.*
  script: itube.py

application kismini kendi uygulamanızın ID si ile değiştirin. /assets klasörü altındaki dosyalar statik dosyalar, geri kalan herşey itube.py dosyasının kontrolünde olacak.

Bakalım itube.py ne yapıyor.

itube.py

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import urlfetch
from urlparse import urlparse
import re

class MainPage(webapp.RequestHandler):

    def get(self):

        self.response.headers['Content-Type'] = 'text/html'

        baseurl = "http://www.youtube.com"
        requrl = urlparse(self.request.url)
        url = baseurl + requrl.path + "?" + requrl.query

        result = urlfetch.fetch(url, allow_truncated=True)

        if result.status_code == 200:
            s = result.content

            # regex işlemlerini şimdilik sadece video izleme sayfasında yapıyoruz
            if requrl.path == '/watch':

                # Video dosyasının gerçek adresini bulabilmek için uygulanan işlem
                yt_video_id = re.search("\"video_id\": \"((.*))\", \"l\"", result.content).group(1)
                yt_t = re.search("\"t\": \"((.*))\", \"hl\"", result.content).group(1)
                # Bu bilgi "assets/base.js" dosyasında, flashVars olarak atanmak üzere JS olarak da tanımlanıyor
                # swfArgs tanımlanmazsa SWF Object hata veriyor
                s = re.sub("swfArgs(.*)", "swfArgs = {};\nvar ytVideoId = '"+yt_video_id+"';\nvar ytT = '"+yt_t+"';\n", s)

                # YouTube'un kendi playerına harici FLV dosyalarını oynattıramayacağımız için,
                # YouTube playerı yerine kendi playerımızı yüklüyoruz
                s = re.sub("swfUrl(.*)", "swfUrl = 'http://itube.appspot.com/assets/player.swf';", s)

                # Aynı işlemi JS dosyası için de yapıyoruz ki, bu dosya üzerinde rahatlıkla hareket edebilelim
                # YouTube çoğu işlemi Ajax numaralar ile yapıyor, login falan yapılabilmesi için Javascript'e ince ayar çekmek gerekecek
                s = re.sub("type=\"text/javascript\" src=\"(.*)\"></","type=\"text/javascript\" src=\"http://itube.appspot.com/assets/base.js\"></", s)

            # Sonucu göster
            self.response.out.write(s)
        else:
            print 'ofmg'

application = webapp.WSGIApplication([('/', MainPage), ('/.*', MainPage)], debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Önemli detayları kod üzerinde yorumlarla yazdım, itube.py dosyası kısaca, kendisine gelen tüm GET requestlerini aynı şekilde YouTube’a sorgulatıp sonucu dönüyor. Bu sırada eğer video izleme sayfasındaysak, gelen sonuç biraz değişiyor.

Buraya kadar yaptığımız işlem sonucunda, text/html dosyaları appengine üzerinden nasıl proksifiye edeceğimizi gördük. Eğer uygulamayı appengine üzerinde çalıştırırsanız, videoları izleyemediğinizi göreceksiniz :( Bunun sebebi YouTube’un video playerının dosyaları youtube.com üzerinden açmaya çalışması. Elimizde bu flash playerın açık kodu olmadığı için gerekli kısımları değiştiremiyoruz. O halde yeni bir player yazmak durumundayız. İşimizi görecek kadar özelliği olan bir flex video player kodunu itube kaynak kodunda assets klasörü altında bulabilirsiniz (assets/player.mxml)

Flash Video Oynatıcı nasıl çalışıyor?

Bu dosyayı incelerseniz FLV dosyalarının başka bir proxy sitesinden çekildiğini göreceksiniz. Bu aşamada böyle bir proxy sitesi desteği almak gerekiyordu. Zira appengine’ın limitlerinden bahsetmiştik. Appengine üzerinden video/flv dosyalar da indirmek mümkün, ama bu dosyaları YouTube’dan request edecek methodun çalışma süresi 10 sn olarak kısıtlanmış, eğer 10 sn içinde dosyayı alamazsa hata veriyor. 10 sn içinde alsa bile response limit 1048kb. Yani 1Mb ın üstünde videoları bu şekilde indirmek mümkün değil. Belki bir takım yöntemleri var, ama uygulamanın da en azından biraz kalıcı olmasını istediğimden video dosyalarının yükünü bir proxye aktaracağım.

Proxy nasıl dağıtık çalışıyor?

Bunun için tek bir proxy sitesini hedef almak yerine, genel olarak kullanılan bir “Proxy sitesi oluşturma sistemi” ni kurban seçmek daha akıllıca olurdu. Bu günlerde Glype adında PHP ile yazılmış sevimli bir proxy sitesi yapma uygulamasıyla tanıştım. Glype ile oluşturulmuş hakkaten çok-çok fazla proxy sitesi var mı bilemiyorum, ama bunların bir listesi var.

player.mxml dosyasında görecekleriniz bunlardan ibaret. Bu dosya aynı zamanda SWF derlenmiş olarak kaynak kod içerisinde bulunabilir (assets/player.swf)

Yeni video oynatıcımızı derledikten sonra, sıra bunu doğru değerlerle sayfaya yerleştirmeye geldi. Bunun için YouTube’un base javascript dosyasında bazı değişiklikler yapmak gerekiyor. Bu dosyayı daha iyi kontrol edebilmek için, daha önce kaydettim ve kaynak kod da “assets/base.js” altında bulunabilir. Orjinal dosya ile tek farkı 1575. satırdan başlayan writeMoviePlayer() fonksiyonu. Bu fonksiyonu, video player ile uyumlu olsun ve FLV dosyasını bulabilmek için gerekli bilgileri sağlasın diye şu şekilde değiştirdim:

function writeMoviePlayer(player_div,force){
var fo = new SWFObject(swfUrl,”movie_player”,”480″,”385″,”7″,”#000000″);
fo.addParam(‘flashvars’,'ytVideoId=’+ytVideoId+’&ytT=’+ytT);
fo.addParam(“allowfullscreen”, “true”);
player_written=fo.write(player_div);
return fo;
}

Gördüğünüz gibi bu işlemi de yaparken, YouTube’un SWFObject‘ inden faydalanmış olduk.

Uygulamayı nasıl çalıştıracaksınız?

Tüm bu aşamaları atlattıysanız, uygulamanızı appengine’e yüklediğinizde YouTube izleyebileceksiniz.

Henüz oldukça eksiği var, mesela POST requestlerine hiç yanıt vermiyor, bu yüzden Login falan olunamıyor. Ama Users API ile de login olma olasılığı var gibi. Hatta sırf YouTube’a özel bir API çıkarırlar diye düşünüyorum. Ajax fonksiyonların adam akıllı çalışabilmesi bir takım düzenlemeler yapılması gerekiyor. Bazı videolarda HTML yapısı da değişiyor, ona bakmak gerek.

Bana sadece “videoları aratayım bulayım ve izleyeyim” yettiği için, bir süre bu kadarıyla yetineceğim.

App Engine YouTube uygulaması kaynak kodu

Geliştirmek isterseniz kaynak koda http://code.google.com/p/itube-appengine/ adresinden ulaşabilirsiniz.

Eğer böyle bir işe kalkışırsanız bu başlığa bir yorum sallayarak, beni de gelişmelerden, isteklerden haberdar ederseniz sevinirim.

http://sansursensin.com/watch?v=hkb3r9filcM

İyi seyirler :)

Konuyla ilgili önceden düğümküme’de yazılanları hatırlayalım:

25.09.2007

İnternet Yasağı Nasıl Aşılır?

Çabuk yoldan bilgisayarımı, ağımı sansürden kurtarmak istiyorum ne yapmalıyım? Bağlı olduğunuz servis sağlayıcının DNS sunucularını değil, başka sunucuları kullanabilirsiniz. (Ağ ayarlarından ‘Otomatik DNS sunucusu adresi al’ seçeneğini elle değiştirin. Bu ayarı router veya kablosuz ağ cihazınızın içerisinden değiştirebilecek beceriniz varsa eşi dostu da serbest bırakmış olursunuz)

Pardus DNS
Birincil (Primary)      : 193.140.100.210
İkincil    (Secondary) : 193.140.100.215

Comodo DNS
Birincil (Primary)      : 156.154.70.22
İkincil    (Secondary) : 156.154.71.22

Google Public DNS
Birincil (Primary)      : 8.8.8.8
İkincil    (Secondary) : 8.8.4.4

OpenDNS
Birincil (Primary)      : 208.67.222.222
İkincil    (Secondary) : 208.67.220.220

PC’ler için (Sağ alt köşede kıpraşan ağ belirtecine sağ tuş sonra özellikler)

Apple Mac bilgisayarlar için (System Preferences / Network / Airport (?) / Advanced / DNS)

Bu ve benzeri çözümleri hepimiz kullanıyoruz, lakin bu hizmeti babamızın hayrına vermediklerini de bilelim. Google 24 saatlik bir zaman dilimi içerisinde IP adreslerimizi ve ağa nereden bağlandığımız bilgilerini kaydediyor. 24 saat sonra IP adresi bilgilerini siliyor, diğer gezinti bilgilerini muhtemelen daha sonra işlemek ve gerektiğinde kullanmak üzere rafa kaldırıyor. OpenDNS de gizlilik bildirgesinde iki iş günü içerisinde IP adresi kayıtlarını sildiklerini belirtmiş, gerisini fazla kurcalama diyor.

Hiç yoktan iyidir güzel yurdumun engellenmeye çalışılan insanları. Yukarıda anlatılanlar en kolay yöntemdir, elbette daha başka metodlar da var. Bu yazı yayınlandıktan sonra yorum yazmak suretiyle yapılan katkılar şahane birikim oluşturmuştu, aşağıya göz atmayı da ihmal etmeyin.

Hazır güncelleme yapmışken (Mayıs 2010) eski bilgileri sildim.

Hepimize özgür gezintiler!


Düğümküme’de konu ile ilgili yazılmış yazılar:

Biri Bu Adamı Durdursun, Etkin Çiftçi
http://www.dugumkume.org/biri-bu-adami-durdursun

Youtube’a Türkiye’den erişim, Türk Mahkemesi Tarafından Engellendi!, Dara Kılıçoğlu
http://www.dugumkume.org/youtube-turk-mahkemesi-tarafindan-engellendi

Mahkeme Kararıyla Internet Sitesi Kapattırma Formu, Burak Arıkan
http://www.dugumkume.org/mahkeme-karariyla-internet-sitesi-kapattirma-formu

İfade Özgürlüğü Yazılımları, Ali Miharbi
http://www.dugumkume.org/ifade-ozgurlugu-yazilimlari

08.03.2007

İfade Özgürlüğü Yazılımları

Bir yandan Amerikan şirketleri, Internet sansürü konusunda dünyada bir numara olan Çin hükümeti için filtrelemeye yönelik yazılım projeleri geliştirirken, öte yandan buna tepki olarak bağımsız bazı oluşumlar hükümetlerin engellediği sitelerin veya koydukları filtrelerin etrafından dolaşabilecek sistemler geliştiriyorlar. Bu sistemlerin ortak özelliği Internet kullanıcısını anonimleştirmeleri ve istedikleri bilgiye proxy’ler yoluyla ulaşmalarını sağlamaları.

Anonymizer, özel kişilere ve şirketlere satılan bir yazılım iken, şimdi Çin ve diğer politik ve dini nedenlerden Internet’i sansürlenen ülkelere yazılımlarını ücretsiz vermeyi planlıyorlar.

Tor, Cambridge’li bir grup gönüllünün başlattığı bir proje. Çalışma prensibi, kullanıcıların bant genişliklerindeki boşlukları paylaşmak, böylelikle hem kullanıcılara anonimlik sağlamak hem de sansürlenen ülke kullanıcılarının içeriğe dolaylı yoldan ulaşmalarını sağlamak.

psiphon.jpg

Toronto Üniversitesi’nde GPL lisanslı Psiphon projesi de Tor’a benzer bir şekilde çalışıyor. Tor’dan ve Anonymizer’dan ve yine benzer şekilde çalışan Circumventor‘dan bir farkı, özellikle sansüre karşı başlatılmış bir girişim olması. Bu elbette yazılımın okullar gibi bazı içeriğin geçerli olabilecek nedenlerle kısıtlandığı mekanlarda kullanılmasına engel değil. Anonimlik için geliştirildiğinden, Tor; Psiphon ve Circumventor’un aksine, sansürlü ülke dışındaki birinden doğrudan yardım almadan çalışabilse de bu Tor’u IP filtreleme yoluyla daha kolay bloke edilebilir kılıyor.

İlginç olan, Tor ve Anonymizer’ın ABD hükümeti ve ordusu tarafından anonim olarak bilgi toplama ve Ortadoğu’daki askerleri ile bağlantı kurma gibi kullanımlarından ötürü destek almaları. Oysa 10 yıl kadar önce aynı şifreleme teknolojisi teröristler ve kanun kaçakları da kullanabilir korkusuyla ABD tarafından yasaklanmıştı. Şu anda şifreleme ve web’de anonim surf yapma özgürlük araçları olarak görülüyor.

tor-revealed.jpg

Anonymizer, Psiphon ve Tor kullanıcının ulaşmak istediği hedefin gizlenmesi yoluyla çalışıyor. Veriler şifrelenerek özel proxy makinalarına aktarılıyor, sansür uygulanmayan batı ülkelerinde bulunan bu proxy sunucular da içeriği kullanıcıya aktarıyor.

Bu programlar aslında sansür uygulayan ülkeler tarafından engellenemez nitelikte değil. Psiphon ve Anonymizer için hükümetler şu yöntemleri kullanabilir:

  • Hostname’i SSL sertifikasıyla uyuşmayan sitelerin bloke edilmesi (Çin’in IP güvenlik duvarından ziyade Ortadoğu’da kullanılan proxy sunucu sansürlemesi için daha uygun bir yöntem)
  • Konutlara verilen IP aralıklarına yapılan web bağlantılarının bloke edilmesi

Belli açıkları olmalarına rağmen, şu an için bu yazılımların engellenmesi için sansürcü hükümetlerce fazla bir çaba sarfedilmiş değil. Şu an için çok yaygın kullanılmadıklarından fazla önemsenmiyorlar olabilirler. Belki de, bu yazılımların fazla yaygın olmamalarında en büyük etken, ifade özgürlüğünün kısıtlandığı ülkelerdeki insanların, hükümetlerin sansür için gösterdikleri gerekçeleri haklı bulmaları ve sansürü kabullenmeleri.