Jawbone UP İnceleme ve API Kullanımı

0 dakikada yazıldı

28717 defa okundu

Düzenle

Pedormetrelerle hiç uğraştınız mı bilmiyorum fakat son zamanlarda çok
farklı pedometreler farklı özelliklerle ortaya çıkıyorlar veya belki de
ben spora olan ilgimin hayatıma geri gelmesi ile bu durumun daha bir
farkına varmaya başladım. Her neyse, konumuz tabi ki bu değil. Pedometre
nedir? Kabaca attığınız adım sayısını sayan cihazlardır ve genelde
Accelerometer kullanırlar. Bu cihazlardan birine denk gelmediyseniz bile
kesinlikle aynı işi yapan iPhone, Android veya Windows Phone
uygulamalarına denk gelmişsinizdir. Telefonun accelerometresini
kullanarak attığınız adımları sayan bu uygulamalar pil ömrünüzden
yemekle de bilinirler :)

Tamam, geyiği bir kenara bırakıyorum. Karşınızda Jawbone Up!

Jawbone bileklik olarak kullanabildiğiniz bir pedometre ve beraberinde
birkaç güzel özellikle daha geliyor. Yukarıdaki videoda da anlatmaya
çalıştığım üzere :) adımlara sayıyor, titreşim ile sizi uyandırabiliyor,
uyku sürenizi ölçüyor ve gün içerisinde aktivitenizi olabildiğince
arttırmak için de arada sırada sizi dürtükleyebiliyor. 10 gün pil ömrü
ile rakipleri arasında ciddi şekilde dikkati çekiyor. Tabi bunu dijital
bir ekran ve bluetooth bağlantı özelliklerine sahip olmadığı için
yapabiliyor. Yine de 10 gün pil ömrü candır. Her gün şarj etmek zorunda
olduğunuz 80 milyon cihaza bir tane daha eklensin istemeyeceğinizden
eminim.

Cihazla ilgili kısa bir inceleme videosu (yukarılarda) yayınlamanın yanı
sıra ben biraz da araştırma yaparak bu cihazın ürettiği veriyi kendi web
sitesinden nasıl çekeriz kısmı üzerine çalıştım. Maalesef açık bir
şekilde developerlarla paylaştıkları API'leri yok. Rezaletin dik alası.
Neyse, bildiğim kadarı ile uygulama entegrasyonu düşünürseniz Jawbone
ile iletişime geçip API'lerine full erişim sağlayabiliyorsunuz ama benim
istediğimiz sadece salt "Read-Only" erişimdi. Yani doğrudan bir
entegrasyon senaryom yoktu. O nedenle biraz araştırdım ve internette
Jawbone API'lerini reverse engineering yöntemleri ile bulan arkadaşlarla
karşılaştım. Üzerine birazcık daha uğraşıp mini mini bir wrapper yazdım
:) Kaynak kodlarını da Github'a attım ki ilgilenenleriniz katkıda
bulunabilsin :)

[Github]

Jawbone API Erişimi Testleri Kaynak
Kodu

Bu işler nasıl oluyor derseniz, gelin hızlıca bir göz atalım.

[C#]

        private HttpClient aClient = new HttpClient();
        public HttpClient Client
        {
            get
            {
                aClient.DefaultRequestHeaders.Add("user-agent"user_Agent);
                //aClient.DefaultRequestHeaders.Add("x-nudge-token", nudge_token);
                aClient.DefaultRequestHeaders.Add("x-nudge-platform"nudge_platform);
                aClient.DefaultRequestHeaders.Add("x-nudge-request-id"nudge_request_id);
                aClient.DefaultRequestHeaders.Add("x-nudge-device-id"nudge_device_id);
                if (!string.IsNullOrEmpty(token))
                {
                    aClient.DefaultRequestHeaders.Add("x-nudge-token"token);
                }
                return aClient;
            }
        }

Jawbone API'ları ile konuşmak için header'a koymamız gereken bazı
bilgiler var. Bunlar arasında önemli olanlardan biri Nudge-Token.
Token adından da belli olduğu üzere ilk Authentication sonrası
alacağımız ve her API call'da kullanacağımız erişim anahtarımız. O
nedenle Authentication API hariç her yere giderken bu Token'ın header'da
bulunması şart. Geri kalan header değerlerini hardcoded tutabilirsiniz.
Default değerler Github projesinde var.

[C#]

        public async Task<string> GetToken()
        {
            HttpClient aClient = new APIClient().Client;

            var content = new FormUrlEncodedContent(new[] 
            {
                new KeyValuePair<stringstring>("email"EMail),
                new KeyValuePair<stringstring>("pwd"Password),
                new KeyValuePair<stringstring>("service""nudge")
            });

            var result = await aClient.PostAsync(APIUris.LoginUricontent);
            var rootResult = await result.Content.ReadAsAsync<APIEntities.RootObject>();
            if (rootResult.error != null)
            {
                throw new Exception(rootResult.error.msg);
            }
            else
            {
                return rootResult.token;
            }            
        }

Yukarıdaki kod ilk authentication kodumuz. Jawbone hesabınızın e-mail ve
password'ünü göndererek geriye bir token istiyoruz. Bu token biraz önce
bahsettiğimiz ve header'da tutacağımız token'ın ta kendisi. RootObject
nesnesinin ne olduğunu merak edebilirsiniz. Jawbone API'lerinin döndüğü
JSON'lara denk gelen C# nesnelerini ben Github'daki projeye ekledim.
İşte RootObject de bu API call'un geriye döndürdüğü response'a denk
geliyor. Nesneyi full buraya kopyala-yapıştır koymuyorum. Zaten
Github'taki kaynak kodunda görebilirsiniz.

Jawbone UP
Jawbone UP

Token'ı aldıktan sonra benim son olarak yapmak istediğimiz
aktivitelerimi çekmekti. Bu noktada kullanacağımız API adresi aşağıdaki
şekilde;

https://jawbone.com/nudge/api/v.1.33/users/@me/social

Buradan epey detaylı bilgi dönüyor. Tüm aktivitilerle beraber attığınız
adım sayısı, süresi, eğer varsa logladığınız yiyecekler ve onların
kalori miktarlarının yanı sıra carb-protein-fat oranları gibi birçok
detaylı bilgiyi API'lardan alabiliyorsunuz. Eğer API'larla ilgili daha
fazla bilgi isterseniz aşağıdaki iki adresi incelemenizi tavsiye
edebilirim. Benim işime yukarıdaki iki API yettiği için ben sadece
onları Wrapper'a ekledim. Eğer siz de başka API'lar kullanacak olursanız
Github'da beklerim ;)

https://niklaslindblad.se/2013/07/jawbone-up-api-updates/
http://eric-blue.com/projects/up-api/#JawboneUPAPI-NotableHTTPHeaders

Görüşmek üzere!