Zdobywaj dane jak deweloper!

Jawność polityki to także transparentność wydatków aktorów sceny politycznej. W swoim tekście Roksana Maślankiewicz opisywała, w jaki sposób poznać koszty reklam za pomocą Raportu Transparentności Reklam Google i Biblioteki Reklam Meta. Pójdźmy jednak dalej – chcemy poznać wszystkie dane, by móc z nimi pracować masowo.

Czy zbieranie danych dotyczących wielu kont i ich ocena ilościowa musi być żmudna i czasochłonna? A może istnieje sposób, który pozwoli nam zrealizować ten cel bez ciężkiej pracy? Tak!

Korzystaj z API!

Zanim przejdziemy do właściwej części wpisu, kilka objaśnień. Pojawią się tutaj kilkukrotnie zwroty typu „interfejs programistyczny”, „deweloper”, „skrypt”. Nie należy się ich bać! NIE musisz być programistą, żeby móc poznać wydatki polityków. Pokażę Ci w miarę prosty sposób, jak dostać się do interesujących Cię danych. Muszę być jednak uczciwy – potrzebna będzie cierpliwość i otwartość na pracę z inteligentną maszyną.

Zacznijmy od początku: jak wyciągnąć masowo dane o reklamach? Przez API. Co to API? Specjalny sposób porozumiewania z serwisem: „lżejszy” i bardziej zrozumiały dla maszyny (niestety kosztem rozumienia dla człowieka). Mogłeś/aś tego jeszcze nie dostrzec, ale większość popularnych usług internetowych działa w oparciu o API, dzięki czemu można rozdzielić obsługę danych i logikę samego serwisu (back-end) od warstwy wizualnej (front-end). Ma to poważne zalety – z jednej strony – łatwiej wyspecjalizowanym deweloperom skupić się na tym, co znają najlepiej, a z drugiej – umożliwić względnie szybki rozwój usług i ograniczenie kosztownych zasobów serwerowych. Co dla nas najważniejsze – praca z API pozwala otrzymywać dane w okamgnieniu i najwięksi usługodawcy chcą, byś z niego korzystał/a, gdy tylko używasz mało popularnych funkcjonalności — w końcu większość użytkowników Facebooka nawet nie wie o istnieniu Biblioteki reklam. 

W dalszej części tekstu przeprowadzę Cię krok po kroku przez proces, który pozwoli Ci zdobywać dane dotyczące reklam politycznych w Meta (Facebook) i Google oraz pokażę, jakie informacje można z nich wyciągnąć na przykładzie minionej kampanii wyborczej i referendalnej.

Weryfikacja Meta

Zanim dostaniesz się do danych Meta/Facebooka, konieczne jest przeprowadzenie procesu weryfikacji. Robi się to tylko raz, a potem wystarczy tylko upewnić się, że profil nie wygasł. Konieczne są 3 składniki: weryfikacja jak do zamieszczania reklam politycznych, konto dewelopera i dodana aplikacja (w tym kontekście to fikcyjny twór).

Poniższe kroki zostały opisane tutaj.

Krok 1: Potwierdzenie Twojej tożsamości i lokalizacji

Przejdź do Facebook.com/id i przejdź proces potwierdzenia wymagany do zamieszczania reklam na tematy społeczne, wyborcze lub polityczne. Potwierdzenie przesłanych informacji może potrwać kilka dni.

Uwaga: Facebook zapyta Cię o dość wrażliwe dane (jak zdjęcie dokumentu tożsamości) i zmieni ustawienia konta, wymuszając jego mocniejszą ochronę. Jeśli na co dzień używasz Facebooka, obie rzeczy i tak warto zrobić dla własnego bezpieczeństwa! Następnie musisz poczekać ok. 2 dni, a gdy dostaniesz stosowne powiadomienie – przejść do kolejnego kroku.

Krok 2: Utworzenie konta Meta for Developers

Przejdź do strony Meta for Developers i wybierz opcję Rozpocznij (Get Started). Tworząc konto, należy zaakceptować Zasady użytkowania platformy.

Ponownie trzeba będzie podać dodatkowe dane i potwierdzić posiadanie numeru telefonu otrzymanym kodem SMS.

Krok 3: Dodanie nowej aplikacji

Kiedy masz już konto, wróć do https://developers.facebook.com/. Utwórz nową aplikację przez wybranie Moje aplikacje (My Apps) > Utwórz aplikację (Create App).

Następnie wybierz Inna (Other), nazwij ją, pozostałe pola postaw bez zmian i zatwierdź przyciskiem Utwórz aplikację (Create app).

Zignoruj wszystkie kolejne formularze, jeśli się pojawią, bo wreszcie czas, żeby popracować z danymi!

Przetestujmy dostępy: wchodzimy do Graph API Explorera, powinniśmy mieć ekran zbliżony do poniższego. Jeśli nie ma żadnej aplikacji w polu “Meta App” wybierz z listy tę, którą utworzyłeś uprzednio. Jeśli brakuje danych w polu “Acesss Token” kliknij niebieski przycisk “Generate Access Token” (koniecznie User Token) – może pojawić się nowe okienko i konieczność potwierdzenia dostępów i ponownego zalogowania. Zrobione? Kliknij “Submit” i powinny pojawić się Twoje dane w polu poniżej. Udało się – możemy przejść do kolejnego kroku.

Pobierz dane

Wreszcie mamy upragniony dostęp do interfejsu programistycznego. Jedyne, co Cię teraz ogranicza, to wyobraźnia (albo wiedza, o co zapytać).

Graph API Explorerze w polu na górze wklejamy:
ads_archive?ad_reached_countries=%5B’PL’%5D&search_terms=referendum&fields=page_id%2Cad_snapshot_url%2Cpage_name%2Cbylines%2Cad_creation_time%2Cad_delivery_start_time%2Cad_delivery_stop_time%2Cad_creative_bodies%2Cad_creative_link_titles%2Cad_creative_link_captions%2Cad_creative_link_descriptions%2Cimpressions%2Cspend%2Ccurrency%2Cdemographic_distribution%2Cdelivery_by_region%2Cpublisher_platforms%2Clanguages%2Cbeneficiary_payers%2Ctarget_ages%2Ctarget_gender%2Ctarget_locations%2Cage_country_gender_reach_breakdown%2Ceu_total_reach

Klikamy “Wyślij (Submit)”. Bum! Mamy ostatnie reklamy na Facebooku, w których pojawiło się słowo “referendum”. Czas na zabawę – zmień słowo “referendum” na dowolne inne (albo na 2 apostrofy ‘’, jeśli nie szukasz konkretnych słów w reklamie).

Można szukać też reklam konkretnych reklamodawców:

ads_archive?ad_reached_countries=%5B’PL’%5D&search_page_ids=126985130505102&fields=page_id%2Cad_snapshot_url%2Cpage_name%2Cbylines%2Cad_creation_time%2Cad_delivery_start_time%2Cad_delivery_stop_time%2Cad_creative_bodies%2Cad_creative_link_titles%2Cad_creative_link_captions%2Cad_creative_link_descriptions%2Cimpressions%2Cspend%2Ccurrency%2Cdemographic_distribution%2Cdelivery_by_region%2Cpublisher_platforms%2Clanguages%2Cbeneficiary_payers%2Ctarget_ages%2Ctarget_gender%2Ctarget_locations%2Cage_country_gender_reach_breakdown%2Ceu_total_reach

Identyfikator strony znajdziesz wchodząc w profil, wybierając “Informacje” i “Transparentność strony”.

Dokumentacja pokazująca wszystkie parametry wyszukiwania i dostępne pola odpowiedzi znajduje się tutaj – wystarczy je odpowiednio podmienić w powyższych zapytaniach.

Jeszcze ciekawiej byłoby, gdyby można było sprawnie znaleźć naprawdę wszystkie reklamy (domyślnie jest ograniczenie do ostatnich wyników). Jak to zrobić? Tutaj już przydadzą się drobne umiejętności programistyczne, dlatego spieszę z pomocą. Oto prosty (i zawodny) skrypt w PowerShell (który udostępniam na licencji MIT):

$token = “wstaw tu token

$baseUrl = “https://graph.facebook.com/v18.0/ads_archive”

$date = “2023-08-09

$countries = “[‘PL’]”

$searchPageIds = “126985130505102

$initiate = $true

$escape = $false

$alldata = @()

$url = “$baseUrl” + “?ad_delivery_date_mi=$date&ad_reached_countries=$countries&search_page_ids=$searchPageIds&fields=page_id%2Cad_snapshot_url%2Cpage_name%2Cbylines%2Cad_creation_time%2Cad_delivery_start_time%2Cad_delivery_stop_time%2Cad_creative_bodies%2Cad_creative_link_titles%2Cad_creative_link_captions%2Cad_creative_link_descriptions%2Cimpressions%2Cspend%2Ccurrency%2Cdemographic_distribution%2Cdelivery_by_region%2Cpublisher_platforms%2Clanguages%2Cbeneficiary_payers%2Ctarget_ages%2Ctarget_gender%2Ctarget_locations%2Cage_country_gender_reach_breakdown%2Ceu_total_reach&access_token=$token”

do {   

    $results = Invoke-WebRequest -Method GET $url -ErrorAction Ignore

    $content = $results.Content

    if ($content -ne $null) {

        $data = ($content | ConvertFrom-Json).data

        $next = ($content | ConvertFrom-Json).paging.next -as [string]       

        if ($data -ne $null) {

            if ($initiate) {

                $alldata = $data

                $initiate = $false

            } else {

                $alldata += $data

            }

        }

        if ($url -eq $next -or $next -eq “”) {

            $escape = $true

        } else {

            $url = $next

        }

    } else {

        Write-Host “No data received from the URL: $url”

        $escape = $true

    }

} until ($escape)

$alldata | ConvertTo-Json | Out-File -FilePath ./dane_facebook.json

Krótka instrukcja, jak to wykorzystać (na Windowsie):

  1. Otwórz Menu Start i wpisz PowerShell ISE.
  2. W nowo otwartym oknie wklej powyższy skrypt na białe pole.
  3. Zmień datę początkową (dobrą praktyką jest by jednak nie szukać wszystkich danych, bo możemy wykorzystać cały limit zapytań i nie otrzymać pełnych wyników), określ listę interesujących stron (przedzielonych znakami %2C – odpowiednikiem przecinka np. 703930466334460%2C611173789051754).
  4. Potrzebujesz jeszcze tokena – weź go ze strony  Graph API Explorera i wstaw w odpowiednie miejsce w skrypcie (pamiętaj tylko o jego podmianie przy następnym uruchomieniu, bo wygasa).
  5. Naciśnij F5 (lub mały trójkąt w menu) i poczekaj aż skrypt zakończy działanie.
  6. Dane są w pliku dane_facebook.json – w specjalnym formacie danych uwzględniający ich hierarchię. Jeśli po prostu chcesz zobaczyć tabelę, na niebieskim polu w oknie PowerShell ISE wpisz: $alldata | ft page_name,id,ad_creation_time (po przecinku możesz wymienić inne pola).

Weryfikacja Google

Jeśli przebrnąłeś przez wcześniejszy proces to na pewno się ucieszysz: z Google jest znacznie szybciej i prościej.

Krok 1: Utworzenie konta dewelopera

Odwiedź https://developers.google.com/ i kliknij “Rozpocznij” obok awatara (lub inicjału).

Krok 2: Utworzenie projektu BigQuery

Odwiedź https://console.cloud.google.com/bigquery i wybierz “Nowy projekt” i postępuj zgodnie z instrukcjami na ekranie.

Gdy to zrobisz, od razu możesz zacząć pracę z  danymi. Na szarym polu wybierz plusik i w biały obszar wklej poniższe zapytanie:

SELECT

  *

FROM

  `bigquery-public-data.google_political_ads.creative_stats` AS CS

WHERE

  REGEXP_CONTAINS(CS.regions,

    r”PL”)

  OR REGEXP_CONTAINS(CS.geo_targeting_included,

    r”Poland”)

Kliknij “Uruchom” i po paru sekundach powinny pojawić się wyniki podobne do poniższych.

Właśnie dostałeś wszystkie reklamy i wszystkie atrybuty z nimi związane!

Może wystarczą zgrupowane raporty dla wszystkich reklamodawców? Tak też można:

SELECT

  *

FROM

  `bigquery-public-data.google_political_ads.advertiser_stats` as AR

WHERE

  REGEXP_CONTAINS(AR.regions,

    r”PL”)

Więcej informacji o dostępnych danych z Raportu Transparentności Reklam Google można znaleźć w tym artykule.

Co dalej?

Przejście tych wszystkich kroków mogło być uciążliwe, a na koniec zostajemy z długą listą reklam i kont, które trzeba ręcznie przejrzeć, by ocenić czy rzeczywiście są politycznymi i do której partii je przypisać. Nie musisz tej syzyfowej pracy wykonywać – zebrałem wszystkie dostępne dane i wspólnie z Fundacją Odpowiedzialna Polityka i WhoTargets.Me przygotowaliśmy szereg wizualizacji, które mogą pomóc Ci zorientować się kto, co i za ile.

Wydatki od początku kampanii dla Facebooka:

https://trends.whotargets.me/countries/PL/explorations/explorations/ad-spending?start_date=2023-08-08&end_date=2023-10-27

Klikając w nazwę profilu dostaniesz listę wszystkich reklam, jakie dystrybuowała dana strona Facebooka.

Dane, które uwzględniają też Google – ostatnie 30 dni kampani włącznie znajdziesz na stronie:

https://favstats.github.io/poland2023/

W jaki elektorat partie inwestowały?:

https://favstats.github.io/poland2023/targeting.html

Trzeba jednak pamiętać, że dane z API nie są w 100% kompletne, wielokrotnie zdarzało się mi bowiem widzieć reklamy polityczne, które nie zostały tak oznaczone przez polityków (a to konieczne, by były osiągalne przez API) lub które zniknęły z raportów. Częściej miałem do czynienia z taką sytuacją w przypadku reklam Google.

Weryfikacja X (Twitter)?

Zapewne nurtuje Cię dlaczego nie ma tu opisu dla X (dawniej Twitter). Cóż, sposób udostępniania danych przez platformę należącą do Elona Muska pozostawia wiele do życzenia i nie udało mi się ani “ręcznie”, ani przez API dostać danych. Jedyny sposób, który do tej pory zadziałał to… wypełnienie formularza i oczekiwanie na maila.

Reklamodawcy i platformy reklamowe w różny sposób interpretują wymóg Kodeksu wyborczego ujawniania sponsora reklamy. Na szczęście Unia Europejska pracuje nad unormowaniem rynku reklamy politycznej on-line, a sama praca nad nowymi regulacjami ma już pozytywny wpływ na zmiany w serwisach.

 

 

Pomóż jawności i naszej niezależności!

Komentarze

Dodaj komentarz

Przed wysłaniem komentarza przeczytaj "Zasady dodawania i publikowania komentarzy".

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *