Skip to content

Script para intentar geolocalizar Tweets recibidos en tiempo real

Notifications You must be signed in to change notification settings

esri-es/twitter-rt-service

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

twitter-rt-service

Este script se conecta a la Stream API de Twitter para recibir tweets en tiempo real e intentar geocodificarlos. Si lo consigue los envía a la dirección indicada por la variable ws del fichero config/elections.json (por defecto lo envía a 'ws://localhost:8888').

Relacionado: Este proyecto en combinación con arcgis_websocket_server permite servir estos datos haciéndose pasar por Stream Layer, y por tanto cargar los tweets en tiempo real en un webmap/webscene y/ cualquier1 SDK/API de ArcGIS (1 se ha detectado alguna limitación).

animation

La estructura de la información enviada se puede ver al final de esta documentación.

Instalación

Para instalar sólo es necesario ejecutar tener NodeJS instalado y ejecutar desde el directorio raíz del proyecto: $ npm install

Configuración y ejecución

  1. Crear un fichero de configuración llamado config/twitter_credentials.json
{
  "consumer_key": "YOUR_CONSUMER_KEY",
  "consumer_secret": "YOUR_CONSUMER_SECRET",
  "token": "YOUR_TOKEN",
  "token_secret": "YOUR_TOKEN_SECRET"
}

Tambien puedes hacerlo desde la consola ejecutando: $ touch ~/twitter_credentials2.json echo '{\n "consumer_key": "YOUR_CONSUMER_KEY",\n "consumer_secret": "YOUR_CONSUMER_SECRET",\n "token": "YOUR_TOKEN",\n "token_secret": "YOUR_TOKEN_SECRET"\n}' >> ./config/twitter_credentials2.json

E introduce los valores de una Twitter app (esta puedes crearla en dev.twitter.com)

  1. Edita el fichero config/elections.json a tu gusto. Esta es la configuración que viene por defecto:
{
 "words" : {
    "pp": [
      "PP",
      "pablocasado_",
      "Casado",
      "ppopular"
    ],
    "psoe": [
      "PSOE",
      "sanchezcastejon",
      "Sanchez"
    ],
    "podemos": [
      "Podemos",
      "pablo_iglesias_",
      "ahorapodemos"
    ],
    "ciudadanos": [
      "Ciudadanos",
      "Albert_Rivera",
      "Rivera",
      "ciudadanoscs"
    ],
    "vox": [
      "VOX",
      "santi_abascal",
      "Abascal",
      "vox_es"
    ]
  },
  "ws" : {
    "host" : "localhost",
    "port" : 8888,
    "protocol" : "ws"
  }
}
  1. Edita a tu gusto en emmiter.js, la lista de geocoders . Por defecto están ["arcgis", "osm"]

También puedes añadir nuevos geocodificacodes modificando el fichero src/external_geocoders.js:

  1. Abre un terminal nuevo y levanta un servidor de websockets que escuche en el puerto que has configurado en config/elections.json. Puedes usar websocat para ello:
$ websocat -E -t ws-l:127.0.0.1:8888 broadcast:mirror:
  1. Por último, para la iniciar el script tan sólo es necesario ejecutar desde la consola de comandos:

$ node emitter.js "PP,PSOE,CIUDADANOS,PODEMOS,VOX"

Nota: puede contener el valor name de cualquiera de los geocodificadores de src/external_geocoders.js (nominatim, arcgis, arcgisGlobal)

Donde el segundo parámetro el un hashtag o varios separados por comas.

Mejorar la precisión de la geocodificación

El fichero data/db.json contiene información de las geocodificaciones ya resueltas. Si se detecta que algún fallo importante se puede modificar manualmente el fichero db.json

Con este script podrás ver gráficamente el boundingbox de una geocodificación para decidir si cambiarlo: https://jsbin.com/qaxujob/1/edit?html,output

Recuerda que además de cambiar el valor del boundingbox por el nuevo (más preciso) también debes cambiar los valores:

"match": "Spain", <- la ubicación con la que ha matcheado
"geocoder": "OSM" <- el geocodificador que hayas usado

Nota: puede contener el valor name de cualquiera de los geocodificadores de src/external_geocoders.js (nominatim, arcgis, arcgisGlobal)`` Nota: puede contener el valor name de cualquiera de los geocodificadores de src/external_geocoders.js (nominatim, arcgis, arcgisGlobal)

Diagrama de flujo del procesamiento de los tweets

En el siguiente diagrama se puede ver a alto nivel las operaciones que se realizan sobre el tweet recibido a través de la API de twitter:

Diagrama de flujo

La salida final es algo como lo siguiente:

{
  "geometry": {
    "x": -424528.17139626783,
    "y": 4907035.506488578,
    "spatialReference": {
      "wkid": 102100,
      "latestWkid": 3857
    }
  },
  "attributes": {
    "username": "J.R.",
    "screename": "JOANROIG1",
    "text": "RT @AlbanoDante76: Crec que Podemos pagarà molt car haver comprat que el PSOE era \"de izquierdas\". Segueix sent un partit neoliberal, monàr…",
    "profile_image_url_https": "https://pbs.twimg.com/profile_images/1617475574/imagesCA49VD2Z_normal.jpg",
    "geo": null,
    "location": "Europa",
    "created_at": "2019-07-23T14:22:24.000Z",
    "id_str": "1153641511956955137",
    "reply_count": 0,
    "retweet_count": 0,
    "favorite_count": 0,
    "tweet_url": "https://twitter.com/AlbanoDante76/status/1153353006873763840",
    "is_rt": true,
    "lat": 40.28219691934705,
    "lon": -3.8136014490457923,
    "admin_level": 15,
    "geocoder": "osm",
    "match": "Europa, Cerro - El Molino, Fuenlabrada, Área metropolitana de Madrid y Corredor del Henares, Comunidad de Madrid, 28943, España",
    "match_coords": {
      "lon": "-3.8050105",
      "lat": "40.2862646"
    },
    "boundingbox": {
      "xmin": -3.8250105,
      "ymin": 40.2662646,
      "xmax": -3.7850105,
      "ymax": 40.3062646
    },
    "ccaa": {
      "OBJECTID": 13,
      "Nombre": "Comunidad de Madrid",
      "cod_CCAA": "13"
    },
    "pp": false,
    "psoe": true,
    "podemos": false,
    "ciudadanos": false,
    "vox": false,
    "markWords": [
      "PSOE"
    ],
    "FltId": "1153641511956955137"
  }
}

Charla: Geolocalizando tweets en tiempo real

En la charla Geolocalizando tweets en tiempo real del día día 24 de Julio de 2019 se explicó:

A continuación puede encontrar el vídeo en Youtube con un índice interactivo en la descripción del vídeo: