Syndykator facebooka

Z Wiki - coigdzie.pl
Przejdź do nawigacji Przejdź do wyszukiwania

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:

  1. Na komputerze, na którym zalogowane jest konto 'Tomek Coigdzie' otworzyć stronę http://gfx.coigdzie.pl/facebook_token.php
  2. 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 )