¿Cómo puedo ofuscar las direcciones de correo electrónico contenidas en los campos de texto de ''entrada libre'' en Django?
email automation (3)
En mis modelos, a menudo uso campos de texto que están destinados a contener grandes piezas de entrada con formato textil. Me gustaría ofuscar automáticamente cualquier dirección de correo electrónico que se ingrese en estos campos de texto, de modo que cuando se impriman en una plantilla no sean visibles para las arañas.
¿Hay alguna manera inteligente de hacer esto?
Actualizar:
Basado en la respuesta de lazerscience a continuación, este fue el código que terminé usando. Puse el nombre del archivo codde_mailto.py y lo puse en un directorio templatetags, dentro de una aplicación tipo ''utilidades'' que instalé en la mayoría de mis proyectos django.
import re
import random
from django.utils.safestring import mark_safe
from django import template
register = template.Library()
email_link_pat = re.compile(r''<a/s+href=("|/')?mailto:[^>]+>[^<]*</a>'')
email_pat = re.compile(r''/b[-./w]+@[-./w]+/.[a-z]{2,4}/b'')
def get_script(m):
code_list = []
for c in m.group(0):
d = ord(c)
x = random.randint(0, d)
code_list.append("%d+%d" % (x, d-x))
return ''<script type="text/javascript">document.write(String.fromCharCode(%s))</script>'' % /
",".join(code_list)
def encode_mailto(text):
text = email_link_pat.sub(get_script, text)
text = email_pat.sub(get_script, text)
return mark_safe(text)
register.filter(''encode_mailto'', encode_mailto)</pre>
A continuación, utilícelo en las plantillas de la siguiente manera:
{% load encode_mailto %}
{{"A bunch of text with an email address [email protected]"|encode_mailto }}
Si solo desea usarlo como filtro de etiqueta de plantilla:
import re
import random
from django.utils.safestring import mark_safe
email_link_pat = re.compile(r''<a/s+href=("|/')?mailto:[^>]+>[^<]*</a>'')
email_pat = re.compile(r''/b[-./w]+@[-./w]+/.[a-z]{2,4}/b'')
def get_script(m):
code_list = []
for c in m.group(0):
d = ord(c)
x = random.randint(0, d)
code_list.append("%d+%d" % (x, d-x))
return ''<script type="text/javascript">document.write(String.fromCharCode(%s))</script>'' % /
",".join(code_list)
@register.filter
def encode_mailto(text):
text = email_link_pat.sub(get_script, text)
text = email_pat.sub(get_script, text)
return mark_safe(text)
Entonces puede usarlo en sus plantillas, por ejemplo:
{{ "<a href=''mailto:[email protected]''>Send Mail</a>"|encode_mailto }}
Aquí hay algo que se puede usar.
El truco es agregar un código de ofuscación de correo electrónico que dificultará la captura de direcciones de correo electrónico utilizando un cliente que no sea js.
Añádalo como un middlware, o más bien como una etiqueta simple que puede actuar sobre objetos que contienen datos textiles.
Puede usar django-email-obfuscator
. Primero, instálalo:
$ pip install django-email-obfuscator
A continuación, agregue email_obfuscator
a INSTALLED_APPS
en settings.py
:
INSTALLED_APPS = (
# ...
''email_obfuscator'',
)
En sus plantillas, puede proteger las direcciones de correo electrónico con el filtro obfuscate
:
{% load email_obfuscator %}
{{ ''[email protected]''|obfuscate }}