Decodificar Emails Protegidos por CloudFlare
Extraer y decodificar direcciones de email protegidos por CloudFlare en tu scraper. Obtener correos encriptados 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 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
}
}
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.