Bartłomiej Opajdowski | 7 Mar 2013 16:47
Picon

REST_API pytanie o nowe tabele

Czy w najbliższym czasie planujecie dodać dodatkowe API dla wystąpień, interpelacji i głosowań posła? Odpowiednio (Posel_Wystapienia, Posel_Interpelacje, Posel_glosowania) ? 

W chwili obecnej wyszukiwanie wystąpień i interpelacji jest mało wydajne, ponieważ trzeba pobrać każde wystąpienie interpelacje/glosowanie aby sprawdzić, czy czasem nie należy do Posła np. po mowca_id. Niestety przykładowy link: http://sejmometr.pl/poslowie/id_posla/wystapienia nie ma API i zwraca zawsze http://sejmometr.pl/poslowie/id_posla/info

--
Otrzymujesz tę wiadomość, ponieważ subskrybujesz grupę dyskusyjną Google o nazwie „Sejmometr API”.
 
Aby anulować subskrypcję tej grupy i przestać otrzymywać z niej wiadomości, wyślij e-maila do sejmometr-api+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
Więcej opcji znajdziesz na https://groups.google.com/groups/opt_out
 
 
rav_er | 12 Feb 2013 14:34
Picon
Favicon

Brak pola sentencja w danych sa_orzeczenia

W jaki sposób poprzez API uzyskać tekst z pola sentencja widocznego po wejściu w szczegółach orzeczenia np. http://sejmometr.pl/sa_orzeczenia/787034

--
Otrzymujesz tę wiadomość, ponieważ subskrybujesz grupę dyskusyjną Google o nazwie „Sejmometr API”.
 
Aby anulować subskrypcję tej grupy i przestać otrzymywać z niej wiadomości, wyślij e-maila do sejmometr-api+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
Więcej opcji znajdziesz na https://groups.google.com/groups/opt_out
 
 
Bartosz Bujała | 24 Jan 2013 13:42
Picon

Treść wystąpień w nowym API

Witam jak dostać się do treści wystąpień w nowym API, kiedyś jsonem szczytywałem po prostu,np http://api.sejmometr.pl/wystapienie/16714/tekst , a teraz nie widze w żadnej tabeli takiego pola. Czy czegoś nie zauważyłem, czy nie ma tabeli z id wystpienia i trescia itp ?

Łukasz Iżuk | 23 Jan 2013 01:30
Picon

problem z pobraniem rekordow z tabeli sejm_wystapienia

Witam, mam problem z pobraniem obiektów z tabeli sejm_wystapienia. Mianowicie taki kod:
            $dataset = new ep_Dataset( 'sejm_wystapienia' );
            echo 'przed';
            $sejm_wystapienia = $dataset->find_all();
            echo 'po';
powoduje, że cały program wysypuje się już na linii $senat_wystapienia = $dataset->find_all(); i druga instrukcja echo oraz wszystko dalej zwyczajnie już nie działa. Wystarczy zmienić 'sejm_wystapienia' w konstruktorze Dataset na cokolwiek innego, istniejącą, bądź nie nazwę tabeli i iterpreter przechodzi dalej. Rekordy z innych tabel zatem można wyświetlać (testowałem na tabelach 'senat_wystapienia', 'poslowie', 'gminy'). Obiekt Dataset przy tym wydaje się też być prawidłowo zainicjowany, gdyż użycie jego metody count zwraca prawidłową liczbę wszystkich rekordów w tabeli (28755).
Problemem ewidentnie wydaje się find_all() w tym kodzie;/ Ograniczenie liczby pobieranych rekordów także nic nie daje.

seoinfor | 22 Jan 2013 17:24
Picon

Aktualność danych

Witam, właśnie zainstalowałem sobie bibilotekę eP_API i próbuje dojść co i jak. Chciałbym np pobrać informacje o najnowszych ustawach, tak próbuję to zrobić;

$dane = new ep_Dataset('ustawy');
$dane = $dane->order_by('data_publikacji', 'DESC')->find_all(10,0);
ale dostaje informacje o ustawach z 2000r. Czy coś robię źle?
Bartłomiej Opajdowski | 28 Dec 2012 13:29
Picon

REST_API (z perspektywy pythona + json)

Witam,

jesli ktoś potrzebuje rozwiązania do pythona to dobrym przykładem jest:

   req = urllib2.Request('http://sejmometr.pl/poslowie/(id_posla)/glosowania')
   req.add_header('Accept','application/vnd.EPF_API.v1+json')
   r = urllib2.urlopen(req)
   return r.read()

niestety glosowania nie zwracają głosowań a zakładkę info... (oczywiście url podany w przykładzie mozna zastąpić dowolnym) 

Fajnie by było, jakby w dziale "PRZYKŁADY"pojawiły się rozwiązania dla innych języków jak php oraz linkami odpowiednimi dla danych obiektów np.  ep_Sejm_Glosowanie - http://sejmometr.pl/sejm_glosowania/1213
ułatwiło by to implementacje i testowanie bez konieczności skakania między dokumentacją, a stroną z danymi.

Czy może ktoś podpowiedzieć, jak pobrać teraz listę wszystkich ID głosowań ?
W chwili obecnej link http://sejmometr.pl/sejm_glosowania w JSONie zwraca 20 (ostatnich?) wyników 
("limit_max":"100","limit_default":"20") 
Czy da się zwrócić coś na wzór: http://api.sejmometr.pl/glosowania, jeśli tak to jak ? ?  (Ta funkcja zwraca tablicę identyfikatorów głosowań. Każdy identyfikator jest liczbą naturalną). Chodzi mi o listę wszystkich głosowań danej kadencji (a może jeszcze parametr "kadencja", który przyda się do rozróżniania kadencji posła)
Następnie można by pytać jak w poprzedniej wersji http://api.sejmometr.pl/glosowanie/{$ID_GLOSOWANIA}/wyniki
ale rozszerzyć o ID_POSLA, aby uniknąć zwracania tablic tablic, a otrzymać wyniki dla konkretnego posła 
lub opcja bez ID_POSLA zwracajaca glosowania wszystkich poslow, tylko wtedy wracamy do tablicy tablic asocjacyjnych

Jakieś pomysły jak to rozwiązać? Niestety http://sejmometr.pl/poslowie/ID_POSlA/glosowania nie działa i zwraca jedynie obiekt ep_Posel
Daniel Macyszyn | 24 Dec 2012 10:27
Picon
Gravatar

REST API (BETA)

Witam

Dodaliśmy do Sejmometru REST API. Narazie nie podajemy informacji o tym na stronie, bo chciałem Was poprosić o opinię, co do samej filozofii działania. Oto jak to działa:

Pod adresy URL Sejmometru, pod którymi wyświetlane są strony HTML, można wysyłać żądania HTTP z odpowiednimi nagłówkami Accept. W tej chwili akceptowane są dwie wartości:
application/vnd.EPF_API.v1+xml (jeśli chcemy otrzymać dane w XML),
application/vnd.EPF_API.v1+json (jeśli chcemy otrzymać dane w JSON),
(dla każdej innej wartości, serwer zwróci stronę HTML).

Oto przykład w PHP:
   
    $opts = array(
      'http'=>array(
        'method' => "GET",
        'header' => array("Accept: application/vnd.EPF_API.v1+xml"),
      ),
    );
   
    $context = stream_context_create( $opts );
    $url = 'http://sejmometr.pl/gminy';
   
    $transport = file_get_contents( $url, null, $context );
    var_dump( $transport );


Odpowiedź z REST API jest dokumentem, z określonym polem "resource". To pole może być równe "ep_Dataset" lub "ep_Object".


Przykład 1
Jeśli chcemy przeglądać zbiór aktów prawnych, to należy wysyłać żądania pod adres:
http://sejmometr.pl/prawo

W odpowiedzi dostaniemy dokument typu "ep_Dataset". Dla zasobów tego typu, możemy dodatkowo kierować parametry GET:
p - numer strony wyników (domyślnie: 1)
pp - liczba wyników na stronę (każdy dataset ma swoją domyślną wartość, najczęściej 20)
w - pozwala filtrować wyniki. musi być tablicą conajmniej 3 elementów: ['nazwa_pola', 'operator', 'wartosc']. Dozwolone operatory: =, <, >, <=, >=, LIKE, 'IN_LAST_MONTHS'
o - pozwala sortować wyniki. musi być tablicą conajmniej 2 elementów: ['nazwa_pola', 'kierunek']. Dozwolone kierunki: ASC, DESC
k - dodatkowy filtr wyników. tablica fraz do szukania w datasecie. Dla większości datasetów miałomto być wyszukiwanie pełnotekstowe. Dla niektórych (np kody pocztowe) jest to wyszukiwanie "proste". ten filtr nie działa obecnie tak jak powinien. pracujemy nad tym.


Przykład 2
Jeżeli znamy id obiektu, którego dane chcemy uzyskać, to należy wysłać odpowiednie żądanie pod adres URL Sejmometru. Np jeśli chcemy uzyskać informacje o gminie, której id=100, to wysyłamy żądanie pod http://sejmometr.pl/gminy/100.

W odpowiedzi dostaniemy zasób typu "ep_Object". Docelowo pod adresy obiektów będzie można wysyłać parametry GET, które umożliwią załadowanie dodatkowych warstw obiektu. Np  w przypadku gmin, dodatkową warstwą może być zbiór punktów będących granicą geodezyjną gminy, wyniki wyborów itp. Pracujemy nad tym?



Proszę o opinię, czy tak może być i czy możemy iść dalej z takim systemem.
W tej chwili REST API jest dostępne bez żadnych ograniczeń. Docelowo chcielibyśmy, aby mogli z niego korzystać tylko osoby, które mają konto w Sejmometrze. Czy OAuth2 będzie dobrym systemem zarządzania dostępem przez tokeny?


Pozdrawiam
Daniel Macyszyn


 

Rafał Stożek | 22 Dec 2012 13:25
Picon
Gravatar

Kilka pytań

W związku z tym, że api REST się do tej pory nie pojawiło wznowiłem pracę nad biblioteką dla pythona (jeżeli ktoś chce zobaczyć jak idzie: https://github.com/rafales/python-epanstwo-api). Mam kilka pytań:


  1. O co chodzi z keywordami w DataSet? Nie znalazłem żadnych przykładów użycia
  2. Jest gdzieś dostępna lista operatorów, które mogą być wykorzystane w where()?
  3. Które endpointy zwracają dane w mode "DBF"? Przynajmniej jeden przydałby się do testów.
Pozdrawiam
tomasz.bartoszewski | 14 Dec 2012 19:47
Picon

Dane na temat konkretnego głosowania posłów

Szanowni Państwo,

chciałbym skorzystać z Waszego API. Interesuje mnie jak głosowali posłowie w konkretnych głosowaniach. Bo w dokumentacji widzę tylko zbiorcze wyniki danego głosowania, natomiast na stronie przedstawiacie głosy posłów więc jakoś jest to dostępne.

Pozdrawiam
Tomek
Lukasz | 12 Dec 2012 07:57
Picon

WebService

Cześć

Czy będzie dostępny WebService dla danych?
Rafał Stożek | 5 Dec 2012 18:14
Picon
Gravatar

Komentarz dotyczący nowego API

Czyli pułapki, przemyślenia podczas implementacji biblioteki dla pythona.


1. Brak dokumentacji
To chyba sprawia, że implementacja czegokolwiek staje się praktycznie niemożliwa bez grzebania w kodzie PHP (i debugowania go), kilku godzin klnięcia i zmieniania koncepcji całej biblioteki.

2. API nie jest REST
Aktualnie większość API tworzy się zgodnie z zasadami REST. Nie bez powodu. O zaletach REST napisano już wiele. Jest w zasadzie standardem, istnieje sporo bibliotek, które pomagają w implementacji klientów, wszystko jest intuicyjne. Poza tym bardzo łatwo cache'ować takie API. Sejmometr natomiast ma bardzo niewygodne RPC, dostosowane pod bibliotekę napisaną w PHP. Tak się robiło 10 lat temu. Jeżeli cały projekt ma coś osiągnąć, to API powinno być proste, intuicyjne, wygodne i łatwe do wykorzystania w każdym języku i środowisku.

Proponuję obejrzeć tę prezentację: http://www.youtube.com/watch?v=NEWTPFzt2-E

3. Uwierzytelnianie
Powinno być proste. Najlepiej wykorzystać HTTP Auth. Pojedynczy token, bez sekretu i podpisywania zapytań. Zamiast tego wykorzystać HTTPS.
Aktualnie napisanie kodu do generowania sygnatur wymaga nawet kilku godzin oraz debugowania kodu biblioteki w PHP.

Aktualnie sposób podpisywania zapytań w połączeniu z formatem danych oczekiwanym przez PHP sprawia, że implementacja w każdym innym języku będzie upierdliwa. Musimy podpisać dane w stylu {"parametr": ["raz", "dwa", "trzy"], "inny_parametr": "1"}, natomiast wysłać dane w specyficzny dla PHP sposób: parametr[0]=raz&parametr[1]=dwa&parametr[2]=trzy&inny_parametr=1. PHP ma funkcję, która się tym zajmie. Żaden inny język nie. W pythonie - około 60-70 linii dziwnych przekształceń i kombinacji. Z dokumentacją wszystko było by prostsze! Warto też wspomnieć o użyciu JSON'a - otóż wygenerowany JSON nie w każdym języku wygląda tak samo. W Pythonie wygląda inaczej (dodatkowe spacje). Na szczęście Python sobie z tym radzi, ale nie wiem jak to wygląda z innymi językami.
Kolejna sprawa: parametry liczbowe czy boolean są przekazywane jako ciągi znaków, nawet do podpisu w sygnaturze!

Ja wiem - ktoś powie, że to nie są rzeczy, z którymi nie można sobie poradzić. Prawda. Max 100 linijek kodu i gotowe, ale to nie o to chodzi! To ma być nowoczesne, intuicyjne i łatwe. Uwierzytelnienie powinno zająć 1-2 linijki, nie 100.

4. To tylko RPC dla biblioteki w PHP
To widać na każdym kroku. Wysyłane dane - dokładnie tak jak je traktuje PHP. Parametry są liczbowe, ale po parse_str( http_build_query( $params ), $params ) wszystko zamienia się na ciągi znaków? No to po stronie serwera też traktujmy wszystko jako ciągi znaków! (to ma znaczenie tylko przy generowaniu sygnatury). Zwracane dane nazwijmy dokładnie tak jak klasy w bibliotece PHP. Nawet się z tym nie kryjmy - nazwijmy zmienną "item_class".

Popatrzmy na tego potworka:

{'gminy.adres': 'Baborów, Ul. Dąbrowszczaków 2a 48-120 Baborów',
   'gminy.bip_www': 'www.bip.baborow.pl',
   'gminy.dochody_roczne': '16990949.47',
   'gminy.email': 'um-qeUeW3FsEPXVItvQsEIGlw@public.gmane.org',
   'gminy.fax': '0-77 403-69-28',
   'gminy.id': '20',
   'gminy.liczba_ludnosci': '6315',
   'gminy.nazwa': 'Baborów',
   'gminy.nazwa_urzedu': 'Urząd Miejski w Baborowie',
   'gminy.nts': '5163202013',
   'gminy.powiat_id': '62',
   'gminy.powierzchnia': '117.00',
   'gminy.telefon': '0-77 403-69-20',
   'gminy.teryt': '160201',
   'gminy.typ_id': '3',
   'gminy.wojewodztwo_id': '8',
   'gminy.wydatki_roczne': '16182887.10',
   'gminy.zadluzenie_roczne': '-808062.37',
   'powiaty.id': '62',
   'powiaty.nazwa': 'głubczycki',
   'powiaty.sejm_okreg_id': '21',
   'wojewodztwa.id': '8',
   'wojewodztwa.nazwa': 'Opolskie'}

Tak wyglądają dane zwrócone dla gminy. W każdym normalnym API "powiaty" i "wojewodztwa" były by w osobnych obiektach. No i oczywiście niepoprawny Content-Type (text/html zamiast application/json) który może załatwić niektóre biblioteki do obsługi HTTP.

W zwróconych danych znajduje się też jakieś tajemnicze "mode" z możliwymi wartościami "DB" i "DBF". Z tego co zrozumiałem, to przy DBF każdy rekord przyleci do nas osobno zakodowany w JSONie. Super! JSON W JSONie. Kto wpadł na ten genialny pomysł?

5. Gdy klient robi coś nie tak
Kiedy klient zrobi coś nie tak, normalnym jest wysłanie kodu http innego niż 200 (najlepiej któryś z 5xx). Ewentualnie obiekt w jsonie z "status": "error". To API zwraca błąd w postaci tekstowej, z kodem 200 (OK). Nie ma nawet żadnej czytelnej wiadomości, która uświadomiła by mnie co robię źle. Po prostu "Error no. 356" czy "Error no. 425". Czasem nawet jest jeszcze ciekawiej:

Warning: mysqli::query(): Empty query in /home/www/s/_lib/mPortal/db.php on line 18
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head profile="http://www.w3.org/2005/10/profile"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body>Wystąpił nieoczekiwany błąd. Przepraszamy.<br/><a href="http://sejmometr.pl">Sejmometr</a></body></html>

Myślicie, że to trudno wywołać? Skądże. Wystarczy się walnąć w nzwie datasetu. Oczywiście wysłane jako html. I szukaj wiatru w polu, bo stack trace pokazuje błąd gdzieś w bibliotece obsługującej API.

Podsumowanie
Podczas pisania tego skonsultowałem się z kilkoma osobami. Myślę, że aktualny stan najlepiej oddaje reakcja jednego z moich znajomych: "O matko Jap*cenzura*".

Prawdopodobnie o wielu rzeczach zapomniałem. Aktualne API to tylko RPC stworzone na potrzeby biblioteki w PHP. Z myślą głównie o wygodzie programisty, który to API tworzył, nie zaś ludzi, którzy będą z niego korzystać. Zostało stworzone według schematów, które aktualne były 10 lat temu, nie dzisiaj. Warningi z PHP pokazują tylko, że API nie jest w ogóle przetestowane. Jeżeli chcemy nowoczesnego e-państwa może powinniśmy zacząć od nowoczesnego API dla wszystkich ludzi, dla wszystkich platform, z którym poradzą sobie zarówno zaawansowani programiści, jak i Ci którzy na codzień są naukowcami czy kimkolwiek innym, kto w pracy programuje, ale programistą na codzień nie jest.

Nie zrozumcie mnie źle. Pomysł jest świetny. Zebraliście wszyskie dane i tu należą się same pochwały. Moje uwagi (domyślam się, że mogą zabrzmieć dosyć ostro) dotyczą tylko tej jednej warstwy - API. A projekt tej skali, który moim zdaniem jest ważny dla Polski musi mieć porządne, nowoczesne API. Także niech nikt się nie obraża, bo myślę, że zależy nam na tym samym.

Ten post powstał na prośbę Piotra Waglowskiego na Facebooku.

Gmane