Publicado el
Decodificar Emails Protegidos por CloudFlare

Extraer y decodificar direcciones de email protegidos por CloudFlare en tu scraper. Obtener correos encriptados por CloudFlare

Decodificar Emails Protegidos por CloudFlare

Me tocó realizar un servicio basado en web scraping, en dónde uno de los campos, específicamente el email, estaba codificado y protegido de bots y spam por CloudFlare, si bien mi finalidad era otra, necesitaba extraerlos. Los tags de protección pueden aparecer de la siguiente manera (obviamente el hash puede variar, lo puse a modo ejemplo):

<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b4e6dbd60dbd2c6d1ddc0d5c7828286f4d5ddd89ad9">[email&#160;protected]</a>

o también puede ser

<a href="/cdn-cgi/l/email-protection#b4e6dbd60dbd2c6d1ddc0d5c7828286f4d5ddd89ad9"><i class="svg-icon email"></i></a>

Te comparto la solución en diferentes lenguajes de programación, es una simple función. (si estás corriendolo en NodeJS, podés usar el propio decodificador).

Javascript

function cfDecodeEmail(encodedString) {
    var email = "", r = parseInt(encodedString.substr(0, 2), 16), n, i;
    for (n = 2; encodedString.length - n; n += 2){
    	i = parseInt(encodedString.substr(n, 2), 16) ^ r;
		email += String.fromCharCode(i);
    }
    return email;
}

console.log(cfDecodeEmail("b4e6dbd60dbd2c6d1ddc0d5c7828286f4d5ddd89ad9")); // usage

Python

def cfDecodeEmail(encodedString):
    r = int(encodedString[:2],16)
    email = ''.join([chr(int(encodedString[i:i+2], 16) ^ r) for i in range(2, len(encodedString), 2)])
    return email

print cfDecodeEmail('b4e6dbd60dbd2c6d1ddc0d5c7828286f4d5ddd89ad9') # usage

PHP

function cfDecodeEmail($encodedString){
  $k = hexdec(substr($encodedString,0,2));
  for($i=2,$email='';$i<strlen($encodedString)-1;$i+=2){
    $email.=chr(hexdec(substr($encodedString,$i,2))^$k);
  }
  return $email;
}

echo cfDecodeEmail('b4e6dbd60dbd2c6d1ddc0d5c7828286f4d5ddd89ad9'); // usage

GO

package main

import (
	"bytes"
	"strconv"
)

func cf(a string) (s string) {
	var e bytes.Buffer
	r, _ := strconv.ParseInt(a[0:2], 16, 0)
	for n := 4; n < len(a)+2; n += 2 {
		i, _ := strconv.ParseInt(a[n-2:n], 16, 0)
		e.WriteString(string(i ^ r))
	}
	return e.String()
}

func main() {
	email := cf("b4e6dbd60dbd2c6d1ddc0d5c7828286f4d5ddd89ad9") // usage
	print(email)
	print("
")
}

C++

#include <iostream>
#include <string>

using namespace std;

string cfDecodeEmail(string encodedString);

int main()
{
    cout << cfDecodeEmail("b4e6dbd60dbd2c6d1ddc0d5c7828286f4d5ddd89ad9") << endl;
}

string cfDecodeEmail(string encodedString)
{
    string email;
    char xorKey = stoi( encodedString.substr(0, 2), nullptr, 16);
    for( unsigned i = 2; i < encodedString.length(); i += 2)
        email += stoi( encodedString.substr(i, 2), nullptr, 16) ^ xorKey;

    return email;
}

C#

using System;

public class Program
{
	public static string cfDecodeEmail(string encodedString)
	{
		string email = "";
		int r = Convert.ToInt32(encodedString.Substring(0, 2), 16), n, i;
		for (n = 2; encodedString.Length - n > 0; n += 2)
		{
			i = Convert.ToInt32(encodedString.Substring(n, 2), 16) ^ r;
			char character = (char)i;
			email += Convert.ToString(character);
		}

		return email;
	}

	public static void Main(string[] args)
	{
		Console.WriteLine(cfDecodeEmail("b4e6dbd60dbd2c6d1ddc0d5c7828286f4d5ddd89ad9")); // usage
	}
}

Fuente

Te puede interesar...

Suscribite a nuestro blog

Recibí en tu correo todas las novedades, consejos e ideas que pueden ayudar a tu crecimiento personal y el de tu negocio.

Tus datos están protegidos. Lea nuestras Políticas de Privacidad.