Syndykator facebooka
Najbardziej złożony z naszych syndykatorów. Dostarcza o dni powszednie ponad 600 imprez.
Token
By mieć dostęp do danych udostępnianych przez api facebooka syndykator musi posiadać aktualny token.
Token facebook'a wymaga odświeżenia raz na 2 miesiące.
W celu aktualizacji tokena należy:
- Na komputerze, na którym zalogowane jest konto 'Tomek Coigdzie' otworzyć stronę http://gfx.coigdzie.pl/facebook_token.php
- Skopiować zwrócone wartości do pliku konfiguracyjnego facebookConfig.xml znajdującego się na serwerze ovh w katalogu /cronjobs/syndicators/facebook/:
- wartością token zastąpić wartość elementu config->account->token,
- wartością tokenExpireTime zastąpić wartość elementu config->account->tokenExpireTime.
Baza danych
Na potrzeby syndykatora zostały stworzone dodatkowe 3 tabele.
- fb_point
- fb_proxy
- fb_venue
fb_point
Tabela zawiera punkty siatki, wykorzystywane do szukania profili. Najważniejsze kolumny to:
- locality_id - id lokalizacji, dla której wygenerowano punt
- last_scan_dt - czas ostatniego skanowania punktu
- radius - promień wyszukiwania dla punktu
- results_count - liczba wstawionych do bazy profili na podstawie skanowania punktu (łącznie z nadpisywaniem wcześniej znalezionych)
- geom - współrzędne geometryczne
fb_proxy
Tabela przechowuje dane komputerów proxy, używanych do rozproszonego wysyłania zapytań do API facebooka. Najważniejsze kolumny to:
- url - adres komputera wraz ze ścieżką do skryptu proxy.php
- last_request_dt - czas ostatniego użycia komputera
- busy - czy komputer jest zajęty
- counter - liczba zapytań wysłanych przez komputer
fb_venue
Tabela zawiera znalezione profile, zarówno w wyniku skanowania punktów jak i źródeł. Najważniejsze kolumny to:
- fb_point_id - id punktu, jeżeli profil dodano w wyniku skanowania siatki
- profile_id - id profilu na facebooku
- profile_name - nazwa profilu na facebooku
- last_scan_dt - czas ostatniego skanowania
- source_id - id źródła, jeżeli profil dodano ze źródła
- band_id - id bandu, jeżeli profil dodano z bandu
- month_results_count - liczba imprez pobranych z facebooka w danym miesiącu (jeżeli 7 razy pobrano tą samą imprezę, wynikiem jest 7)
Skrypty
Na syndykator składa się 5 skryptów napisanych w języku Perl:
- fbManager.pl
- fbWorkerVenues.pl
- fbWorkerEvents.pl
- fbSources.pl
- fbPointsGenerator.pl
Kontroler - fbManager
Zarządca rozproszonego szukania profili i wydarzeń. Uruchamiany w następujący sposób:
./fbManager.pl typ [limit] [sleep]
gdzie:
- typ: rodzaj wyszukiwania (-v: profile, -e: wydarzenia)
- limit: maksymalna liczba przeskanowanych zapytań wysłanych do facebooka
- sleep: okres oczekiwania w milisekundach pomiędzy kolejnymi zapytaniami
Skrypt wczytuje konfigurację z pliku facebookConfig.xml, pobiera z bazy listę wymaganych elementów, a następnie co określony czas wywołuje odpowiadający typowi zadania Worker. W przypadku wyszukiwania imprez, Manager na początku tworzy plik xml, do którego zawartość dopisują workery, a na sam koniec usuwa duplikaty imprez.
Workery
Na syndykator składają się 2 workery. Oba wykorzystują komputery proxy w celu wysyłania zapytań do API facebooka, ponieważ z jednego adresu IP można wysyłać maksymalnie 1 zapytanie na sekundę.
fbWorkerVenues
Skanuje punkt siatki w poszukiwaniu profili.
Skrypt przyjmuje na wejściu 4 parametry:
- id punktu w bazie danych
- współrzędna x
- współrzędna y
- promień
Wysłane zapytanie do API facebooka zwraca listę profili na danych obszarze. Program zapisze znaleziony profil, jeśli będzie spełniał warunki:
- lokalizacja profilu to Polska
- nazwa profilu jest wypełniona
- przynajmniej jedna z kategorii pasuje do wyrażenia regularnego:
^(club|pub|cafe|gallery|museum|bar|sports|restaurant|entertainment|attraction|nightlife|event planning)\$
Jeżeli takiego profilu nie posiadamy w bazie, skrypt utworzy nowy wiersz w tabeli fb_venue i zapisze tam podstawowe dane profilu, takie jak: id, nazwa, adres, współrzędne, nr telefonu, link do obrazka.
Wyszukiwanie profili jest uruchamiane codziennie o godz 9:00 dla 10 tyś punktów.
fbWorkerEvents
Skanuje profil w poszukiwaniu wydarzeń.
Skrypt przyjmuje na wejściu 4 parametry:
- id venue (klucz głowny tabeli fb_venue)
- id profilu na facebooku
- id punktu (klucz główny tabeli fb_point)
- czas rozpoczęcia skanowania (czas znajduje się w nazwie wynikowego pliku xml)
Wysłane zapytanie do API facebooka zwraca listę wydarzeń dla danego profilu. W rzadkich przypadkach, lista może zawierać 2 strony. Skrypt obsługuje taką paginację.
Skrypt przetworzy dane wydarzenie, jeśli będzie spełniało warunki:
- lokalizacja profilu to Polska
- nazwa wydarzenia jest wypełniona
Jeżeli profil nie posiada informacji o adresie, a zebraliśmy go w wyniku przeszukiwania siatki punktów, to dane adresowe zostaną skopiowane z danych profilu. Ponadto usuwane są z opisu niedozwolone znaki ASCII Art, mało znaczące frazy, np: "więcej informacji wkrótce" oraz próbujemy wydedukować cenę biletu wstępu na imprezę.
Skrypt dopisuje znalezione wydarzenia do pliku xml, utworzonego przez Managera.
Wyszukiwanie imprez jest uruchamiane od niedzieli do czwartku o godz 20:00 dla wszystkich profili.
Inne
Poniższe skrypty nie wymagają wykorzystywania komputerów proxy. Nie są wywoływane z użyciem Managera.
fbSources
Skrypt przetwarza zaktualizowane źródła i bandy i wyszukuje odpowiadające im profile na facebooku.
Program pobiera z bazy listę źródeł i bandów, które zostały utworzone lub zaktualizowane w ciągu ostatniego dnia (wczoraj i dzisiaj) oraz posiadają link do facebooka. Następnie wyodrębnia z adresu url id profilu, wysyła zapytanie o dane profilu do API facebooka i zapisuje otrzymane dane w tabeli fb_venue. Jeżeli posiadamy już dany profil dane zostaną zaktualizowane (nadpisane).
Skrypt jest uruchamiany codziennie o godz 19:00.
fbPointsGenerator
Skrypt posłużył do wygenerowania siatki punktów, używanych aktualnie do szukania profili.
Program wczytuje plik fb-miasta-powiatowe.xls zawierający listę największych miast w każdym powiecie. Następnie na podstawie rozmiaru lokalizacji (liczby ulic w mieście) generuje siatkę dla tego miejsca. Dla bardzo małych miejscowości jest to tylko 1 punkt. Z kolei dla bardzo dużych (miasta wojewódzkie) siatka składa się z siatki centralnej, normalnej oraz obrzeży. Przykładowo dla Warszawy siatka centralna stanowi kwadrat o boku 3km z punktami oddalonymi co 50m. Siatka normalna zawiera punkty co 1 km oddalone od centrum o maksymalnie 10 km. Dodatkowo skrajne punkty siatki (obrzeża) są skanowane w promieniu 10km, aby objąć przedmieścia.
Wynikiem działa skryptu jest plik sql z zapytaniem wstawiającym wygenerowane punkty do bazy. Po wykonaniu skryptu, można obliczyć odległość punktów od centrum lokalizacji przy użyciu zapytania:
UPDATE fb_point fb SET distance_from_center = (
SELECT (ST_Distance_Sphere(p.geom, l.locality_geom)::integer) FROM fb_point p
INNER JOIN locality l ON l.locality_id=p.locality_id WHERE fb.fb_point_id=p.fb_point_id )