Eliminar información GPS de mis tweets sin borrar los mensajes

Si el post Famosos, no famosos y terroristas publican en Twitter su ubicación GPS. ¿Lo haces tú? de Chema Alonso te puso los pelos de punta, no puedes parar de pensar: “Genial, ahora tengo que ir tweet por tweet viendo en cuál se compartió mi ubicación, ver si lo borro o no lo borro, ver si me cargo medio Timeline, no me lo cargo… ¡Espera! Que no está todo perdido: existe una forma de eliminar la localización de todos los tweets, ¡sin borrar los mensajes!  En el apartado de Seguridad y privacidad de Twitter lo solucionamos.

Borrar toda la información de ubicación

En la configuración de una cuenta de Twitter, existe un apartado llamado Seguridad y Privacidad, donde podemos encontrar diferentes opciones: verificación del inicio de sesión, restablecimiento de la contraseña, etiquetado de fotos, privacidad de los tweets y… voilà! ubicación del tweet.

Twitter - Borrar toda la información de ubicación

Twitter – Configuración – Borrar toda la información de ubicación

Como se puede ver en la imagen anterior, existe un apartado donde se puede activar/desactivar la ubicación de los tweets de la cuenta, pero además se puede eliminar la información existente en los tweets antiguos. Justo debajo de esta opción nos avisa de que la operación puede tardar hasta 30 minutos en completarse, pero ¡oye! seguro que a nosotros nos llevaría mucho más que eso.

¡Saludos!

 

Solicitar la eliminación de contenido del índice de Google, ¡aunque no sea tu sitio!

La semana pasada publiqué los pasos para eliminar tus datos de Infobel.com, página que muestra tu número de teléfono y dirección, si tienes una línea de teléfono fija asociada a tu nombre.

Si bien en aquel post comentaba que existía la posibilidad de retirar el contenido del índice de Google a través de la Solicitud de retirada de resultados de búsqueda en virtud de la normativa de protección de datos europea, uno de los lectores (gracias Ramón) me advirtió de que existe otra página dentro de Google Webmasters Tools, https://www.google.com/webmasters/tools/removals, que permite solicitar la eliminación de una URL, aunque no seas el propietario del sitio.

Google  Webmasters Tools solicitar eliminacion URL

Google Webmasters Tools – Solicitar la eliminación de una URL

Cuando escribimos la URL y hacemos clic sobre Solicitar eliminación, primeramente se realiza una comprobación para ver si el contenido al que apunta esa URL todavía está disponible en el sitio web.

Google Webmasters Tools - Analizando URL

Google Webmasters Tools – Analizando URL

De ser así nos preguntará si somos el propietario, con el fin de que actualicemos el contenido (indicando que no queramos que sea indexado por los navegadores, por ejemplo) o bien para eliminarlo, ya que de lo contrario esta acción solamente sería temporal hasta que los robots de Google analizaran de nuevo el contenido del sitio, incluyendo la URL que queremos eliminar. Si embargo, esta no es la parte que nos interesa.

En el caso de no ser propietario, si el contenido todavía existe tendremos que ponernos irremediablemente en contacto con el webmaster del sitio.

Google Webmasters Tools - Ponte en contacto con el propietario del sitio

Google Webmasters Tools – Ponte en contacto con el propietario del sitio

Sin embargo, existen otros casos donde sabemos que la información no está disponible desde el sitio web que lo alojaba pero sigue estando almacenada en el índice de Google, como se comentaba en el post sobre Infobel.com. Al tratarse de información sensible, en ese caso utilicé la Solicitud de retirada de resultados de búsqueda en virtud de la normativa de protección de datos europea, pero  también hubiera valido este otro método. Cuando el contenido no existe en el sitio de origen, podemos enviar la solicitud a Google, aunque nos advierte que el propietario puede recibir una notificación debido a esta solicitud.

Google Webmasters Tools - Analizando URL - Este contenido ya no existe

Si finalmente solicitamos la eliminación, aparecerá la URL con estado pendiente y el tipo de eliminación Eliminación de página obsoleta en la tabla inferior.

Google Webmasters tools - Solicitud pendiente

A día de hoy desconozco cuánto tiempo tardan en tratar la solicitud. Actualizaré el post cuando tenga más datos.

¡Saludos!

Api Management: Convertir XML a JSON usando políticas ¡sin modificar las Apis!

En el mes de Octubre hice una breve introducción a Api Management, uno de los nuevos servicios de la plataforma Microsoft Azure. La función principal de este es centralizar el uso de nuestras Apis por terceros, aunque lo cierto es que nos va permitir mucho más: establecer cuotas, reescribir URLs, modificar el contenido de la respuesta, conversión entre formatos, etcétera. Muchos de estos poderes extra se consiguen a través de lo que se conocen como políticas. En este post voy a mostraros cómo de fácil es transformar el resultado de una Api, que sólo devuelve XML, a JSON.

La Api

En primer lugar he creado servicio con Windows Communication Foundation, el cual tiene el siguiente aspecto:

using System.ServiceModel;
using System.ServiceModel.Web;
using WcfService.Model;

namespace WcfService
{

    [ServiceContract(Namespace = "")]
    public interface IService
    {

        [OperationContract]
        [WebGet]
        Profile GetData(int id, string name, string address);

    }
}

Esta demo sólo expone un método llamado GetData, el cual recibe todos los valores necesarios para construir y devolver un objeto del tipo Profile tal y como se muestra en su implementación:

using WcfService.Model;

namespace WcfService
{
    public class Service : IService
    {
        public Profile GetData(int id, string name, string address)
        {
            return new Profile { Id = id, Name = name, Address = address };
        }
    }
}

Respecto a la configuración del servicio con WCF, se ha creado un binding del tipo webHttpBinding, se ha expuesto utilizando un behaviour webHttp y se ha dejado el resto de la configuración por defecto.

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webBinding"></binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="WcfService.Service" behaviorConfiguration="MyBehavior">
        <endpoint address="xml"
                  binding="webHttpBinding"
                  bindingConfiguration="webBinding"
                  behaviorConfiguration="xmlBehavior"
                  contract="WcfService.IService"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="xmlBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
Si quieres saber más sobre cómo crear un servicio con WCF quizás te interese este post.

Antes de añadir el servicio a Api Management, podemos comprobar el resultado que genera utilizando Fiddler:

Fiddler testing WCF service

Policies

En el apartado Policies elegimos el método GetData a través de los combos y seleccionamos la opción ADD POLICY en el cuadro inferior.

Policies combo and add policy

A partir de este momento el cuadro de configuración de políticas estará activado, mostrando la siguiente información:

<!--
    IMPORTANT:
        - Policy statements MUST be enclosed within either <inbound> or <outbound> elements.
        - <base /> elements represent policy-in-effect inherited from the outer scopes.
        - <inbound> element contains policies to be applied in the inbound direction (from caller to web service).
        - <outbound> element contains policies to be applied in the outbound direction (from web service to caller).
        - Policies are applied in the order they appear.

    To ADD a policy, position cursor in the policy document to specify the insertion point and click on the associated button for a desired policy statement button.
    To REMOVE a policy, delete the corresponding policy statement from the policy document.
    To RE-ORDER a policy, select the corresponding policy statement and cut-and-paste it into a new location within the policy document.
-->
<policies>
    <inbound>
        
        <base />
        
    </inbound>
    <outbound>

La configuración es muy sencilla: la etiqueta base se utiliza para heredar todas las políticas que estén definidas en niveles superiores. Inbound se utiliza para especificar políticas de entrada y outbound de salida.
En el caso de la conversión de XML a JSON se trata de una política de salida. Para crearla posicionamos el cursor en el apartado outbound y seleccionamos el enlace Convert XML to JSON, ayudándonos de los valores que se muestran al lado derecho del cuadro, policy statements.

Policy Outbound  Convert XML to JSON

La línea que se agrega es la siguiente:

<xml-to-json kind="javascript-friendly | direct" apply="always | content-type-xml" consider-accept-header="true | false"/>

Existe un apartado en la documentación de Api Management, llamado Azure API Management Policy Reference, donde podemos ver todos los valores y políticas que están soportadas actualmente. Respecto a este ejemplo, podemos conocer cuáles son los valores que podemos configurar aquí. Esta es la configuración que he elegido:

<xml-to-json kind="javascript-friendly" apply="content-type-xml" consider-accept-header="true"/>

Developer portal

La forma más sencilla de comprobar que la política funciona correctamente es a través del Developer portal, al cual se puede acceder desde el menú superior del portal de administración. Una vez en él, elegimos el servicio desde el apartado APIS y abrimos la consola. Si introducimos 3 valores aleatorios para los parámetros y hacemos clic sobre HTTP GET el resultado debería mostrarse en formato XML.

Api Response content without headers

Para conseguir la conversión a JSON, basta con añadir la cabecera accept: application/json en la petición:

Api get profile accept json example

Si comprobamos el resultado, esta vez habrá sido transformado a JSON:

Api response content with header

¡Saludos!