ad.watch - Investigando anúncios políticos no Facebook

Por Manuel Beltrán e Nayantara Ranganathan

https://cdn.ttc.io/i/fit/1000/0/sm/0/plain/kit.exposingtheinvisible.org/il/ad-watch-cik-illustration.png


RESUMINDO: Dois pesquisadores traçam seu processo de criação do projeto ad.watch, uma investigação em estilo pesquisa aberta sobre propaganda política no Facebook. Este estudo de caso rastreia a evolução do projeto – com suas revelações, obstáculos, técnicas e ferramentas – de um esforço limitado para um recurso crescente que facilita investigações sobre anúncios políticos em todo o mundo.


Foi assim que viemos a publicar ad.watch, (ads, na abreviação em inglês) publicados no Facebook e no Instagram.

Grande parte da publicidade na internet é personalizada, um método comumente referido como publicidade direcionada.

Anúncios direcionados usam informações psicológicas, comportamentais e outros tipos de informação sobre as pessoas para apresentar a cada um de nós uma mensagem diferente.

A diferença pode estar no conteúdo, design, entrega ou outras características. A personalização das mensagens é complementada com informação sobre a sua eficácia, permitindo o teste de suposições criadas durante o perfil psicológico ou comportamental.

Como os políticos hoje usam plataformas online para divulgar suas campanhas e promover suas mensagens, e essas plataformas entregam os anúncios com base em informações pessoais, a frase «o pessoal é político» ganhou uma dimensão totalmente nova. Os anúncios são personalizados de acordo com nossos dados pessoais e padrões de comportamento, e recebemos esses anúncios direcionados em nossas telas pessoais. No entanto, entender esses mecanismos não é simples. A infraestrutura de entrega de publicidade opera invisivelmente, com as plataformas fazendo grandes esforços para ofuscar seus mecanismos e estabelecendo muitas barreiras para entender como eles funcionam. Frequentemente, nem mesmo os anunciantes têm uma visão completa de quem seus anúncios alcançam ou por quê.

Somos Nayantara e Manuel e criamos ad.watch para entender os novos canais, através dos quais a propaganda é criada e circula online.

Dados sobre anúncios políticos em plataformas de mídia social

ad.watch compila anúncios políticos postados no Facebook e Instagram de mais de 300 atores políticos em 39 países. Inclui dados visualizados e histórias que permitem navegar por esses anúncios e analisá-los individualmente ou como conjuntos de dados por país, partido político e outras categorias. O projeto enfatiza que, para entender como a propaganda política funciona online, não podemos simplesmente estudar como parece ou o que diz. Crucialmente, devemos também prestar atenção em como circula. Isso significa analisar informações sobre como os anúncios atendem diferentes categorias de pessoas - de acordo com onde vivem, sua idade, gênero percebido e assim por diante.

No momento em que escrevemos este caso de metodologia, no final de 2019, já se passaram mais de cinco meses desde que lançamos o projeto. As respostas a ele foram extremamente positivas, e ele foi usado por jornalistas que cobrem eleições e mídias sociais para investigar questões em vários países.

«Sou repórter investigativo há muito tempo, e dados como esses são essenciais para reportar atividades de campanha na era digital. Apenas olhar para contribuições e gastos em relatórios de divulgação não é mais suficiente», postou um usuário que compartilhou o link para ad.watch em HackerNews.

O projeto foi apresentado em agências de notícias e sites de reportagens sobre tecnologia, como Vice, Huffington Postageme The Hindu.

Mídia televisiva como a SkyNews no Reino Unido e a ORF na Áustria, usou os dados para descobrir histórias sobre a política do Reino Unido e as eleições austríacas. Os dados também contribuíram para as conversas em andamento sobre anúncios políticos e políticas de plataforma e foram apresentados em exposições de arte na Holanda, Argentina, Noruega, Estados Unidos e Índia.

Mas não chegamos a esse ponto facilmente. As perguntas que fizemos a nós mesmos mudaram com o tempo, e nossos conhecimentos e habilidades nem sempre correspondiam às tarefas que queríamos concluir. Tentar entender as operações de uma infraestrutura tão obscura de uma empresa excepcionalmente poderosa foi uma tarefa gigantesca.

Como não tínhamos um objetivo específico no início, seguimos tópicos que foram interessantes para nós e tentamos contornar os obstáculos. Nós, portanto, narramos a história da jornada investigativa de ad.watch através de diferentes considerações práticas, éticas, técnicas e políticas.

Entendendo as eleições indianas

Estávamos na Índia em abril de 2019, quando começaram as eleições gerais indianas. Foi supostamente o maior exercício de democracia da história. Devido ao tamanho do país, com sua população de mais de 1,3 bilhão de pessoas e o grande número de assentos parlamentares (545), as eleições aconteceram em sete fases ao longo de um mês, de 11 de abril a 19 de maio de 2019. Diferentes regiões tiveram eleições em dias diferentes.

Como ambos tínhamos curiosidade sobre tecnologia e política, começamos a observar o papel da Internet, dos dados e das empresas de mídia social nas eleições. Ficamos particularmente interessados em entender como as formas das novas mídias estavam funcionando durante o processo eleitoral. A função da TV, dos jornais e de outras mídias tradicionais na campanha política é bastante bem compreendida - há regulamentações que se aplicam a ela e tem sido tema da cultura popular há algum tempo. Mas havia pouca conscientização e percepção do público sobre a relação entre a mídia social e as propagandas políticas direcionadas e como isso seria abordado pelos órgãos reguladores, pelo público e por pesquisadores curiosos como nós.

As plataformas de mídia social cresceram rapidamente e, em alguns casos, dominam o ecossistema da mídia durante as eleições. Fenômenos da Internet como os «trending topics» (tópicos populares em determinados momentos) também influenciam a direção das reportagens e dos debates na mídia tradicional. No entanto, esses fenômenos - e como eles são gerados e como se espalham - são bastante opacos. Isso dificulta que os legisladores ou o público em geral tenham respostas adequadas. Esse estado de coisas foi uma motivação para nos concentrarmos na propaganda eleitoral nas mídias sociais.

Como a lei eleitoral indiana foi implementada muito antes do uso de anúncios digitais personalizados, tivemos que nos perguntar como essas leis seriam aplicadas nas plataformas de mídia social, especialmente com a natureza escalonada das eleições. Um detalhe específico que nos deixou curiosos foi se o «período de silêncio» seria observado nas mídias sociais e como a Comissão Eleitoral da Índia monitoraria isso.


Observação:

O período de silêncio é um tempo pouco antes dos dias das eleições, quando partidos políticos não estão autorizados a fazer campanha, organizar comícios ou publicar anúncios. O objetivo é dar aos eleitores um período em que possam refletir e decidir sem influência adicional de campanhas que possam afetar sua decisão de voto.

A propaganda circula na Índia em uma vasta gama de plataformas. O suspeitos habituais como WhatsApp, Facebook, Instagram, Google e Twitter foram sendo usados de maneiras interessantes, mas outros como ShareChat e TikTok também abrigavam grandes quantidades de propaganda organizada e desorganizada. Começamos a ficar atentos a diferentes medidas relacionadas às eleições tomadas por essas plataformas, bem como por aplicativos de entrega de alimentos e fintechs (serviços de tecnologia financeira) como Swiggy, PayTM e outros.

Passamos algum tempo pesquisando como as plataformas de internet estavam lidando com o uso de suas plataformas para mensagens políticas e publicidade. Nós encontramos abordagens diferentes: em meados de 2019 TikTok introduziu um recurso pelo qual os resultados de pesquisa e hashtags políticas populares teriam um anúncio de serviço público pedindo às pessoas que se protejam contra “notícias falsas”; outros, como o Google, exigiam certificação das autoridades locais antes de um anúncio ser veiculado nas plataformas de publicidade do Google. Depois de vários escândalos sobre seu papel na manipulação das eleições, o Facebook estava sob muita pressão para tomar medidas preventivas.

algumas hashtags como no Tiktok Captura de tela: algumas hashtags no Tiktok como #Ambedkar apareceram com um “Anúncio de serviço público” pedindo comportamento responsável, enquanto outras como #chowkidar que agregavam conteúdo incendiário diretamente relevante para as eleições não tinham o mesmo PSA. Data: 3 de maio de 2019. Fonte: Nayantara Ranganathan.

Não havia uma diretriz ou abordagem única e clara que todas as plataformas estavam compartilhando. Em vez disso, cada empresa estava testando as águas para ver como lidaria com as eleições indianas e a enxurrada de conteúdo político.

Para explorar isso ainda mais, tivemos que decidir quais plataformas monitorar. Como não tínhamos tempo nem recursos para investigar todas, decidimos focar a parte preliminar da investigação no Facebook, porque sabíamos que era uma das plataformas de publicidade online mais usadas na Índia.


Observação:

Com mais de 241 milhões de usuários ativos por mês (no início de 2020), o Facebook tem mais usuários na Índia do que em qualquer outro país. O Facebook é uma das plataformas de mídia social mais usadas na Índia, depois do WhatsApp, que também é de propriedade do Facebook (no momento em que este artigo foi escrito, entre o final de 2019 e o início de 2020).

Iniciar esta investigação não foi fácil. O Facebook lançou recentemente ferramentas que visavam tornar os anúncios políticos mais transparentes na Índia e em outro lugares.

Captura de tela: anúncio do Facebook sobre Isenção de responsabilidade de anúncios

A Biblioteca de anúncios do Facebook ofereceu uma maneira de as pessoas procurarem anúncios políticos por meio de pesquisas de palavras-chave e de nomes de páginas. Porém, quando começamos a explorá-la, encontramos problemas: as consultas de pesquisa não retornavam resultados abrangentes, apenas uma seleção de anúncios cuja lógica não estava clara para nós. Além disso, não havia nenhuma maneira de encontrar a cópia exata do anúncio que você poderia ter notado na ferramenta anteriormente, pois os anúncios não eram marcados com nenhum identificadores exclusivos para rastreá-los.

Nossa intenção era recuperar os dados para monitorar o período de silêncio durante as eleições de sete fases, o que significava que precisávamos filtrar anúncios por região e pelo período em que os anúncios foram exibidos.

Tal investigação estava além do escopo do que a Biblioteca de Anúncios era capaz de oferecer. Meses depois, a Biblioteca de Anúncios marcou cada campanha publicitária com códigos numéricos exclusivos ou “identificadores” para rastreabilidade.

Isso nos levou a procurar maneiras alternativas de monitorar os anúncios para os propósitos de nossa investigação. Chegamos à conclusão de que precisávamos construir nosso próprio banco de dados de anúncios.

Depois de pesquisar mais a fundo, encontramos uma ferramenta desconhecida e mal documentada chamada API da Biblioteca de Anúncios do Facebook (Facebook Ad Library API), que acabara de ser lançada na época em que pesquisamos, em 2019. Todos os lugares onde alguém procuraria informações sobre a ferramenta na época – Github, Reddit e outros fóruns – não falavam sobre o uso da API. O Facebook fez pouco esforço para documentar e comunicar sobre ela. Esperávamos que descobrir como usar a API poderia, potencialmente, nos permitir construir nosso próprio banco de dados de forma programática (embora nenhum de nós tivesse habilidades avançadas de programação) e fazer perguntas mais significativas sobre os dados.

A obtenção de acesso à API envolveu várias etapas desafiadoras:

  • tínhamos que ter uma conta no Facebook

  • esta conta tinha que ter exatamente o mesmo nome que nossos documentos oficiais emitidos pelo governo

  • Tivemos que adicionar um número de telefone à nossa conta e ativar a autenticação de 2 fatores

  • Tivemos que enviar uma cópia de comprovante de identidade dentre uma lista selecionada de documentos que o Facebook aceita, como carteira de motorista, etc.

  • e finalmente, dependendo da nossa nacionalidade, tínhamos que seguir etapas adicionais

Esta lista difere de país para país.


Observação:

No decorrer deste processo, enfrentamos algumas dificuldades para sermos verificado, incluindo uma visita domiciliar, mas falaremos disso mais tarde.

Por mais desafiador que tenha sido obter a verificação, foi igualmente desafiador aprender a usar a plataforma quando obtivemos acesso a ela

Conhecendo a API

Finalmente chegamos à API do Facebook, mas, nesse estágio, não sabíamos muito sobre como usá-la. Como você verá, ao aprender a usá-la, nos deparamos com perguntas sobre como criar consultas e também sobre como redefinir os resultados para uma forma que fosse útil.

A API do Facebook Graph

  • Captura de tela: A API do Facebook Graph. Data: 10 de junho de 2019. Fonte: Nayantara Ranganathan.*


Manoel

Passei muitos dias entendendo como criar buscas e o que era possível consultar, em primeiro lugar. Na ausência de documentação adequada da API, e sem muita discussão sobre isso em outros fóruns (talvez pelo fato de ter sido lançada recentemente), tudo isso era terreno novo e desconhecido. Para usar a plataforma, tive que criar uma consulta (uma lista de perguntas codificadas) que pedia ao Facebook os dados de que eu precisava.

No começo, comecei a consultar anúncios pelo parâmetro &search_terms que retorna todos os anúncios que contêm o termo em questão. Por exemplo, consultando &search_terms='modi' recebi todos os anúncios contendo o texto “modi” (ou seja, Narendra Damodardas Modi – candidato nas eleições indianas de 2019 e primeiro-ministro da Índia desde 2014 e a partir de 2019 ao escrever esta peça) e exibido nos países especificado no parâmetro obrigatório &ad_reached_countries=['IN']. Os países são especificados por meio de um código ISO para países com duas letras, IN para a Índia, neste caso.

Consultando a API através dos termos de busca conseguimos obter todos os diferentes anúncios sobre um determinado termo. No entanto, isso não era adequado à nossa tarefa de entender de forma abrangente todos os anúncios políticos comprados por um determinado partido político na Índia, pois a pesquisa pesquisa de palavras-chave mais abrangente sempre deixaria alguns anúncios fora do escopo. Além disso, às vezes os anúncios estavam em idiomas diferentes do inglês ou continham caracteres unicode, como emojis, que não poderíamos prever.

Em vez de pesquisar pelo método de palavra-chave, tentamos usar o parâmetro &search_page_ids=, mas logo descobrimos que a pesquisa de páginas e a pesquisa com palavras-chave não eram compatíveis e não podiam ser usadas simultaneamente. Decidimos abandonar o método de palavra-chave e passamos a usar Page IDs como pontos de entrada. Isso nos permitiu coletar todos os anúncios em uma página do Facebook em um determinado país. Descobrimos que até 10 IDs de página diferentes poderiam ser adicionados em uma consulta. Isso nos levou a considerar a possibilidade de resolver o problema de coletar todos os anúncios de atores políticos coletando manualmente todos os IDs de página e criando uma consulta para cada 10. A primeira etapa foi identificar os atores políticos cujos anúncios precisávamos coletar. No caso da Índia, isso foi feito por Nayantara, já que ela estava familiarizada com o contexto. Em seguida, verificamos isso com outras pessoas em nossas redes.

Página do Partido do Congresso YSR no Facebook Captura de tela: Página do Partido do Congresso YSR no Facebook https://www.facebook.com/ysrcpofficial/. Data: 29 de novembro de 2019. Fonte: Nayantara Ranganathan.

Uma vez que tínhamos a lista completa dos principais candidatos políticos e partidos políticos nos quais estávamos interessados, precisávamos pesquisar online por suas páginas do Facebook para obter seus IDs de página - um número que identifica cada página do FB. Isso envolveu um processo dedicado para cada página.

Primeiro, precisávamos encontrar as páginas dos atores políticos no Facebook. Em alguns casos, as páginas eram fáceis de encontrar; outras vezes tivemos que discernir se eram páginas de fãs ou páginas oficiais. Alguns atores políticos tinham várias páginas; algumas páginas mudavam constantemente de nome por causa de coalizões ou devido a rebranding; e, às vezes, não havia páginas para alguns partidos e candidatos. Isso significava que tínhamos que trabalhar muito para saber se havíamos chegado à página certa. Às vezes, as postagens dessas páginas estavam em idiomas regionais e, somente na Índia, há 22 idiomas oficiais e nove alfabetos diferentes. E, naturalmente, esse desafio se tornou cada vez mais complexo com o crescimento do projeto, como veremos mais adiante.

Depois de coletar as páginas do Facebook, seguimos para tarefa simples, mas repetitiva:

  • Clique com o botão direito do mouse na foto do perfil e abra-a em uma nova guia.

  • Dentro deste URL, encontre o número da ID da página, selecione-o e salve-o. Dessa forma, mapeamos, coletamos e verificamos os Page IDs.

Uma vez que tínhamos essa lista de IDs de página, compusemos nossa consulta, que ficou assim:


ads_archive?ad_active_status=ALL&ad_reached_countries=[”IN”]&fields=ad_snapshot_url,ad_creation_time,ad_creative_body,ad_creative_link_caption,ad_creative_link_description,ad_creative_link_title,ad_delivery_start_time,ad_delivery_stop_time,currency,demographic_distribution,funding_entity ,impressões,page_id,page_name,region_distribution,spend&limit=99&search_page_ids=121439954563203 ,218904931482352,351616078284404,1447651982136257,1473429256300357,192136870799912,290805814352519,241701912507991,245976 872240667,163382127013868&transport=cors

Como você pode ver acima, também incluímos outros parâmetros, que foram mencionado na documentação esparsa da API do Facebook:

  • ad_active_status=ALL - o que significa que estávamos procurando por todos os anúncios, ativos e inativos.

  • ad_reached_countries=['IN'] - o que significa que o país onde os anúncios foram alcançados deve ser a Índia (IN).

  • limit=99 significa que queremos apenas 99 resultados. Este parâmetro é extremamente importante, como entenderemos mais adiante.

  • e os campos para os quais queríamos obter respostas são os que temos depois do parâmetro &fields=:


ad_snapshot_url,ad_creation_time,ad_creative_body,ad_creative_link_caption,ad_creative_link_description,ad_creative_link_title,ad_delivery_start_time,ad_delivery_stop_time,currency,demographic_distribution,funding_entity,impressions,page_id,page_name,region_distribution,spend

Posteriormente, o Facebook incorporou o parâmetro &platform_publisher, que tem como objetivo informar se o anúncio é exibido no Facebook, Instagram, Messenger ou Audience Network.


Observação:

O Audience Network permite que aplicativos de terceiros usem a infraestrutura de segmentação do Facebook para entregar anúncios em plataformas fora do Facebook e Instagram.

Para cada anúncio, as respostas que buscamos foram as seguintes:

  • ad_snapshot_url - o URL do instantâneo do anúncio (o identificador exclusivo de cada anúncio)

  • ad_creation_time - a hora em que o anúncio foi criado

  • ad_creative_body - o corpo criativo do anúncio (conteúdo geralmente no formato texto e, às vezes, emojis)

  • ad_creative_link_title - links que podem ser adicionados no conteúdo (muitas vezes, isso leva a pesquisas em que mais dados são solicitados)

  • ad_creative_link_caption – legendas que podem acompanhar o links (como “Saiba mais” ou “Clique aqui”)

  • ad_delivery_start_time - a hora em que o anúncio foi programado para ser entregue

  • ad_delivery_stop_time - a hora em que o anúncio foi programado para parar de ser entregue

  • currency - a moeda em que foi pago

  • demographic_distribution - as idades e gêneros das pessoas para quem o anúncio foi entregue

  • funding_entity - a entidade que pagou pelo anúncio

  • impressions - o número de vezes que o anúncio pode ter sido visualizado

  • page_id - o identificador da página (ID),

  • page_name - o nome da página

  • region_distribution- as regiões nas quais o anúncio foi entregue

  • spend - uma faixa de dinheiro que foi gasto no anúncio específico

Na consulta mostrada acima, isso significava que estávamos procurando por anúncios, tanto ativos e inativos, que chegaram à Índia, de dez atores políticos, até um limite de 99 anúncios.

captura de tela com página de teste de API do Facebook mostrando resultado de consulta Captura de tela: a inserção da consulta acima em https://developers.facebook.com retorna os dados neste formulário. Data: 30 de novembro de 2019. Fonte: Nayantara Ranganathan.

Essa consulta retornou alguns dados e foi nosso primeiro passo para obter uma compreensão de como era a aparência dos dados.

Mesmo nesse estágio, só tínhamos conseguido coletar dados sobre os 99 anúncios mais recentes. O Facebook permitia a coleta de até 5.000 anúncios, mas a probabilidade de a consulta travar aumentava drasticamente à medida que aumentávamos o número de anúncios solicitados. Acontecia com muita frequência a guia do navegador em que visitávamos a API da biblioteca de anúncios travar quando fazíamos uma consulta grande. Por isso, nos limitamos a consultas que retornavam entre 99 e 200 resultados. Precisávamos encontrar uma maneira de ir além dos 99 resultados que eram práticos de coletar, mas também além dos 5.000 que teoricamente eram oferecidos, para coletar todos os anúncios.


Observação:

As consultas à API travavam inesperadamente por motivos desconhecidos, às vezes funcionando, às vezes não, e às vezes fornecendo erros diferentes para a mesma consulta. A essa altura, ficou óbvio para nós que a falta de interesse do Facebook em documentar a API estava associada a possíveis impedimentos para que as pessoas coletassem dados sistematicamente.

A escala das barreiras nos fez pensar se a plataforma estava intencionalmente nos impedindo de acessar os dados e se o lançamento da biblioteca de anúncios e da API era uma forma de encobrir as preocupações com a transparência com uma ferramenta propositalmente inadequada. Isso também ocorreu durante um período em que o Facebook estava reprimindo muitas empresas de software por coletarem dados de sua API regular. Essas proibições podem ser vistas como um movimento estratégico após o Escândalo da Cambridge Analytica, em que o Facebook usou o escândalo para limitar a transparência sob a bandeira de proteger a privacidade do usuário. Além disso, a eficácia da segmentação de usuários e a vantagem competitiva da plataforma de publicidade do Facebook dependem logicamente de uma divulgação mínima sobre seu funcionamento interno.

Na parte inferior da página de resultados da consulta, encontramos um URL com um número de «paginação». Esse link nos levou a um URL diferente, onde apareceu a próxima página de (99) resultados. E assim por diante. A parte principal da paginação estava no parâmetro retornado &after=. Foi fornecida uma sequência exclusiva de números e caracteres que apontava para a próxima página de resultados da mesma consulta. Descobrimos que, se incluíssemos essa paginação em nossa próxima consulta, ela nos levaria à página 2, depois à 3 etc. A aparência era a seguinte:

&after=c2NyYXBpbmdfY3Vyc29yOk1UVTFPREV3TXpRd01Eb3pNRGM0Tmprd056WTRNamd6T0RVPQZDZD

Não havia como saber quantas páginas de resultados haveria até que passássemos por todas elas. Mas, dessa forma, poderíamos pelo menos percorrer manualmente cada página de resultados e copiar os dados do navegador para um arquivo de texto. Os dados foram fornecidos no formato JSON, e cada página continha a sintaxe do início e do fim do arquivo. Isso significava que, se armazenássemos os dados à medida que eles chegavam, teríamos que criar um arquivo para cada página de resultados. Logo percebemos que salvar os resultados de cada 99 anúncios em um arquivo separado seria uma tarefa extremamente árdua e ineficiente. Por isso, procuramos uma maneira de copiar o resultado da consulta JSON sem o cabeçalho e o rodapé.


Observação:

O cabeçalho significa a parte da resposta que indica que os dados começam nesse ponto e estão contidos abaixo. Esta é a aparência das respostas JSON da API da biblioteca de anúncios: { "data": [

] }

Na primeira página de uma determinada consulta, armazenamos o cabeçalho e o conteúdo, mas não o rodapé. De todas as páginas seguintes, salvamos apenas o conteúdo sem o cabeçalho e o rodapé e, quando chegamos à última página dos resultados, coletamos apenas o conteúdo e o rodapé. Conseguimos identificar a última página dos resultados porque, na página final, não haveria mais links de paginação que levassem à próxima página de resultados. Dessa forma, conseguimos ter dados sobre os 10 partidos políticos e atores políticos em apenas um arquivo JSON.

Para que esse sistema fosse bem-sucedido, precisávamos adicionar uma vírgula (,) e uma quebra de linha no lugar do rodapé que removemos. Dessa forma, usamos a sintaxe JSON para indicar que, em vez do final do arquivo, haveria mais anúncios a seguir. A paginação foi útil para contornar os travamentos regulares da API, pois a usamos para reiniciar o processo de coleta de dados a partir da página em que houve o travamento. Passamos um tempo tentando descobrir por que essas falhas estavam ocorrendo, mas não conseguimos encontrar motivos claros. Às vezes, tentávamos novamente com a mesma consulta e ela não travava. De modo geral, foi útil usar uma quantidade baixa de resultados do parâmetro &limit=, e não ser muito rápido ao fazer as consultas.

Tínhamos que caminhar constantemente no limite entre não sermos bloqueados pelo «uso excessivo» da API e, ao mesmo tempo, evitar os travamentos imprevisíveis. A abordagem de tentativa e erro também criou outros problemas para nós, como sermos bloqueados pelos limites de taxa da API. O Facebook não havia especificado os limites de uso, mas alguns indefinidos estavam claramente em vigor. Nossos primeiros esforços para automatizar a coleta de dados com um script Python foram impedidos, e parecia que o Facebook estava deliberadamente dificultando a automação da coleta e que daria mais chances de sucesso quando as consultas fossem feitas a partir de interações manuais menores e mais lentas.

Portanto, o desafio nesse ponto passou a ser como automatizar a coleta de anúncios e, ao mesmo tempo, fazer com que parecesse um esforço manual e humano.

Desenvolvemos um padrão muito mecânico e repetitivo para coletar os dados manualmente. O fluxo de trabalho ficou assim:

  • carregar uma consulta

  • copiar o resultado, exceto o rodapé

  • clicar na próxima página

  • enquanto a próxima página carrega, cole os dados em um arquivo de texto

  • adicionar a vírgula e pular de linha para manter a continuidade dos dados na sintaxe

  • alternar guias

  • copiar os dados sem cabeçalho e rodapé

  • cole-os no documento

  • adicione a vírgula e o salto de linha…


Manoel

Atalhos como ctrl+c, ctrl+v e alt+tabajudaram a tornar esse processo mecânico mais eficiente. Para que o trabalho da API e minhas próprias ações fossem eficientes e sincronizadas, alterei o parâmetro &limit= para retornar dados que levariam o mesmo tempo para carregar no navegador que o tempo necessário para concluir minha parte do fluxo de trabalho de copiar e colar dados no arquivo de texto. A aleatoriedade do comportamento humano contornou os bloqueios e falhas do FB na maioria das vezes. No entanto, era uma tarefa extremamente lenta, repetitiva e meticulosa. Tornou-se uma rotina de resistência passar horas todos os dias apenas realizando essa coleta manual de dados, criando megabytes e depois gigabytes de dados JSON por meio desse método.

Tornei-me muito eficiente nisso, a ponto de conseguir fazer isso sem pensar, incorporando os movimentos necessários, como se estivesse andando de bicicleta. O desafio era manter-me são enquanto continuava a tarefa. Por meio desse sistema, acabamos coletando todos os dados dos anúncios sobre os atores políticos que estávamos pesquisando na Índia.

Violações do período de silêncio

A lei eleitoral indiana impõe um período de silêncio 48 horas antes do dia das eleições, o que significa que todas as atividades de campanha, incluindo anúncios online e offline, são proibidas nos dois dias anteriores ao período eleitoral. Se essas regras fossem seguidas na Internet, nossa consulta à API da biblioteca de anúncios do Facebook não deveria ter retornado anúncios veiculados de 10 de abril de 2019 até o final do dia 11 de abril de 2019 (o dia da primeira fase das eleições). Para verificar se esse era o caso, precisávamos encontrar uma maneira de dar sentido aos dados que havíamos coletado. Como eles estavam no formato JSON, precisávamos de um software que pudesse manipular e ajudar a analisar dados JSON.


Manoel

Ao pesquisar em fóruns da Web, tomei conhecimento do Tableau, um software de visualização e análise de dados. Baixei a versão de teste do Tableau Public, um software disponível para computadores com sistema operacional Windows. Trabalhar com o Tableau Public não foi simples desde o início. Precisei de algumas dicas de vários fóruns na Internet e explicações no YouTube para entender o que fazer depois de obter dados no formato JSON.

Mas o Tableau não está disponível para Linux, que é o sistema operacional que normalmente uso em meu computador. Então, para poder usar o Tableau, baixei um software de virtualização chamado VirtualBox. O software de virtualização permite executar um sistema operacional diferente do instalado no computador sem precisar adicionar outro sistema operacional ao dispositivo.

captura de tela mostrando tela do Windows com uma janela do programa VirtualBox ao centro Captura de tela: VirtualBox, um aplicativo que permite que você use seu computador para acessar virtualmente outra máquina. Data: 20 de julho de 2019. Fonte: Manuel Beltrán.

Depois de configurado e instalado, usamos o Tableau para entender os dados. Tivemos que brincar com o Tableau para entender como fazer o software ler os dados que tínhamos, como fazê-lo ler vários arquivos de dados, qual seria a estrutura desses dados combinados e, em geral, quais recursos o Tableau oferecia.

Pudemos fazer perguntas como:

  • Quais anúncios foram exibidos em um determinado período de tempo?

  • Quais partidos políticos estavam exibindo anúncios em quais regiões?

  • Que anúncios os idosos do sul da Índia estavam vendo?

Um parâmetro que achamos que seria útil para entender quais anúncios estavam violando o período de silêncio era "ad_creation_time," que registra uma data neste formato: "2019-04-02T17:22:45+0000."

Mas depois de um estudo mais aprofundado, percebemos que a data e a hora em que um o anúncio foi criado não coincidiu necessariamente com a hora em que foi entregue às pessoas. Para entender quando os anúncios foram exibidos, os parâmetros mais úteis foram "ad_delivery_start_time" e "ad_delivery_stop_time.". Isso nos deu o intervalo de tempo dentro do qual um anúncio chegou às telas das pessoas. Por causa da natureza multifásica das eleições indianas (ou seja, votação ocorrendo em diferentes horários em diferentes regiões) também tivemos que combinar o silêncio período de tempo com as respectivas regiões que iam às urnas e, portanto, sujeitas a esses períodos de silêncio. Para entender isso, nós usamos o parâmetro "region_distribution."

Filtramos os dados para mostrar os anúncios que estavam ativos durante o período de silêncio de uma região específica e analisá-los ainda mais. Começamos a ver que as violações não foram acidentais ou excepcionais, mas sim rotina. Usando os parâmetros de "ad_start_date" e "ad_stop_date," identificamos anúncios em exibição durante o período de silêncio. Além disso, usamos o parâmetro "region_distribution" para isolar os anúncios que estavam em execução no período de silêncio para determinados estados.

captura de tela do aplicativo tableau mostrando mapa do subcontinente indiano com algumas regiões destacadas Captura de tela: uma etapa no processo de compreensão do número de anúncios que violam o período de silêncio usando o software de visualização Tableau. Data: 20 de julho de 2019. Fonte: Manuel Beltrán.

Dessa forma, começamos a coletar sistematicamente todos os anúncios que violavam o período de silêncio. Naquele momento, já estávamos prestes a entrar na quinta fase das eleições, portanto, coletamos as violações das quatro primeiras fases. Descobrimos que uma das métricas mais importantes - a quantidade de dinheiro gasto em anúncios - era fornecida apenas como um intervalo. Isso complicou nossos esforços para determinar os gastos dos atores políticos. Mas como essa era uma informação crucial, decidimos chegar a um meio-termo e calculamos a média do intervalo para cada anúncio.

Como esperado, essas informações levaram a várias descobertas interessantes. Alguns agentes políticos que criaram milhares de anúncios gastaram menos dinheiro do que os agentes políticos que criaram menos anúncios, mas com um gasto maior. Entendemos que o número de anúncios nem sempre é diretamente proporcional ao valor gasto. Para nossa investigação sobre o período de silêncio, isso significava que, mesmo que um partido tivesse muito mais anúncios em violação, era possível que outro partido tivesse gasto muito mais dinheiro em anúncios cronometrados que quebrassem o período de silêncio. Essas foram observações importantes quando desconstruímos o significado dessas violações e seu escopo.

No total, coletamos 2.235 anúncios que violavam o período de silêncio na Índia durante as quatro primeiras fases.

Uma vez que percebemos que tínhamos evidências concretas de violações, enfrentamos a questão com a qual muitos pesquisadores e investigadores lutam: «O que podemos fazer sobre isso?»

A essa altura, o país ainda estava no meio da eleição de várias fases, faltando algumas semanas para a sua conclusão. Nossas opções eram notificar o Facebook sobre as violações ou notificar a Comissão Eleitoral da Índia (EC). Havia, é claro, a terceira opção: continuar documentando e escrevendo sobre o assunto. Entretanto, sem uma afiliação à mídia ou uma plataforma de publicação, não tínhamos certeza de que esse seria o caminho mais impactante.


Observação:

Embora não esperássemos que a Comissão Eleitoral (CE) estivesse equipada ou inclinada a lidar com isso, estávamos mais hesitantes em notificar o Facebook sobre as evidências. Denunciar essas violações ao Facebook significaria que colocaríamos a responsabilidade de garantir a integridade dos processos democráticos em uma empresa privada estrangeira com um péssimo histórico de prestação de contas, em vez de em uma instituição democrática. Isso significaria que estaríamos confiando ativamente ao Facebook funções de supervisão que têm um impacto significativo em nossos processos eleitorais. Embora imaginássemos que a denúncia ao Facebook seria uma maneira mais rápida de retirar os anúncios, por uma questão de princípio, decidimos denunciar primeiro ao CE e publicar nossas descobertas ao público.

Fizemos um relatório com evidências dos dados dos 2.235 anúncios em violação, categorizados pelas quatro fases das eleições, juntamente com uma breve explicação.

Como esperado, não recebemos nenhuma resposta.

Junto com o relatório para o CE, também decidimos escrever sobre isso. O HuffingtonPost Índia concordou em publicar nossa história com as descobertas sobre as violações do período de silêncio por anúncios políticos no Facebook.

Captura parcial de tela mostrando post do Huffpost India Imagem ilustrativa que acompanha a reportagem. Créditos: Manuel Beltrán e Nayantara Ranganathan.

As violações continuaram a ocorrer nas fases restantes da eleição e, até onde sabemos, nenhuma ação foi tomada até a publicação deste artigo (Abril de 2020)/

Rumo a ad.watch

https://cdn.ttc.io/i/fit/1000/0/sm/0/plain/kit.exposingtheinvisible.org/il/ad-watch_02-cik-illustration.png

No processo de encontrar respostas para nossas perguntas específicas sobre o período de silêncio, encontramos outras formas interessantes de ler os dados através do Tableau. Um dos principais desafios aqui foi entender como estruturar os dados. Como os dados que estávamos coletando estavam em vários arquivos, tínhamos que ter certeza de que os arquivos estavam «empilhados» da maneira certa.

Projetamos a coleta de dados de forma que houvesse limites de corte para os arquivos com base em seu tamanho. Isso significava que, se os dados de anúncios de um ator político fossem enormes (como os de Donald Trump), o arquivo conteria menos do que o número padrão de dados de anúncios de dez atores e, em vez disso, conteria apenas os dados de um político. Conseguimos controlar a estruturação dos dados por meio de muitas tentativas e erros, bem como com a ajuda dos fóruns da comunidade do Tableau e de vídeos do YouTube sobre a ferramenta. Por ser uma ferramenta de análise e visualização de dados tão popular, encontrar respostas para esses detalhes foi uma questão de explorar os fóruns já disponíveis.

Além das violações do período de silêncio, encontramos outros detalhes interessantes: a arquitetura das informações sobre anúncios políticos, as categorias de informações disponíveis e os dados que estavam faltando foram todos reveladores. Por exemplo, descobrimos que o Facebook definia o perfil das pessoas em binários de gênero masculino e feminino, apesar de permitir que os usuários se identificassem entre uma ampla gama de opções no lado do usuário. Essa foi uma visão interessante de como as coisas funcionam de forma diferente no nível da experiência do usuário em comparação com a infraestrutura de back-end projetada para o marketing.

captura de tela parcial mostrando parte da interface do Facebook mostrando opções para a informação sobre gênero

  • Captura de tela: opções do menu suspenso que aparecem nas configurações da conta do Facebook depois que você escolhe definir seu sexo como “Personalizado”. Data de 29 de novembro de 2019. Fonte: Nayantara Ranganathan.*

Captura parcial de tela mostrando segmentação binária gêneros usuários do Facebook - Macho e Fêmea Captura de tela: Segmentação de usuários do Facebook no binário de gênero, visível no processo de criação de anúncios ou impulsionamento de postagens. Data de 29 de novembro de 2019. Fonte: Nayantara Ranganathan.

Quando conseguimos descobrir as violações do período de silêncio, as eleições indianas estavam em andamento e as eleições para o Parlamento Europeu de 2019 estavam se aproximando. Nessa ocasião, também começamos a pesquisar dados sobre os partidos espanhóis para as eleições para o Parlamento Europeu e as eleições municipais e nacionais espanholas de 2019. Aos poucos, começamos a ampliar o escopo de nossa coleta e pesquisa de dados.

Embora agora estivéssemos coletando e explorando dados de anúncios do Facebook de vários contextos, não nos sentíamos à vontade para escrever histórias sobre países dos quais não tínhamos contexto ou conhecimento. Além disso, achávamos que, de certa forma, era incorreto fazer isso, mesmo que tivéssemos algum conhecimento dos lugares ou encontrado colaboradores de países diferentes.

Mas, embora permanecendo em nossa faixa, também queríamos tornar esses dados em outros países acessíveis. Decidimos que coletaríamos os dados disponíveis em todos os países, mas deixaríamos a análise e as investigações a cargo de quem estivesse interessado em fazê-las.

Entramos em contato com colegas e amigos em outras partes do mundo onde estavam ocorrendo eleições para ver se os dados que estávamos coletando poderiam ser úteis para eles diretamente ou se eles estavam interessados em defender a divulgação de dados semelhantes também nessas regiões. Por exemplo, nas Filipinas, o Facebook é um canal crucial para as campanhas de desinformação do governo Duterte. As Filipinas também são um dos mercados de trabalho para contratos de trabalho exploradores e traumáticos para moderação de conteúdo, inclusive para o Facebook. Falamos com um amigo e colega nas Filipinas para compartilhar o que havíamos feito e ficamos sabendo dos desenvolvimentos e preparativos de lá.

Quando decidimos começar a analisar os anúncios políticos globalmente, tivemos que considerar seriamente qual abordagem adotar, quais grupos ou pessoas já estavam trabalhando em projetos relacionados à publicidade política e quais lacunas poderíamos preencher. Sabíamos que o _**FBTrex, por exemplo, era uma ferramenta que ajudava os usuários a coletar metadados de publicações, incluindo anúncios políticos que apareciam em seus feeds de notícias, instalando uma extensão do navegador.


Dicas:

Rastreamento do Facebook Exposto (Facebook Tracking Exposed) (FBTrex) é um projeto cuja visão é que os indivíduos devem estar no controle de seus algoritmos. Entre outras coisas, o projeto oferece um plugin de navegador que coleta os metadados de todas as publicações públicas em sua linha do tempo e permite que você contribua com esses dados para um conjunto de dados públicos ou os mantenha privados para seu próprio uso. O FBTrex também permite que pesquisadores (e usuários) usem/reutilizem uma parte dos dados por meio de sua API.

A ProPublica criou uma ferramenta chamada Coletor de Anúncios Políticos (Political Ad Collector, que permite instalar um plug-in de navegador que coleta todos os anúncios políticos que você vê enquanto navega e os envia para um banco de dados que permite à ProPublica analisar melhor a natureza da segmentação de anúncios políticos.

O Who Targets Me é um projeto que também usa um plugin de navegador que você pode instalar para coletar todas as publicações patrocinadas em sua linha do tempo. O plug-in envia esses dados para um banco de dados global de crowdsourcing de anúncios políticos, compara as postagens patrocinadas com listas categorizadas de anunciantes políticos e tira conclusões sobre quem está direcionando você on-line.

Tínhamos nos familiarizado com os campos de informações que a API da biblioteca de anúncios do Facebook estava fornecendo, mas não conhecíamos os campos de informações que estavam disponíveis para os anunciantes segmentarem os usuários. Isso significava que, mesmo que soubéssemos que um determinado anúncio estava atingindo entre 1.000 e 10.000 pessoas em Delhi, não sabíamos se esses eram os parâmetros que o anunciante havia selecionado para segmentar os anúncios. Estávamos interessados em conhecer as opções disponíveis para administrar a segmentação, por assim dizer.

Assim, criamos páginas de partidos políticos fictícios e testamos a compra e a segmentação de anúncios. Criamos uma página para cada um e «impulsionamos» as postagens. O nível de detalhes disponível nesse lado da janela era, sem surpresa, muito maior do que as informações que estavam sendo reveladas em nome da transparência. Podíamos criar «públicos personalizados» especificando os tipos de «dados demográficos, interesses e comportamentos» que queríamos atingir. Também poderíamos inserir dados de pessoas que poderiam ter demonstrado interesse em nosso negócio ou campanha e o Facebook se ofereceria para exibir anúncios para um «público semelhante». Esses são métodos padrão de publicidade, mas estávamos prestes a descobrir que os campos disponíveis para segmentação pareciam bastante problemáticos e poderiam se prestar a todos os tipos de discriminação. Por exemplo, encontramos uma categoria chamada «Amigos de pessoas que comemoram o Ramadã».

Captura de tela mostrando interface do Facebook com sugestões de segmentação ao criar um anúncio Captura de tela: sugestões de segmentação ao criar um anúncio. Data: 29 de novembro de 2019. Fonte: Nayantara Ranganathan.

Estávamos cientes dos acontecimentos nos EUA, onde práticas de discriminação foram registradas e o Facebook foi responsabilizado. Também sabíamos que o Facebook havia se comprometido a não permitir a segmentação com base em raça e gênero quando se tratava de anúncios sobre emprego, moradia e crédito. Essas categorias confirmaram que esses problemas não foram resolvidos em outras partes do mundo. Por exemplo, a opção acima de «amigos de pessoas que comemoram o Ramadã» é uma categoria que pode ser facilmente usada para excluir muçulmanos em um momento em que o sentimento antimuçulmano na Índia está surgindo tanto no Estado quanto na sociedade em geral.

Interface do Facebook mostrando sugestões para excluir pessoas do direcionamento de um anúncio Captura de tela: Sugestões para excluir pessoas do direcionamento de um anúncio. Data: 29 de novembro de 2019. Fonte: Nayantara Ranganathan.

Publicando ad.watch

Decidimos coletar os dados de atores políticos em todo o mundo.

Conforme mencionado anteriormente, estávamos usando o Tableau para experimentos internos e para entender os dados. Nesse momento, descobrimos que o Tableau permitia a publicação on-line e, de fato, oferecia níveis de visualização relativamente dinâmicos e sofisticados.

Embora tenhamos começado a usar o software Tableau para nos ajudar a entender os dados, quando surgiu a questão da publicação, tivemos que pensar se queríamos tornar todo o projeto dependente de uma ferramenta proprietária e usada principalmente por departamentos de marketing para realizar análises de dados. Também tivemos que considerar se estávamos tornando nossa ferramenta vulnerável ao depender de um software proprietário que poderia decidir revogar o acesso a qualquer momento.

Exploramos outras alternativas de código aberto muito apreciadas, como o Rawgraphs e o Datawrapper. Entretanto, devido ao tamanho e às particularidades dos dados, essas alternativas foram descartadas. Algumas dessas alternativas não podiam analisar o conteúdo dos anúncios porque, às vezes, os anúncios continham caracteres de alfabetos não latinos. Por isso, decidimos usar o Tableau Public.


Observação:

Era intrigante entender por que muitos desses aclamados softwares de visualização gratuitos e de código aberto não conseguiam abrir nem mesmo pequenos trechos dos arquivos JSON.

Usamos um site chamado JSONLint que ajudou a «validar» os dados JSON, ou seja, nos ajudou a identificar se havia erros de formatação nos arquivos. Isso nos ajudou a descobrir que os erros de sintaxe identificados se deviam ao fato de que o campo com o texto frequentemente continha outros scripts além do script latino, além de emojis e caracteres incluídos em versões recentes do Unicode, o padrão para codificação de scripts em caracteres legíveis por máquina.

Então começamos a projetar nossas próprias interfaces visuais com o Tableau para navegar nos bancos de dados. Um dos problemas que encontramos ao usar o Tableau foi a quantidade de recursos de computação necessários para lidar com bancos de dados deste tamanho, que ultrapassavam os cinco gigabytes. Nossos computadores rodando através da máquina virtual eram muito lentos ou às vezes simplesmente incapazes de carregar os dados. Com os recursos financeiros limitados que tínhamos, comprar um computador mais poderoso não era uma opção.


Manoel

A universidade onde leciono fornece aos professores acesso a uma área de trabalho remota com um processador Intel Xeon com 20 GB de RAM. Essa acabou sendo uma ótima solução. Se não houvesse isso, teríamos que alugar um servidor virtual privado para a mesma finalidade. Uma área de trabalho remota pode ser acessada por meio do Remote Desktop Protocol (RDP). Esse é um protocolo que permite acessar e controlar um sistema que não está no mesmo local físico que você.

Usar o RDP do meu laptop nos permitiu começar a carregar os bancos de dados no Tableau e ter os recursos do meu terminal disponíveis para outras tarefas. Até tornou possível fechar meu laptop enquanto o RDP continuava a carregar.


Observação:

Tableau permite importar arquivos JSON de até 128 MB apenas, então tivemos para dividir os arquivos abaixo desse limite. Usamos um script Python simples chamado json-splitter para essa tarefa.

Foi um desafio encontrar o equilíbrio certo entre o que queríamos alcançar com o projeto. Por um lado, estávamos sentados sobre uma grande quantidade de dados relevantes para a política de muitos países e já havíamos encontrado problemas críticos no número limitado de países que analisamos. Havia uma certa vertigem sobre a profundidade do que mais poderia existir, o que incentivava nossa necessidade de divulgá-los. Como um projeto que expõe os mecanismos de uma tecnologia não amplamente compreendida, era importante apresentá-lo de uma forma que qualquer pessoa pudesse aprender e entender como funcionam os anúncios políticos. Ele precisava ser poderoso o suficiente para permitir que jornalistas e pesquisadores conduzissem suas investigações. E também precisava problematizar o funcionamento da infraestrutura dos anúncios do Facebook. A fusão de todos esses elementos levou algum tempo e exploramos diferentes iterações. Entre torná-lo compatível com dispositivos móveis ou baseado em desktop, optamos pelo desktop, pois ele permite uma experiência mais aprofundada. Enquanto nos aproximávamos da conclusão das interfaces que estavam prestes a dar luz ao ad.watch, a questão de como atualizar o banco de dados tornou-se mais iminente.

Se fôssemos despejar os dados diretamente para quem precisasse deles, talvez as atualizações não fossem tão relevantes, mas, como um recurso ativo, achamos que era mais importante estar sempre atualizado. Algumas semanas antes do lançamento do projeto online, participamos de um workshop do projeto Expondo o Invisível da Tactical Tech (para trabalhar, entre outras coisas, no início deste texto). Lá, recebemos ajuda de Wael Eskandar para desenvolver o núcleo inicial de um script Python que automatizaria a coleta de anúncios da API. Alguns dos desafios no desenvolvimento do script incluíam como fazer com que o Python incorporasse as modificações que estávamos introduzindo manualmente.

O próximo desafio foi fazer com que o script entendesse quando os anúncios de uma determinada consulta estavam concluídos para que o script pudesse passar para a próxima consulta. Ou como fazer com que os arquivos ficassem abaixo do limite do Tableau de 128 MB cada. Conforme observado anteriormente, o Facebook impôs limites às consultas automatizadas, então começamos a imitar o comportamento humano adicionando atrasos aleatórios entre as consultas. A partir de sua versão inicial, o script se tornou uma espécie de sistema precioso de coleta de dados, que aprimorávamos a cada dia. Ele também se tornou uma fonte de experimentação por meio da qual entendemos melhor como a API do Facebook funciona e experimentamos a coleta de outros dados além daqueles dos partidos políticos. Em um momento posterior, criamos um sistema de arquivos de texto com IDs de página que o script percorria e um arquivo separado com os códigos de país ISO de duas letras, para que ele pudesse coletar vários países de uma só vez. Esse novo sistema também nos permitiu fazer atualizações na lista de partidos políticos com mais facilidade.

Captura de tela do site ad.watch mostrando texto introdutório do projeto Captura de tela: página inicial do site ad.watch. Data: 29 de novembro de 2019. Fonte: Manuel Beltrán.

O primeiro lançamento do ad.watch, em 26 de julho de 2019, foi feito com a coleta manual de dados, mas até então também havíamos aperfeiçoado o script a um nível que nos permitiu atualizar regularmente os dados, o que se mostrou extremamente valioso para a eficácia do projeto. Colocamos o site no ar e publicamos em nossas redes pessoais de mídia social para divulgar o projeto. Recebemos muitas reações positivas, inclusive de jornalistas que estavam usando os dados para entender os esforços de transparência de anúncios muito divulgados pelo Facebook, observando as tendências nas eleições de vários países.

Bifurcações na estrada

https://cdn.ttc.io/i/fit/1000/0/sm/0/plain/kit.exposingtheinvisible.org/il/ad-watch_01-cik-illustration.png

Verificação pelo Facebook

Quando estávamos tentando acessar os dados pela primeira vez e precisávamos passar pelo processo de verificação de identidade, percebemos que nós dois tínhamos que enfrentar processos de verificação bastante diferentes para obter acesso à plataforma de anúncios do Facebook.


Nayantara

Como alguém cuja «localização do país principal» era a Índia, tive que passar por uma etapa adicional para verificação de endereço. Isso envolvia escolher entre receber um código entregue em minha casa via correio ou visita de «alguém». A diferença de tempo entre as duas opções era significativo: o correio levaria três semanas, e a visita à minha casa aconteceria dentro de uma semana. Como queríamos dar continuidade ao processo o mais rápido possível e também ficamos impressionados pelo processo de visita domiciliar, decidimos por essa opção.

captura de tela mostrando interface do processo de verificação em três etapas para acessar a Ad Library API do Facebook Captura de tela: processo de verificação em três etapas para acessar a Ad Library API. Data: 20 de abril de 2019. Fonte: Manuel Beltrán.

O que aprendemos no decorrer desse processo de identificação nos deixou boquiabertos.

Um dia após fazer o pedido de verificação, eu (Nayantara) recebi um telefonema de um homem que iria conduzir o processo. Ele disse que estava ligando sobre a verificação do Facebook e para perguntar se o dia seguinte era um bom momento para visitar.

captura de tela do applicativo onGrid Verification Associate Captura de tela: Informações de identidade do representante do OnGrid encarregado da verificação. Data: 23 de abril de 2019. Fonte: Nayantara Ranganathan

Todo esse episódio foi interessante por vários motivos, inclusive por mostrar como o aumento da tecnologia de identificação e dos negócios na Índia interagiu com grandes empresas de tecnologia, como o Facebook, que procuravam olhos e ouvidos na Índia, um exemplo perfeito de verificação de identidade como serviço.

Naquela ocasião, perguntei ao autor da chamada quem ele era e de qual empresa era. Ele hesitou um pouco e parecia que não esperava a pergunta. Quando descobrimos que ambos falávamos Kannada (idioma falado predominantemente pela população de Karnataka, no sudoeste da Índia), estabelecemos um tom de conversa mais familiar e confiável. Ele disse que trabalhava para uma empresa chamada OnGrid, e que seu nome era Umesh (nome alterado). Como ele estava falando com uma mulher na linha, percebi um tom estranho quando ele perguntou meu endereço e como chegar à minha casa. Ele também se mostrou mais solícito ao revelar detalhes sobre si mesmo.

Umesh me garantiu que eu não precisava estar em casa quando ele me visitasse e que, desde que houvesse alguém que confirmasse que eu morava lá, seria suficiente. Dois dias depois, Umesh chegou à minha casa para fazer a verificação. Ele tirou fotos da minha casa por fora, de um ponto de referência próximo a ela e pegou a assinatura da pessoa que mora comigo na casa (já que eu não estava em casa durante a visita).

captura de tela do WhatsApp mostrando conversa entre Nayantara e o representante da OnGrid Captura de tela: conversa no WhatsApp entre Nayantara e o representante da OnGrid. Data: 23 de abril de 2019. Fonte: Nayantara Ranganathan.

Naturalmente, ficamos curiosos sobre a empresa que era o provedora de serviços de verificação do Facebook. A OnGrid é uma empresa indiana que afirma estar permitindo que as pessoas na Índia «estabeleçam confiança instantaneamente» ou, em outras palavras, se envolvam em um comércio de informações de identificação. Eles oferecem tudo, desde «verificação de educação» até uma verificação de registros judiciais. Há dois anos, eles foram notícia por uma imagem assustadora que causou um arrepio coletivo na espinha das pessoas: um anúncio de reconhecimento de imagem não consensual usando a arquitetura de identificação biométrica nacional, Aadhaar. Como uma entidade separada, os termos de serviço e a política de dados da OnGrid são diferentes das políticas do Facebook sobre retenção de informações enviadas para fins de identificação.

captura de tela mostrando imagem em postage do aplicativo ONGrid que sugeria a capacidade de obter informação detalhada e privada sobre pessoas por reconhecimento facial Imagem: imagem agora deletada postada no Twitter por OnGrid. Data: 29 de novembro de 2019. Fonte: https://mashable.com/2017/02/14/india-aadhaar-uidai-privacy-security-debate/. Página arquivada aqui.*

As políticas do Facebook não mencionavam nada sobre a terceirização de alguns elementos do processo de verificação ou como as políticas de dados poderiam se alterar nesse caso. Isso possivelmente significava que os compromissos assumidos pelo Facebook para a exclusão de dados de identificação compartilhados com o Facebook não era algo que a OnGrid – enquanto atendia a necessidade de «verificação de última milha» – era obrigada a respeitar. De fato, o Facebook afirma excluir permanentemente os dados que coleta de usuários que passam pelo processo de verificação. A OnGrid, a empresa contratada pelo Facebook na Índia, por outro lado, retém esses dados para fornecer «serviços de identificação» a outras entidades. A OnGrid usa os dados das pessoas para criar seu banco de dados a fim de reutilizá-los e oferecê-los como serviço a outras entidades..

Após esse processo, finalmente concluí meu processo de verificação de endereço e tive acesso à API da biblioteca de anúncios.


Manoel

Como cidadão espanhol que mora na Holanda, meu processo de verificação de identidade foi muito mais simples e envolveu menos etapas. No entanto, após o envio, a aceitação final demorou cerca de dois dias para chegar, em comparação com a resposta instantânea que Nayantara recebeu nessa etapa, o que indica que o meu pode ter envolvido um ser humano no processo.

Esses episódios foram úteis para entender os diferentes processos de manuseio de dados em diferentes países, as vulnerabilidades criadas pelo envolvimento de agentes de verificação terceirizados e o fato escandaloso de que tudo isso era necessário para obter informações de interesse público que eram cruciais para entender como a mídia social poderia estar interferindo nos processos democráticos.

Incluir imagens e vídeo ou não?

Tínhamos um plano para visualizar os dados sobre os anúncios, mas os «visuais» do anúncio em si não podiam ser exibidos. Ou seja, as imagens ou o conteúdo de vídeo, que é o elemento que os usuários do Facebook e do Instagram devem ver, não podiam ser visualizados devido às peculiaridades da estruturação e da acessibilidade dos dados.

Os dados não foram fornecidos para download independentemente da dependência da API e, portanto, foi um desafio visualizá-los. Mas mesmo que conseguíssemos encontrar uma maneira de incorporar o link e apresentar os recursos visuais, havia outro problema: o URL com os recursos visuais incluía um «token de acesso» ativo. Esse é um token exclusivo e com limite de tempo que impede que o link seja útil após uma hora. Os links não seriam muito úteis sem o token de acesso do próprio visualizador.


Observação:

Esta é a aparência de um URL de instantâneo de anúncio:

https://www.facebook.com/ads/archive/render_ad/?id=251563729117836&access_token=EAAjPOWfPqZCgBAAJ0csteVNkFJcyxbQZA7m1xbJ8w3fzFRlm6apQ5cAnzsjBNOOJt4zSEE8IxB4k9HcKydhbcd7P4 SnNTBn82G7s>gyy5YXX8fmZC0hUGcpQMfZCp3uWaSWeX4urEcNPwB8SM01clzJSqRXPjjh8ZBguzXZC9sc9whaz0hE9MGEj889ztZBW2XNxVfitweUSkVrcKGiwePQQZB7uGBOa

Um token de acesso é o que vem depois de access_token=, e é a longo sequência de letras e números:

EAAjPOWfPqZCgBAAJ0csteVNkFJcyxbQZA7m1xbJ8w3fzFRlm6apQ5cAnzsjBNOOJt4zSEE8IxB4k9HcKydhbcd7P4SnNTBn82G7sgyy5YXX8fmZC0hUGcpQMfZCp3uWaSWeX4urEcNP wB8S>M01clzJSqRXPjjh8ZBguzXZC9sc9whaz0hE9MGEj889ztZBW2XNxVfitweUSkVrcKGiwePQQZB7uGBOa

Consideramos a possibilidade de extrair imagens da biblioteca de anúncios usando um dos add-ons do navegador, como «Download All Images». Também havia muitos scripts em Python para ajudar a fazer isso. No entanto, o Facebook impede que todas essas técnicas de raspagem coletem os recursos visuais. Além disso, o Facebook também proíbe que os usuários façam esse tipo de raspagem em geral.

captura de tela mostrando termos de serviço do Facebook Captura de tela: Termos de Serviço do Facebook. Data: 8 de dezembro de 2019. Fonte: Manuel Beltrán.

Por um lado, era importante incluir os recursos visuais, pois eles têm um valor de lembrança para as pessoas que navegam nas interfaces. Por outro lado, nos perguntamos se não seria bom não distrair as pessoas com imagens, pois o aspecto mais importante a ser transmitido era que as imagens em si talvez não fossem tão especiais quanto os metadados sobre elas, como a segmentação.

No entanto, também tentamos usar o comando «wget» para fazer isso, mas não funcionou.

Por fim, encontramos uma solução alternativa usando os recursos disponíveis no Tableau para permitir que os usuários do ad.watch pudessem inserir seus próprios tokens de acesso e visualizar o conteúdo dos anúncios.

No entanto, após o lançamento, descobrimos algo chamado “Access Token Debugger”, em que era possível estender o tempo de vida ou a validade de cada token de acesso. Começamos então a usar tokens de acesso estendidos em nosso sistema de coleta de dados.

captura de tela mostrando a ferramenta depurador de token de acesso, no site do Facebook par desenvolvedores Captura de tela: Depurador de token de acesso. Data: 30 de novembro de 2019. Fonte: Manuel Beltrán.

Trabalhando com jornalistas

Ao trabalhar em conjunto com jornalistas para investigar histórias que surgiam a partir dos dados, muitos queriam ver os dados brutos. No entanto, o compartilhamento dos dados tinha um problema. Os dados continham o parâmetro "ad_snapshot_url", que continha nossos tokens de acesso pessoal, que descrevemos anteriormente.

Esse token de acesso é exclusivo para diferentes contas de desenvolvedor e é registrado nos dados retornados pelas consultas. Como estávamos tomando cuidado para não fazer nada que pudesse revogar nosso acesso à API, tivemos que removê-lo antes de compartilhar os dados. Mas a remoção do token de acesso dos dados de cada anúncio tinha que ser automatizada, pois tínhamos milhões de anúncios. Foi muito fácil encontrar a solução pesquisando no StackOverflow, e conseguimos usar uma ferramenta chamada SED (Stream Editor) que já está incluída no terminal do Linux.

sed -i -e 's/EAAjPOWfPqZCgBAAJ0csteVNkFJcyxbQZA7m1xbJ8w3fzFRlm6apQ5cAnzsj BNOOJt4zSEE8IxB4k9HcKydhbcd7P4SnNTBn82G7sgyy5YXX8fmZC0hUGcpQMfZCp3uWaSWeX 4urEcNPwB8SM01clzJSqRXPjjh8ZBguzXZC9sc9whaz0hE9MGEj889ztZBW2XNxVfitweUSkV rcKGiwePQQZB7uGBOa//g' US_20_1.json

Usando esses parâmetros, o SED procura em um arquivo de texto o conteúdo do token de acesso e o exclui. Essa ferramenta nos permitiu limpar facilmente os arquivos brutos de dados de forma automatizada e eficiente.

Como os dados que coletamos eram sobre os próprios anúncios e não envolviam os feeds de notícias pessoais dos usuários, não tivemos que lidar com a questão da proteção de dados pessoais.

Depois de publicar ad.watch

Manutenção, atualização e adaptação dos bancos de dados

Quando o projeto se tornou público, também se tornou imperativo que os dados fossem atualizados regularmente e que o banco de dados fosse mantido. Isso envolveu questões sobre a frequência das atualizações, se os dados deveriam ser coletados desde o início a cada vez e, caso contrário, como coletar os dados exatamente de onde havíamos parado.

Adicionamos mais países à medida que seus dados eram adicionados à API do Facebook. A Argentina e o Sri Lanka foram adicionados pouco antes das eleições nesses países, e os dados de Cingapura também foram divulgados. Não houve procedimentos de verificação para a Noruega e a Suíça, mas já conseguimos coletar os dados sobre esses países.


Manoel

Com o passar do tempo, após o lançamento, também trabalhei para ajustar os scripts que usamos para coletar os dados, para que a coleta fosse mais eficiente, com intervenção humana mínima para determinadas tarefas.

Resposta do Facebook:

Pouco depois do lançamento, o (ex) vice-presidente de anúncios do Facebook proferiu algumas palavras de incentivo ao projeto. Isso foi estranho, pois o projeto não tinha a intenção de ser uma «ferramenta de visualização», mas sim de desafiar a falta de acesso sistemático aos dados pelo Facebook.

O projeto é uma ação para destacar o conflito fundamental entre a infraestrutura de publicidade do Facebook e as condições necessárias para uma participação democrática significativa na mídia social. Com o aumento da individualização possibilitado pela publicidade direcionada no Facebook e a falha em abrir esses dados em todos os países em que opera, essas condições estavam sendo derrotadas repetidamente.

captura de tela parcial mostrando Tweet de Rob Goldman elogiando o projeto ad.watch

Por esse motivo, não queríamos que o Facebook cooptasse nosso projeto e o tornasse parte de sua história de sucesso em transparência.

captura de tela parcial mostrando Tweet Manuel Beltrán agradecendo a Rob Goldman pelo elogio ao projeto ad.watch

Censura no Twitter

Começamos a notar algo peculiar dois dias após o lançamento do site. Alguns tweets feitos por outras pessoas sobre o projeto não estavam mais visíveis para nós. Era improvável que várias pessoas tivessem tweetado sobre o projeto e depois apagado seus tweets.

Logo percebemos que nossos próprios tweets sobre o projeto também estavam desaparecendo. Inicialmente, não notamos isso, pois ambos conseguíamos ver nossos próprios tweets. No entanto, acabamos percebendo que não podíamos mais ver os tweets um do outro.

Entendido como «shadowbanning», esse era um fenômeno do qual já tínhamos ouvido falar antes.

Isso se torna ainda mais difícil de detectar, pois os tweets continuam visíveis para o autor dos tweets, sem levantar suspeitas. Esse fenômeno era uma ocorrência regular que as pessoas observavam quando se tratava de tweets e contas de usuário relacionadas à Caxemira, por exemplo.

Decidimos abordar o problema imediatamente por meio de uma denúncia à equipe de suporte do Twitter. Um dia depois, ainda não tínhamos recebido resposta. Foi então que decidimos que valeria a pena solicitar apoio e ajuda para entender o que estava acontecendo. Publicamos o seguinte pedido de suporte.

Tweet pedindo apoio sobre a censura Captura de tela: Tweet pedindo apoio sobre a censura. Data: 2 de agosto de 2019. Fonte: Nayantara Ranganathan.

A essa altura, descobrimos que não apenas os tweets haviam desaparecido, mas também era impossível publicar um tweet com o URL do projeto. Descobrimos que outras pessoas também estavam enfrentando esse problema.

captura de tela mostrando vários tweets de pessoas comentando sobre censura ao projeto ad.watch Capturas de tela: Pessoas no Twitter nos alertando sobre a censura. Data: 4 de agosto de 2019. Fonte: Nayantara Ranganathan.

Foi bastante estranho que o URL do projeto também tenha sido bloqueado em Mensagens Diretas do Twitter.

captura de tela mostrando conversa direta no twitter Captura de tela: censura na janela de mensagem direta do Twitter. Data: 3 de agosto de 2019. Fonte: Nayantara Ranganathan.

Recebemos apoio de muitos amigos, colegas e desconhecidos na forma de documentação de mensagens de erro, conectando-nos e sugerindo pessoas que trabalham no Twitter para entrar em contato.

Enquanto isso, descobrimos que alguém que havia tentado publicar um link do projeto no LinkedIn também havia recebido uma mensagem de erro. Imaginamos que o URL poderia ter sido marcado em algum tipo de lista negra centralizada além das plataformas. De fato, esse foi o caso, pois descobrimos que uma das empresas de segurança que avalia URLs e cria listas de bloqueio - https://fortiguard.com/webfilter - de fato listou o ad.watch como spam com base no relatório de alguém. Entramos com um recurso junto a eles e recebemos uma resposta dizendo que eles o haviam reclassificado (curiosamente) como publicidade.

captura de tela do site Fortiguard Labs Captura de tela: resultados de uma pesquisa que classificou o ad.watch como spam. Data: 5 de agosto de 2019. Fonte: Nayantara Ranganathan.

Por fim, o Twitter removeu o shadowbanning, mas não nos deu nenhuma explicação. Nossa investigação continuou; alguém nos colocou em contato com uma pessoa que trabalhava no Twitter que parecia ansiosa para ajudar, mas isso não levou a lugar algum. Também exploramos a possibilidade de usar diferentes canais para tentar obter uma explicação sobre o motivo do bloqueio, inclusive por meio do uso do Direito à Explicação do European GDPR (General Data Protection Regulation). Teoricamente, o direito à explicação pode forçar o Twitter a informar o motivo da censura, se ela for algorítmica.

Principais conclusões

Desde as falhas técnicas nas ferramentas até as promessas sinceras nas diretrizes, aprendemos muito sobre o submundo da economia da informação, que é a venda de dados pessoais para marketing, e seu enorme impacto sobre as realidades sociopolíticas das pessoas. Além do Facebook, o projeto nos apresentou o ethos e o modus operandi das empresas que estão envolvidas na extração e monetização de dados sobre a vida das pessoas.

Esse projeto consistia em acreditar que uma pequena equipe de duas pessoas poderia, de alguma forma, desafiar uma entidade como o Facebook, com sua escala de recursos e poder de narrativa. Isso significava que estávamos constantemente sob o risco de que nosso acesso à API pudesse ser retirado, ou que nossos métodos fossem classificados como contrários aos termos de uso do Facebook, ou até mesmo que considerássemos que o Facebook tinha acesso a tantas informações confidenciais sobre nós que poderiam ser usadas de forma prejudicial. Essas coisas drásticas não aconteceram, mas no momento em que estávamos trabalhando no projeto antes de lançá-lo, carregávamos conosco todas essas possibilidades.

De modo geral, muitos fatores se uniram para a realização do projeto:

  • compreender as lacunas que existiam nesse meio

  • confiar que havia uma maneira de contornar as limitações quando as coisas não eram simples

  • procurar e se beneficiar de conselhos generosos de amigos

  • levar a sério a comunicação dos dados

Esses foram alguns aspectos que ajudaram, em retrospectiva.

A partir de janeiro de 2020, o projeto está tomando novos rumos: estamos trabalhando para tornar as informações sobre publicidade política nas mídias sociais mais facilmente digeríveis para diferentes grupos de pessoas em diferentes partes do mundo. Também estamos voltando à nossa meta inicial de criar um método para tornar os dados disponíveis para download para qualquer pessoa que deseje analisá-los por conta própria.

A manutenção e as atualizações dos bancos de dados também nos mantêm ocupados. Como os cenários políticos globais estão mudando e novos partidos e coalizões estão surgindo, recebemos contribuições de visitantes que nos enviam e-mails com novas páginas a serem adicionadas ao ad.watch.

Continuamos a documentar e atualizar o ad.watch com novas iterações do projeto. Visite-nos em ad.watch ou escreva para nós em info@ad.watch.

Todos os tokens de acesso no artigo foram modificados.


Publicado em abril de 2020
Traduzido para português em abril de 2024

Recursos

Artigos e guias

Ferramentas e Bancos de Dados

  • Bash. Uma ferramenta/linguagem para se comunicar com os sistemas operacionais das distribuições Linux.

  • API da biblioteca de anúncios do Facebook. A API do Facebook que permite que determinados usuários pesquisem anúncios marcados como relacionados à política e questões de importância política.

  • Facebook Tracking Exposed. Um projeto que oferece um plug-in de navegador, que coleta os metadados de todas as postagens públicas em sua linha do tempo e permite que você contribua com esses dados para um conjunto de dados público ou mantenha-os privados.

  • JSON splitter. Uma ferramenta de linha de comando para dividir grandes arquivos JSON em arquivos menores.

  • JSON lint. Uma ferramenta que ajuda a validar (verificar) arquivos json e reformatá-los.

  • Political Ad Collector da ProPublica. Uma ferramenta que permite instalar um plug-in de navegador que coleta todos os anúncios políticos que você vê durante a navegação e os envia para um banco de dados que permite ao ProPublica analisar melhor a natureza da segmentação de anúncios políticos.

  • Remmina. Aplicativo que ajuda a conectar-se a computadores remotos usando protocolos como o Remote Desktop Protocol.

  • Sed. Um editor que permite realizar transformações básicas de texto no terminal.

  • Stackoverflow. Um fórum da web onde os desenvolvedores fazem e respondem perguntas.

  • Tableau. Um conjunto de aplicativos de software para visualização e análise de dados.

  • VirtualBox. Aplicativo que permite executar um sistema operacional diferente daquele instalado em seu computador.

  • Wget. Software para recuperar conteúdo de servidores da web.

  • Who Targets Me. Um projeto que usa uma extensão de navegador de plug-in de navegador para anúncios políticos de crowdsourcing, você pode instalá-lo para coletar todas as postagens patrocinadas em sua linha do tempo e ver quem está direcionando seu voto.

Glossário

term-api

API – significa interface de programação de aplicativos (Application Programming Interface em inglês), uma ferramenta de software que facilita a comunicação entre um usuário e um conjunto de dados, entre outras coisas. uma forma pela qual um plataforma pode tornar seus dados acessíveis a desenvolvedores externos gratuitamente ou sob algumas condições ou taxas. Por exemplo, a API da biblioteca de anúncios do Facebook permite que os usuários consultem dados de anúncios usando um conjunto particular de comandos desenvolvidos pelo Facebook.

term-extension

Extensão do navegador – também chamados de add-ons, são pequenos pedaços de software usado para estender as funcionalidades de um navegador da web. Estes podem fazer qualquer coisa, desde permitir fazer imagens de páginas da web que você visita a verificar e corrigir sua ortografia, ou bloquear anúncios nos sites.

term-plugin

Plugin do navegador - um software que pode ser adicionado aos navegadores para melhorar funcionalidades específicas.

term-fbpageid

Facebook Page ID - um número que identifica exclusivamente cada página do Facebook.

term-interface

Interface - (neste caso) um conjunto de visualizações interativas que permite que os usuários tenham uma representação gráfica dos dados.

term-iso

Código de país ISO - os códigos alfabéticos curtos criados e mantidos para cada país pela ISO: https://www.iso.org/obp/ui/#search.

term-json

JSON - JavaScript Object Notation, um formato popular para troca de dados. De acordo com o site JSON, é fácil para os humanos lerem e escrever e fáceis para as máquinas analisarem e gerarem.

term-query

Consulta/Requisição - uma lista de perguntas codificadas que um usuário pode inserir em programas e aplicativos para obter dados sobre uma questão ou assunto de interesse.

term-python

Python - uma linguagem de programação que permite aos desenvolvedores escrever vários programas, como aplicativos da Web, sites, ferramentas de análise de dados: https://www.python.org/.

term-pythoneditor

Editor Python - aplicativo para navegar, depurar, compilar e executar scripts na linguagem Python.

term-rdp

Remote Desktop Protocol (RDP) - um protocolo que permite acessar e controlar um sistema que não está no mesmo local físico que você.

term-shadowbanning

Shadowbanning - quando alguns tweets (ou contas) são despriorizados ou desaparecem das linhas do tempo e das contas sem um aviso de censura explícito.

term-targetads

Publicidade ou Anúncios direcionados – uma forma de publicidade que visa atingir ou serem mostrados apenas acertos grupos selecionados ou indivíduos com características particulares ou de áreas geográficas específicas, com base nos dados disponíveis sobre eles. Por exemplo, colocar anúncios de venda de bicicletas em contas do Facebook de jovens em Amsterdã.

term-terminal

Terminal - também chamado de interface de linha de comando (CLI, Command Line Interface), é um meio de interagir com um computador usando uma interface baseada em texto onde é possível inserir comandos em um programa de computador.

term-trendtopics

Trending topics - tópicos que são populares em determinados momentos.

term-unicode

Unicode - o padrão para codificar scripts com caracteres legíveis por máquina.

term-uniqueid

Identificadores únicos - (neste caso) códigos únicos que são criados e marcados em cada anúncio, para que possam ser rastreados, se necessário.

term-vps

Servidor Privado Virtual (VPS) - Do inglês Virtual Private Server, é uma máquina virtual, alugada como um serviço, por uma empresa de hospedagem na Internet.

term-virtualsoft

Software de virtualização - software que permite executar um Sistema Operacional diferente daquele instalado em seu computador sem a necessidade de efetivmento adicionar outro sistema operacional em seu dispositivo.

term-wget

Wget - uma ferramenta do projeto GNU para obter arquivos de servidores web. A ferramenta permite o transporte de arquivos através de mais de um protocolo.