
Extrae ubicaciones públicas de Snap Map para descargar y clasificar historias con fines de análisis investigativo, utilizando geolocalización aleatoria y flujos de revisión automatizados.
Este programa puede buscar en los Snap Map públicos de Snapchat en múltiples ubicaciones y descargar todas las historias para su posterior investigación y categorización. Se desconoce mucho sobre cómo Snapchat decide qué videos aparecen en qué "punto" del mapa, por lo que el scraper también puede aleatorizar la geolocalización desde la que extrae en unos pocos cientos de metros para, con suerte, convencer a la API de que le proporcione algunos videos más relevantes.
Esto ha sido probado en Linux, pero debería funcionar en Windows/Mac si tiene instalado un visor de videos.
git clone https://github.com/nemec/snapchat-map-scraper.git
cd snapchat-map-scraper/
python3 -m venv env # create virtual environment
source env/bin/activate # activate virtual environment
pip3 install -r requirements.txt
Siga cada paso en orden. Además, asegúrese de haber activado su entorno virtual, de lo contrario los paquetes faltarán.
Esta base de datos contiene datos relacionados con un grupo de consultas de búsqueda. Dado que SQLite produce archivos de base de datos con poca sobrecarga, debe crear una nueva base de datos cada vez que desee muestrear datos.
python3 story_downloader.py create snap.db
El comando add añadirá una nueva ubicación a la base de datos. El programa luego extraerá y registrará snaps de todas las ubicaciones añadidas para que pueda rastrear múltiples puntos a la vez. Encuentre la latitud y longitud de su punto de interés (esto se puede encontrar fácilmente en Snap Map, como se muestra a continuación) y reemplácelos en el comando siguiente. La etiqueta hace que sea más fácil recordar dónde está un punto.
python3 story_downloader.py add --database snap.db --label "downtown dallas" 32.783038 -96.796388
# Added downtown dallas to database

El comando scrape itera a través de todas las ubicaciones añadidas y descarga snaps en esa ubicación. Las vistas previas, los videos y las superposiciones se descargan, pero el comando de revisión solo puede manejar videos por el momento.
Argumentos opcionales:
--randomize aleatorizará la geolocalización dentro de 500 m, con la intención de incitar a la API de Snapchat a enviar nuevos videos que aún no haya servido. No tengo idea de por qué Snapchat solo envía un subconjunto de videos totales para un solo punto, probablemente para hacer el servicio más escalable.--repeat hará que la aplicación se repita infinitamente buscando nuevos videos. Déjelo funcionando durante la noche para recolectar tanto como sea posible.--sleep modificará cuánto tiempo la aplicación espera antes de repetirse. El valor predeterminado es 120 segundos y solo tiene efecto si se incluye --repeat.python3 story_downloader.py scrape "downtown dallas"python3 story_downloader.py scrape --database snap.db --randomize --repeat
# Scraped 16 media from location downtown dallas
# Sleeping for 120 seconds...
El comando review revisa todos los videos no revisados y abre cada uno en un reproductor de video para su revisión. Una vez que haya cerrado el proceso del reproductor de video, el CLI le pedirá una "clasificación". Puede ser cualquier texto que describa la situación en el video o una etiqueta, etc. Si el video es irrelevante, deje la clasificación en blanco y simplemente presione "Enter". Una vez que todos los videos restantes estén clasificados, la aplicación se cerrará. Dependiendo de su sistema operativo,
python3 story_downloader.py review --database snap.db
# Classify or leave blank: police protesters
# 15 remaining
# Classify or leave blank:
# 14 remaining
# Classify or leave blank: fire
# 13 remaining
# ...
El comando export copiará todos los videos que están "clasificados" a una nueva carpeta para su posterior revisión/edición/publicación.
python3 story_downloader.py export --database snap.db export/
# 3 video(s) exported
ls export/
# 2020-05-29-04:26:30-fire.mp4
# 2020-05-30-12:26:57-crowd.mp4
# '2020-05-30-21:16:22-line of people.mp4'