youtool: dados do YouTube fáceis p/ combater a desinformação


Turicas aka Álvaro Justen
&
Ana Paula Sales


19 de outubro de 2024

PythonBrasil 2024 - Rio de Janeiro/RJ

$ id turicas

Turicas, prazer! =)

{linkedin/in,
xuítter,
github,
youtube,
instagram}
/turicas

alvaro@pythonic.cafe

Álvaro Justen

Software Livre & Python

(desde 2004/2005)

16ª PythonBrasil

       

$ id aninhasalesp

Ana Paula, prazer! =)

{linkedin/in,
github,
instagram}
/aninhasalesp

ana@pythonic.cafe

![](images/pycafe_qrcode.png) - [Brasil.IO](https://brasil.io/) - [CruzaGrafos](https://cruzagrafos.abraji.org./br), com [Abraji](https://abraji.org.br/) - [VacinaBR](https://vacinabr.org.br/), com [IQC](https://iqc.org.br/) - [LupaScan](https://scan.lupa.news/), com [Agência Lupa](https://lupa.news/) - [Monitor da Fiscalização do Desmatamento](https://plataforma.alerta.mapbiomas.org/monitor-da-fiscalizacao), com [Mapbiomas](https://mapbiomas.org/) - [pythonic.cafe](https://pythonic.cafe)
## Agenda - Investigações jornalísticas - Aplicações dos dados - YouTool: funções básicas - YouTool pela linha de comando
## [bit.ly/youtool-pybr2024](http://bit.ly/youtool-pybr2024)
## Jornalismo investigativo - Monitoramento de vídeos deletados do YouTube, por Guilherme Felitti - [Disarming Disinformation](https://www.icfj.org/our-work/disarming-disinformation-empowering-truth), do [ICFJ](https://www.icfj.org/) em parceria com [Instituto Serrapilheira](https://serrapilheira.org/) - Trabalhos resultaram em 9 matérias em veículos brasileiros e internacionais - Análise de milhares de horas de vídeos e podcasts - Fevereiro a julho de 2023 - Conteúdos publicados por pessoas eleitas, no LupaScan
## Projetos - Médicos Negacionistas - Liderado por **Fabiana Cambricoli** ([Estadão](https://estadao.com.br/)) - Em conjunto com [Ciência Suja](https://www.cienciasuja.com.br/) - Venda de curas milagrosas pela Internet - Liderado por **Jaqueline Sordi** ([Instituto Questão de Ciência](https://iqc.org.br/)) - Em conjunto com [Veja Saúde](https://saude.abril.com.br/) - Agronegócio e a negação do aquecimento global - Liderado por **Giovana Girardi** ([Agência Pública](https://apublica.org/)) - Em conjunto com [Climainfo](https://climainfo.org.br/)
## Matérias - [Associação de médicos condenada por propaganda pró-cloroquina agora aposta em discurso antivacina (Estadão)](https://www.estadao.com.br/saude/associacao-de-medicos-condenada-por-propaganda-pro-cloroquina-agora-aposta-em-discurso-antivacina/) - [O Rei Lair (Ciência Suja)](https://www.cienciasuja.com.br/temporada-3/o-rei-lair) - [Jolivi: o lucrativo e obscuro mercado das falsas curas (Revista Questão de Ciência)](https://revistaquestaodeciencia.com.br/dossie-questao/2023/06/30/jolivi-o-lucrativo-e-obscuro-mercado-das-falsas-curas) - [Empresas lucram vendendo falsas curas naturais na internet (Veja)](https://veja.abril.com.br/saude/empresas-lucram-vendendo-falsas-curas-naturais-na-internet) - [Mercadores da cura (Veja Saúde)](https://saude.abril.com.br/medicina/mercadores-da-cura) - [Jolivi: The shady and highly profitable online market for false cures in Brazil (The Skeptic)](https://www.skeptic.org.uk/2023/11/jolivi-the-shady-and-highly-profitable-online-market-for-false-cures-in-brazil/) - [Agronegócio e extrema direita impulsionam máquina de fake news sobre aquecimento global (Agência Pública)](https://apublica.org/2023/06/agronegocio-e-extrema-direita-impulsionam-maquina-de-fake-news-sobre-aquecimento-global/) - [Máquina da desinformação climática é patrocinada pelo agronegócio e a extrema-direita (Climainfo)](https://climainfo.org.br/2023/07/02/maquina-da-desinformacao-climatica-e-patrocinada-pelo-agronegocio-e-a-extrema-direita/) - [In Brazil, Agribusiness Lobby and Far-Right Politicians Sow Climate Disinformation (Nacla)](https://nacla.org/brazil-agribusiness-lobby-and-far-right-politicians-sow-climate-disinformation)
## Técnicas utilizadas - Coleta de dados ([youtool](https://github.com/PythonicCafe/youtool)) - **Encontrar vídeos a serem baixados** - **Baixar transcrições automáticas do YouTube (se o vídeo estiver no YouTube)** - **Baixar áudios dos vídeos** - Uso de modelo de IA para transcrição de áudio ([OpenAI Whisper](https://github.com/openai/whisper)) - [Veja notebook de exemplo](https://gist.github.com/turicas/da12b3c8e67a27e088d12d9c41be65d9) - Técnicas de LLM para resumo de transcrições (usando o GPT 3.5 Turbo) - [Veja *prompts*](https://colab.research.google.com/drive/1BTbW1ttT6_R2n0SrQDoNRLgktUtDoB2w?usp=sharing#scrollTo=BCTi4Br5z9jA) - Banco de dados para sistema de busca ([postgres *full-text search*](https://www.postgresql.org/docs/current/textsearch.html)) - [Veja palestra na PythonBrasil 2022](https://www.youtube.com/watch?v=tS5f7Mo6lTA)
## youtool - Facilita acesso a API e scraping do YouTube: - Requisições em lote - Utilização de diversas chaves de API - Informações de canais, playlists e vídeos - Baixar vídeo, áudio e transcrições automáticas - Comentários e live chat - API de Busca e top vídeos - *Command-line interface* (CLI): - Desfaio técnico - Subcomandos: `youtool --help` - Lançaremos hoje! - [github.com/PythonicCafe/youtool](https://github.com/PythonicCafe/youtool) - `pip install youtool`
## Descobrindo IDs de canais ```python # Não precisa de chave da API! import os from youtool import YouTube # Você pode passar mais de uma chave yt = YouTube(api_keys=[os.environ.get("YOUTUBE_API_KEY")]) url = "https://www.youtube.com/@pythonbrasiloficial" channel_id = yt.channel_id_from_url(url) # Scraping print(f"ID do canal: {channel_id}") ```
## Descobrindo IDs de canais (CLI) ```shell # Não precisa de chave da API! youtool channel-id \ https://www.youtube.com/@pythonbrasiloficial \ https://www.youtube.com/c/PythonicCafe # Outros parâmetros: # - Especificar o caminho para salvar como CSV ```
## Listando playlists de um canal ```python # Necessita de uma chave de API do YouTube (gratuita) from pprint import pprint info = list(yt.channels_infos([channel_id]))[0] print("Channel info:") pprint(info) playlist_id = info["playlist_id"] print(f"Playlist ID: {playlist_id}") ```
## Listando playlists de um canal (CLI) ```shell export YOUTUBE_API_KEY=... youtool channel-info \ UCiCQrFh8ckR_LXQyOAsOZiw \ UC9rtYzWLlYRfbYjDUDsVmUg # Outros parâmetros: # --api-key # --output-file-path ```
## Listando vídeos de uma playlist ```python import datetime video_ids = [] total_videos = 0 momento_inicial = datetime.datetime(2024, 1, 1, 3, 0, 0, tzinfo=datetime.timezone.utc) for video in yt.playlist_videos(playlist_id): if video["published_at"] >= momento_inicial: video_ids.append(video["id"]) total_videos += 1 print(f"Identificados {len(video_ids)} vídeos de um total de {total_videos} nessa playlist") ```
## Detalhes de um vídeo ```python # O método `playlist_videos` não nos fornece todas as informações sobre o vídeo videos = list(yt.videos_infos(video_ids)) print("Informações do primeiro vídeo:") pprint(videos[0]) ```
## Detalhes de um vídeo (CLI) ```shell export YOUTUBE_API_KEY=... youtool video-info NtZY3AmsBSk ```
## Baixando transcrição/áudio/vídeo ```python video_ids = ["NtZY3AmsBSk"] for status in yt.download_transcriptions( videos_ids=video_ids, language_code="pt", path="transcricoes", batch_size=3, ): print(status) # Troque por `download_audios` ou `download_videos` ```
## Trabalhando com as transcrições ```python from youtool.utils import simplify_vtt filename = f"transcricoes/{video_ids[0]}.pt.vtt" with open(filename) as fobj: vtt = fobj.read() simplified = simplify_vtt(vtt) for index, line in enumerate(simplified.splitlines()): print(index, line.strip()) if index == 20: break ```
## Baixando transcrição/áudio/vídeo (CLI) ```shell # Não precisa de chave de API youtool video-transcription pt --ids NtZY3AmsBSk ```
## Colabore! ![](images/github-youtool.png) [github.com/PythonicCafe/youtool](https://github.com/PythonicCafe/youtool)

Dúvidas?


*/turicas

alvaro@pythonic.cafe


*/aninhasalesp

ana@pythonic.cafe