Zmiany w GGAPI

Na przełomie lipca i sierpnia wprowadzimy kilka zmian w GGAPI. Zasoby będą operować na nowych identyfikatorach użytkowników zamiast na numerach GG. Prosimy twórców o kontakt na adres dev@gadu-gadu.pl jeśli ich aplikacje przechowują w swoich bazach danych numery GG.

Zmiany mają na celu przygotowanie aplikacji do nowej odsłony systemu aplikacji zewnętrznych, nad którym intensywnie pracujemy.

Autor Przemek Łącki, 20/07/2011, w GG.pl, GGAPI 1 Komentarz »

Integracja aplikacji Ruby on Rails 3 z platformą GGAPI

W dzisiejszym gościnnym wpisie Marcin 'Martio' Lewandowski opisze sposób integracji aplikacji RoR z platformą GGAPI:


Do zintegrowania aplikacji Rails'owej z platformą Gadu-Gadu zastosujemy uniwersalny i elastyczny system uwierzytelniania z wykorzystaniem Rack Middleware o nazwie OmniAuth (https://github.com/intridea/omniauth).

Zaczynamy od zainstalowania niezbędnych gem-ów. W pliku Gemfile dodajemy dwa nowe gem-y:

gem 'oauth2'
gem 'omniauth'

i wykonujemy polecenie `bundle install`.

Kiedy posiadamy już niezbędne biblioteki w naszej aplikacji możemy przystąpić do integracji i właściwej konfiguracji adaptera OmniAuth. Biblioteka ta wprawdzie nie posiada w standardowym wydaniu adaptera strategii uwierzytelniania dla Gadu-Gadu, ale takowy znajdziemy również na Github-ie pod adresem: https://gist.github.com/8e82aabe6de2cb090121.
Klonujemy plik adaptera będąc w katalogu `lib` poleceniem

git clone git@gist.github.com:8e82aabe6de2cb090121.git

lub ściągamy ręcznie z podanej strony. Adapter przystosowany jest do biblioteki OmniAuth w wersji 0.1.6.

Konfiguracja jest banalnie prosta i polega na dodaniu nowego inicjatora. Tworzymy nowy
plik `config/initializers/omniauth.rb` o następującej zawartości:

module OmniAuth
  module Strategies
    autoload :GG, 'gg_omniauth_strategy'
  end
end

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :GG, CLIENT_ID, CLIENT_SECRET
end

W ten oto prosty i szybki sposób zintegrowaliśmy naszą aplikację z platformą Gadu-Gadu. Dla pełnej satysfakcji brakuje nam jeszcze kontrolera, który obsłuży zautoryzowanych użytkowników GG.

Dodajemy dwie nowe trasy do konfiguracji routingu w pliku `config/routes.rb`:

match '/auth/:provider/callback' => 'authentications#create'
match '/auth/failure' => 'authentications#failure'

Ostatnim krokiem jest utworzenie kontrolera `app/controllers/authentications_controller.rb`:

class AuthenticationsController < ApplicationController
  rescue_from User::NotAuthorized, :with => :user_not_authorized

  def create
    omniauth = request.env['omniauth.auth']

    raise User::NotAuthorized unless omniauth['uid']

    user = User.find_by_uid(omniauth['uid'])

    unless user
      user = User.new
      user.uid     = omniauth['uid']
      user.name    = omniauth['user_info'][(!omniauth['user_info']['nickname'].empty?
                                                               ? 'nickname' : 'name')]
      user.picture = "http://avatars.gg.pl/#{omniauth['uid']}"
      raise User::NotAuthorized unless user.save
    end

    session['uid']   = user.id
    session['token'] = omniauth['credentials']['token']

    redirect_to_after_authentication
  end

  def failure
    user_not_authorized
  end

  protected

  def redirect_to_after_authentication
    render :text => "<script type='text/javascript' charset='utf-8'>top.location.href =
'http://www.gg.pl/#apps/MY_APP';</script>"
  end

  def user_not_authorized
    render :text => '401 Unauthorized', :status => 401
  end
end

Podczas uwierzytelnienia zachowaliśmy w sesji access_token, który wykorzystujemy do autoryzacji dostępu do API. Teraz pobranie np. listy kontaktów zautoryzowanego użytkownika to nic prostszego. Wystarczy tylko skorzystać z klienta OAuth2:

@client = OAuth2::Client.new(CLIENT_ID, CLIENT_SECRET, :parse_json => true)
@token  = OAuth2::AccessToken.new(@client, session['token'])
result  = @token.get('https://users.api.gg.pl/friends/me', {:limit => 1000},
{'Accept-Charset' => 'ISO-8859-2,utf-8;q=0.7,*;q=0.7'})

Na koniec jeszcze jedna bardzo ważna uwaga. Uwierzytelnienie w bibliotece OmniAuth następuje po przekierowaniu użytkownika na URL `/auth/gg`. Jako, że w panelu administracyjnym aplikacji nie możemy ustawić tego typu URL-a celem ustandaryzowania automatycznego przekierowania użytkownika do procesu uwierzytelnienia jego dostępu do naszej aplikacji, możemy zastosować pewien trick używając ponownie Rack Middleware.

Tworzymy klasę odpowiedzialną za wykrycie żądania pochodzącego z platformy Gadu-Gadu `lib/detect_platform.rb`:

class DetectPlatform
  def initialize(app)
    @app = app
  end

  def call(env)
    request = Rack::Request.new(env)

    if request.params['gg_session_id']
      request.env[:request_comes_from_platform] = :gg
    end

    @app.call(env)
  end
end

i rejestrujemy ją w utworzonym wcześniej inicjatorze:

require 'detect_platform'
Rails.application.config.middleware.use DetectPlatform

Od teraz możemy wykryć w głównym kontrolerze czy żądanie pochodzi z platformy Gadu-Gadu i w razie takiej potrzeby przekierować użytkownika do systemu uwierzytelnienia.

class HomeController < ApplicationController
  before_filter :check_authorization

  def show
  end

  private

  def check_authorization
    render :text => '403 Forbidden', :status =>
           403 unless request.env[:request_comes_from_platform]
    render :text => "<script type='text/javascript' charset='utf-8'>top.location.href =
       '#{request.protocol}#{request.host_with_port}/auth/gg';</script>" unless session['uid']
  end
end
Autor Przemek Łącki, 10/02/2011, w API, GG.pl, GGAPI Brak Komentarzy »

Poprawiono bezpieczeństwo serwisu GG.pl w odpowiedzi na zgłoszenie użytkownika

Użytkownicy serwisu społecznościowego GG.pl mogą od dzisiaj korzystać z poprawionej wersji. Administratorzy serwisu wprowadzili poprawkę poprawiającą prywatność użytkowników. Lukę usunięto po zgłoszeniu jej przez jednego z użytkowników GG, Karola Olszackiego - http://olszak.tk/pl/ . Mogła ona umożliwiać innym osobom dostęp do wpisów na tzw. pulpicie serwisu.

Karol otrzyma w podziękowaniu prezent od GG Network.

- Dziękujemy za zgłoszenie błędu – mówi Zbigniew Pieńkowski, CIO GG Network S.A. – Prywatność użytkowników jest naszym jednym z głównych priorytetów. Dlatego każde takie zgłoszenie rozpatrujemy z pełną powagą. Przy tak dynamicznie rozwijającym się serwisie w skali społeczności GG.pl zawsze mogą zdarzać się jakieś potknięcia, ale najważniejsze, żeby je skutecznie usuwać. Wszelkie uwagi, błędy można zgłaszać na beta@gadu-gadu.pl

***

Serwis społecznościowy GG.pl

Serwis GG.pl jest silnie zintegrowany z Gadu-Gadu, najpopularniejszym komunikatorem w Polsce, z którego korzysta obecnie już blisko 11 milionów użytkowników miesięcznie.

Osoby komunikujące się na co dzień przez Gadu-Gadu, uzyskują dzięki serwisowi GG.pl wiele nowych funkcjonalności. Użytkownicy mogą m.in. wymieniać się linkami, tworzyć prywatne konferencje ze znajomymi, słuchać muzyki, komunikować się za pomocą poczty e-mail, komunikatora czy grać w ulubione gry. Wszystko to opiera się o relacje ze znajomymi z listy kontaktów z komunikatora – są to zwykle osoby bliskie, z którymi łączą nas codzienne.

Serwis rozwija się w oparciu o sugestie, pomysły i oczekiwania użytkowników.

www.GG.pl

Autor Michał Abram, 10/01/2011, w GG.pl, GGAPI Brak Komentarzy »

Jak stworzyć aplikację na GG.pl – biorytm krok po kroku.

W połowie października firma GG Network S.A. udostępniła API dla developerów umożliwiające pisanie aplikacji w serwisie GG.pl. Wraz z API ogłoszony został konkurs na najlepszą aplikację, w którym można wygrać 30tys. zł oraz IPady. Prześledzimy na przykładzie jak stworzyć prostą aplikację w kilku łatwych krokach.

Dowiesz się:

  • Jak szybko stworzyć aplikację obliczającą biorytm w serwisie GG.pl

  • Sposoby na współpracę skryptów PHP i JavaScipt

  • W jaki sposób korzystać w metod GGAPI

Powinieneś wiedzieć:

  • Uruchomienie serwera WWW z obsługą PHP

  • Podstawy JavaScript i jQuery

W GG API dostępnych jest wiele zasobów szczegółowo opisanych na stronie http://dev.gg.pl/api. Poprzez GG API REST aplikacja może uzyskać dostęp do:

  • Listy znajomych

  • Awatara użytkownika

  • Pulpitu użytkownika

  • Danych z katalogu publicznego

Zanim jednak aplikacja otrzyma dostęp do konta użytkownika, musi określić, które zakresy danych są jej niezbędne do poprawnego działania. Gdy użytkownik wejdzie na stronę aplikacji zostanie poproszony o zgodę na udzielenie dostępu do swoich danych. Gdy zgoda zostanie uzyskana aplikacja ma dostęp do odpowiednich zasobów autoryzując się swoim kluczem przy użyciu protokołu OAuth 2.0.

Mając odpowiednie dane jesteśmy w stanie stworzyć aplikację, która obliczy biorytm użytkownika. Wykorzystując możliwości API aplikacja może również rozesłać obliczone biorytmy do znajomych. Skorzystamy z gotowej biblioteki, w języku PHP opublikowanej na stronie dev.gg.pl, dzięki której w łatwy sposób można uzyskać dostęp do niezbędnych zasobów.

Konfiguracja aplikacji.

Przystępując do pracy należy najpierw zarejestrować aplikację. Procedura rejestracji jest dość prosta, należy określi ć nazwę aplikacji, jej opis oraz link do strony, na której się znajduje, gdyż wszystkie aplikacje wyświetlane są w serwisie GG.pl poprzez ifram’e. Dodamy dwie aplikacje – pierwszą do celów testowych kierującą na http://localhost/biorytm_test oraz docelową dostępną pod ogólnodostępnym adresem np. http://example.com/biorytm.
Wypełniamy odpowiedni formularz pod adresem http://dev.gg.pl/apps/new/ .

Rysunek 1 – Rejestracja aplikacji w serwisie dev.gg.pl

Definiujemy:

  • nazwę aplikacji – będzie prezentowana na pasku bocznym i w katalogu aplikacji – powinna być krótka i atrakcyjna

  • ikona – obrazek wielkości 40x40px

  • opis – kilkuzdaniowy opis prezentowany w katalogu aplikacji

  • adres docelowy – jest to link do aplikacji widoczny w serwisie gg.pl

  • właściwy URL pod którym aplikacja się znajduje

Do celów testowych jako URL możemy podać adres lokalny np. localhost, który potem zmienimy na publiczny adres serwera gdzie wgramy ostateczną wersję naszej aplikacji. Podczas tworzenia aplikacji takie rozwiązanie jest najwygodniejsze, gdyż możemy szybko wprowadzać zmiany i sprawdzać efekt końcowy w przeglądarce.

Od tej chwili wchodząc na http://www.gg.pl/#apps/biorytm_test w ramce na stronie uruchomi się nasza aplikacja dostępna pod adresem http://localhost/biorytm_test na której powinniśmy posiadać poprawnie skonfigurowany serwer WWW spierający obsługę języka PHP.

Aby można było obliczyć biorytm użytkownika należy otrzymać jego dane profilowe. Ze strony https://github.com/GGNetwork/GGAPI pobieramy bibliotekę w języku PHP i wgrywamy plik GGAPI.php do katalogu z aplikacją. Obiekt GGAPI inicjalizujemy z parametrami odpowiadającymi Client Id oraz Client Sercret które zostały wygenerowane podczas rejestrowania aplikacji. Skorzystamy z następujących metod biblioteki GGAPI:

  • GGAPI::getFriends() – pobranie listy znajomych użytkownika

  • GGAPI::getProfile() – pobranie danych z katalogu publicznego (imię, nazwisko, pseudonim, data urodzenia oraz miejsce zamieszkania)

  • GGAPI:: sendNotification() – wysłanie powiadomienia do znajomego

<?php
   require_once 'GGAPI.php';

   try{

    // inicjalizacja GGAPI z parametrami aplikacji client_id i client_secret
    // pobranymi z konfiguracji aplikacji na http://dev.gg.pl
    $gg = new GGAPI('95936e8d393b5f0b9b', 'df63486f8f47024de');
    // opcjonalna inicjalizacja sesji na podstawie gg_session_id
    // jeśli token autoryzacyjny ma być zapisany tylko na czas sesji
    $gg->initSession();
    // jeśli nie ma tokena, należy poprosić użytkownika o dostęp do zasobów
    if(!$gg->hasToken()){
       $gg->authorize(array('users','pubdir','life'));
    }
    // pobranie listy kontaktów
    $friends = !isset($_SESSION['friends']) ? $gg->getFriends() : $_SESSION['friends'];
    // pobranie danych o użytkowniku
    $profile = !isset($_SESSION['profile']) ? $gg->getProfile() : $_SESSION['profile'];

    $_SESSION['friends'] = $friends;
    $_SESSION['profile'] = $profile;

}catch(GGAPIException $e){

    die($e->getMessage());
}

Źródło 1 - Pobranie danych z GGAPI

Gdy użytkownik wejdzie na stronę z aplikacją zostanie poproszony o zgodę na udostępnienie danych z profilu, listy znajomych oraz pulpitu. Jeśli użytkownik wyrazi zgodę – aplikacja może pobrać niezbędne dane – w tym wypadku zapisze je do sesji, aby nie było konieczności pobierania ich za każdym razem.

Mając informację z katalogu publicznego dotyczące użytkownika można wyliczyć już biorytm na podstawie daty urodzenia. Teorię biorytmów stworzył Wilhelm Fliess w XIX wieku. Opiera się ona na twierdzeniu, że procesy biologiczne organizmu podporządkowane są określonemu wzorcowi. Według tej teorii, cykl sprawności fizycznej powinien trwać 23 dni, a cykl stanu emocjonalnego - 28 dni. Każdy cykl ma swoje minimum i maksimum oraz stan zerowy – tzw. neutralny. Każdy ze stanów można obrazować w formie sinusoidy rysowanej od daty urodzenia do dnia dzisiejszego. Nasza aplikacja będzie wyliczała biorytm na dzień bieżący, a więc niezbędną dla nas informacją jest liczba dni przeżytych przez użytkownika oraz okres odpowiedniego cyklu.

Stworzymy funkcję, która jako parametry przyjmie datę urodzenia oraz liczbę dni charakterystyczną dla danego biorytmu. Dodatkowo każdy obliczony biorytm będzie posiadać własny opis i obrazek, co przyda się podczas publikowania wpisu na pulpicie użytkownika i uatrakcyjni formę prezentacji danych.

<?php
define('BIORHYTM_EMOTIONAL',     28);
define('BIORHYTM_INTELECTUAL',   33);
define('BIORHYTM_PHISICAL',      23);
define('BIORHYTM_INTUITION',     38);

function count_biorhythm($birth, $type){

    $time_diff = (time() - $birth) / (24 * 60 * 60);
    return round(sin(2 * pi() * $time_diff / $type) * 100);
}

function get_biorhythm_data($type, $birth, $descriptions){

    $value = count_biorhythm($birth, $type);
    $c     = count($descriptions[$type]) - 1;
    $v     = min(array(round((100 + $value) * $c / 200), $c-1)) + 1;

    return array(
        'name'        => $descriptions[$type][0],
        'value'       => $value,
        'image'       => $descriptions[$type][$v]['img'],
        'description' => $descriptions[$type][$v]['desc'],
    );

}

$lang = array(

       BIORHYTM_EMOTIONAL      => array(
           'Emocje',
           array(
               'desc' => 'Niby powinno być w porządku ale wokół wszystko Cię denerwuje.',
               'img'  => 'img1.jpg'
           ),
           array(
               'desc' => 'Twoja stabilność emocjonalna jest zachwiana. ',
               'img'  => 'img2.jpg'
           ),
        )

);

Źródło 2 - Funkcje obliczacjące biorytm

Funkcja count_biorhythm() obliczy biorytm dla danego dnia na podstawie sinusoidalnego przebiegu samopoczucia liczonego od momentu urodzenia o okresie odpowiadającym liczbie dni charakterystycznej dla danego typu. Funkcja get_biorhythm_data() pobierze wyliczy biorytm oraz dobierze odpowiedni opis i obrazek przechowywany w tablicy opisów. Można stworzyć ich dowolną ilość co uatrakcyjni zabawę i zachęci użytkownika do częstego jej odwiedzania (każdego dnia użytkownik będzie mieć inne wartości samopoczucia, a więc i inne zabawne opisy).

Rysunek 2 – Dodanie wpisu

Aby w ciekawy sposób przedstawić dane na stronie posłużymy się biblioteką jQuery, przy pomocy której wygenerujemy prosty wykres słupkowy. Dane obliczamy w języku PHP jednak w prosty sposób poprzez funkcję json_encode() możemy je przenieść do JavaScript’u.

Przeczytaj całość »

Autor Przemek Łącki, 30/11/2010, w API, GG.pl, GGAPI Brak Komentarzy »
Copyright © GG Network S.A.
Engine by Wordpress
Aktualności RSS