"Buenos dias, queria saber si hay alguna forma de checkear en gmx.com los emails validos, con esto quiero decir, que tengo una cuenta gmx en el cual me falta 3 caracteres por rellenar, y queria crear un script para que checkea estas 3 posibles combinacions desde la 0-9 a-z, si alguien me puede pasar una guia o el script hecho lo apreciaria. Gracias"
Bueno basicamente he creado 2 archivos uno json y otro python, he generado un diccionario con crunch de 3 caracteres cada uno, el Request URL: https://onereg-email-suggest.gmx.com/email-alias/availability es este en cual se puede ver que emails estan validos y cuales no.
AHora lo que me queda es el codigo.
El enlace que pones es incorrecto.
Para solo permitir letras y números puedes fijarte que matchee con la expresion regular:
/[A-Za-z0-9]+/
Por otro lado creo que puedes darle la especificación de solo letras y números a crunch en lugar de crear todo y después filtrarlo.
Saludos,
Creo que ya entendí, tu quieres mandarle los valores automáticamente y que te diga si están disponibles..
Este es el método post que envía en mi caso:
POST /email-alias/availability HTTP/1.1
Host: onereg-email-suggest.gmx.com:443
Accept: application/json, text/plain, */*
Authorization: Bearer qXeyJhbGciOiJIUzI1NiJ9.eyJjdCI6ImJ2aUZsOElzbVdRVGowQ1RXWHRhRjZTRkxDb1NTYlp1S1hLY0hzYmcwQ0JJekFTSkRZazNkYXhKM3ZNcVJLMEdVUzhrVnRKSHJtMlpJNHlHc1diMXZ1Q1ZCd1J5SHU0MU9FV2lxV0lFUkRvUkJ0QXlYLV9hLWtKWXZ6TkJqdUZBN196WmNrNlRsaEY4LXFZZmU3eFJHVjlMQ25RbzZXN3h3T2lNZDZQdEJ4VSIsInNjb3BlIjoicmVnaXN0cmF0aW9uIiwia2lkIjoiMjJhNTc4YTMiLCJleHAiOjE1NzYwOTkxNDYyOTIsIml2IjoiU1NlYWpVNHNGTG1FdkdjalVwUVJVQSIsImlhdCI6MTU3NjA5MTk0NjI5MiwidmVyc2lvbiI6Mn0.IJhoJVmV3fae8sI7ZCkeEGoomMnBQzdNlbuCVgRqxf0
Content-Type: application/json
Origin: https://signup.gmx.com
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36
X-CCGUID: dbf115df-3393-4f60-97d1-6df5cfd3d57d
X-REQUEST-ID: be594052-5f5d-4474-a753-4ac822a5a1e4
X-UI-APP: @umreg/registration-app2/5.9.1
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://signup.gmx.com
Cache-Control: no-cache, proxy-revalidate
Connection: close
Content-Length: 127
Content-MD5: THSL4VpC/AITAoELgz1OmQ==
Content-Type: application/json;charset=utf-8
Date: Wed, 11 Dec 2019 19:23:35 GMT
Server: Apache
Strict-Transport-Security: max-age=31536000; includeSubDomains
Vary: Origin
X-Content-Type-Options: nosniff
X-REQUEST-ID: be594052-5f5d-4474-a753-4ac822a5a1e4
X-UI-PROVIDED-IDENTITY: [email protected]
X-UI-VERSION: 2.5.25/2.5.25
No se si use alguna variable de session, por las dudas si queires ver tus métodos POST más fácil que en network del developer tools, instala el HTTP Live headers.
Bueno quedaría que envíes un método post similar desde tu aplicación
Ya que tu creaste el JSON y estas con python chequea esto:
import json
import urllib2
data = {
'ids': [12, 3, 4, 5, 6]
}
req = urllib2.Request('http://example.com/api/posts/create')
req.add_header('Content-Type', 'application/json')
response = urllib2.urlopen(req, json.dumps(data))
https://stackoverflow.com/questions/9746303/how-do-i-send-a-post-request-as-a-json (https://stackoverflow.com/questions/9746303/how-do-i-send-a-post-request-as-a-json)
Saludos,
Ese error es por que tu no importas request, y declaras un string con nombre request, y luego llamas al método post de request, y request no es tu objeto request es un string.
Al igual que esa concatenación de password que haces y nunca declaraste password como nada..
Creo que ahí querías concatenera 'email' y de todas formas falta el @
Me voy a descansar.
https://requests.readthedocs.io/en/master/user/quickstart/ (https://requests.readthedocs.io/en/master/user/quickstart/)
Saludos,
Es requests con s te lo dije mal, si mira el link.
Fijate si no tenes que instalar algo.
Saludos,
@xne7esx (https://underc0de.org/foro/index.php?action=profile;u=97437)No tienes permitido ver enlaces.
Registrate o Entra a tu cuenta
Es requests con s te lo dije mal, si mira el link.
Fijate si no tenes que instalar algo.
Saludos,
Exacto, lo que se refiere "Solid Water", es la librería "requests", que puede instalar de la siguiente forma:
Python 2:
python -m pip install requests
Python 3:
python3 -m pip install requests
¿Cómo se usa?
De la siguiente forma:
# -*- coding: UTF-8 -*-
# Notas:
# Elimine, muchas cosas; cómo la librería json, no está usandola, igualmente que otras librerias.
# Sí va quiere descodificar
# Coloque la codificación UTF-8 en la primera linea, si es que va a ejecutar el script en Python 2
import requests # La libreria 3:-)
arg = open('email.json', 'r')
url = 'https://onereg-email-suggest.gmx.com/email-alias/availability'
for line in arg:
email = line.strip()
http = requests.get( url, data={'nld{}@gmx.com'.format(email)} ) # Sí va a enviar una petición por el metodo "GET",
# pero en caso de qué no, sólo cambie "get" por "post".
# Ejemplo:
# >>> requests.post(...)
content = http.text # Lo cambio a text para evitar una incompatibilidad con Python ( 3 )
if "This choice of email address has already been assigned" in content:
print("Not available")
break
else:
print("Available")
Pude notar, que sea cual sea el método que se utilice, siempre va a dar el código de estado "403".
~ DtxdF
@xne7esx (https://underc0de.org/foro/index.php?action=profile;u=97437)
Ok. Disculpe, me falto una cosa.
Vamos por partes.
Primero me falto incluir el método ".encode( )" en el envío de los datos. Aquí está el código modificado:
# Notas:
# Elimine, muchas cosas; cómo la librería json, no está usandola, igualmente que otras librerias.
import requests # La libreria 3:-)
arg = open("email.json", "r")
url = 'https://onereg-email-suggest.gmx.com/email-alias/availability'
for line in arg:
email = line.strip()
http = requests.get( url, data={('nld{}@gmx.com'.format(email)).encode()}) # Sí va a enviar una petición por el metodo "GET",
# pero en caso de qué no, sólo cambie "get" por "post".
# Ejemplo:
# >>> requests.post(...)
content = http.text
if "This choice of email address has already been assigned" in content:
print("Not available")
break
else:
print("Available")
La salida sería:
python3 test.py
Available
PD: Ahora sólo funciona para Python 3, Python 2 me está generando un error con el paquete «pyssl»
Segundo, ésta es la forma en que se instala "Pip":
Espero esté usando un sistema operativo *nix, porque lo haré desde uno:
sudo apt-get install python3-pip
Eso instalaría "Pip" para Python 3 usando "apt-get" (El gestor de paquetes).
También puede optar por hacerlo con el mismo Python, pero esta vez descargaremos una utilidad llamada "get-pip". Puede encontrarla, así como su forma de instalación en: github.com/pypa/get-pip
Actualizado:
OJO: Quiero aclarar (cómo desde un principio), que el código de estado es "403" (No tiene permiso para ingresar a este recurso) y el contenido del cuerpo está vacio. Por lo tanto siempre le dira "Available" ¿Por qué?, porque en el mensaje que usted coloca «This choice of email address has already been assigned» contiene espacios y al compararlo con una cadena vacia, siempre le dará «False». Creo que esa API (Sí es que es una), no está en función; es mejor que usé expresiones regulares siguiendo el estándar para las direcciones de correos electrónicos.
~ DtxdF
@xne7esk
Bueno, no he visto si es o no una API, sí me dice donde se entero de su existencia, mejor, ya que mayormente esas APIs tienen documentación.
Respecto al código, funciona perfecto, a lo que me refiero que no está del todo bien, es la respuesta que le dá el servidor. Ejecute este código, verá que ahora se muestra tal cual la respuesta y el código de estado:
# Notas:
# Elimine, muchas cosas; cómo la librería json, no está usandola, igualmente que otras librerias.
import requests # La libreria 3:-)
arg = open("email.json", "r")
url = 'https://onereg-email-suggest.gmx.com/email-alias/availability'
for line in arg:
email = line.strip()
http = requests.get( url, data={('nld{}@gmx.com'.format(email)).encode()}) # Sí va a enviar una petición por el metodo "GET",
# pero en caso de qué no, sólo cambie "get" por "post".
# Ejemplo:
# >>> requests.post(...)
content = http.text
print("Respuesta: {}".format(repr(content)))
print("Código de Estado: {}".format(http.status_code))
if "This choice of email address has already been assigned" in content:
print("Not available")
break
else:
print("Available")
CitarA que te refieres aqui? cambiar el codigo para poder introducir los datos de otra forma? y como se podria hacer eso?
Me refiero a que siga el estándar o las reglas para describir un correo electrónico válido. Cómo pueden ser:
- La parte local no puede exceder los 64 caracteres.
- La parte del dominio no puede ser más de 255 caracteres.
- Caracteres cómo: letras acentuadas, caracteres de control (CTRL + tecla del teclado), los signos especiales como ()<>@,;:"[]ç%& y los espacios
A lo que me refiero con la parte local es antes del arroba (@) y la parte del dominio después de éste; sumando todo, le dá una longitud de 319 + el arroba 320.
Puede ver mucha más información en los "RFC".
PD: Algunos servicios no siguen del todo estos estandares.
Siguiendo todo lo dicho anteriormente, puede verificarlo con expresiones regulares; en python se utiliza la librería "re".
Ejemplo:
import re
import sys
regex = "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
argv = sys.argv[1:]
if (len(argv) >= 1):
if (re.match(regex, argv[0])):
print("¡Válido!")
sys.exit(0)
else:
print("Inválido ...")
sys.exit(1)
else:
print("Sintaxis: {} <Email a verificar>".format(sys.argv[0]))
sys.exit(1)
El pedazo de código usaria expresiones regulares para verificar una dirección de correo electrónico siguiendo los estandares, pero cómo le dije antes, hay veces en que los servicios se salen un poco de lo correcto; cómo gmx que exigé 3 caracteres minimos para parte local.
Así es cómo sería el código para verificar lo que usted desea:
import re
import sys
regex = "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
argv = sys.argv[1:]
if (len(argv) >= 1):
if (re.match(regex, argv[0])):
if (len(argv[0].split("@")[0]) >= 3):
print("¡Válido!")
sys.exit(0)
else:
print("No es válido para GMX ...")
else:
print("Inválido ...")
sys.exit(1)
else:
print("Sintaxis: {} <Email a verificar>".format(sys.argv[0]))
sys.exit(1)
Espero le sirva ;) ...
~ DtxdF
Pues si que ha sido de gran ayuda DtxdF.
No estoy en linux por lo que no puedo probarlo aunque me gustaría.
Solo agregar que prueben el método POST, ya que la web probablemente este en php y este toma el post y el get con distintas variables, no así como perl, que con las bibliotecas comunes le es indistinto.
Saludos,
CaraCOLES, me falto mencionar a los métodos.
Lo probé siguiendo los dos métodos, dá el mismo resultado "403" cómo estado y el cuerpo vacio :/
~ DtxdF
Al parecer es por el Access-Control-Allow-Origin: https://signup.gmx.com
me está tirando 401 desde C#.
Solid Water, ¿Le está pidiendo credenciales?, traté de hacerlo desde el navegador con los mismos valores en los encabezados que usó en C#, porque 401 es que requiere autenticación.
PD: Sí puede, deje el código
~ DtxdF
@xne7esx (https://underc0de.org/foro/index.php?action=profile;u=97437)CitarAhora entiendo, entonces esto ocurre ya que el codigo no sigue las reglas estandars del servicio...
No, como le dije, el código está bien, es el servicio que no está en función; el motivo es desconocido.
CitarHe probado los otros dos codigos y me imprime: Sintaxis: {} <Email a verificar...
Use el último código del último comentario, este se adapta a GMX. Un ejemplo de su uso:
python3 <nombre del script>.py [email protected]
No es muy diferente al segundo código del último comentario, pero verifica que la parte local ( <parte local>
@gMx (https://underc0de.org/foro/index.php?action=profile;u=81271).com ), sea más de tres caracteres y además verifica que sea una dirección de correo electrónico que se acerque al estándar.
Ha sido un placer ayudarle.
~ DtxdF
Hola
@xne7esx (https://underc0de.org/foro/index.php?action=profile;u=97437).
La verdad, vi cuando usted publico el último mensaje a los segundos y sin dudarlo fui a responder, escribiendo, pare y me pregunte: "¿El servicio no usa una API?", lo digo porque el que válida la existencia de una dirección en tiempo real debe estar implicado "WebSockets" o "Ajax".
Pues sí, así es, utiliza Ajax para hacerlo y de hecho, la dirección URL es la misma que usted puso al principio "https://onereg-email-suggest.gmx.com/email-alias/availability".
Lo busqué depurando un poco, pero tuve algunos problemas y aquí mis conjeturas.
Al depurar observe que la página está diseñada para hacer una petición Ajax a la dirección anteriormente mostrada, posteriormente la API se comportaria según los datos enviados. Los que yo envié en esa sesión son:
Encabezados:
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:71.0) Gecko/20100101 Firefox/71.0',
'Accept':'application/json, text/plain, */*',
'Accept-Language':'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
'Authorization':'Bearer qXeyJhbGciOiJIUzI1NiJ9.eyJjdCI6Ikd2VWgyMVh2NEZEdmY2dnZhNWpLM09scnlpd2dNa01FaXZoWmRuNkduXy0xeGpiaUlEb1k0eXI1VE1DYjBfQTdMYy1rQ2xqZnYxR1lsQ20wc3ZWN0FIRXNOUFVZbEdnekw1ZEREYlpHSlRqSTlhZUxuZXZpVUwtaXc1QVpZZ0NkSGlwckphcDRpOXlSUnFtYU1GWVhvVkozdG01M0Y0aE5JVVF3bV9ZWnJaMCIsInNjb3BlIjoicmVnaXN0cmF0aW9uIiwia2lkIjoiNWFmZjhlMTciLCJleHAiOjE1NzYyOTQ5OTQyNDgsIml2IjoicWdXOVBjekM1eThKWW0tU2dURGs0ZyIsImlhdCI6MTU3NjI4Nzc5NDI0OCwidmVyc2lvbiI6Mn0.L7UNHdDSelRBclCp8FPqJd3kPadDA4K5C2uoGe9b-c4',
'X-UI-APP':'@umreg/registration-app2/5.9.1',
'X-CCGUID':'56c2cfb3-789d-4a38-afc2-0e49ffe318d6',
'X-REQUEST-ID':'1e58a517-37e6-4e6f-961b-fa1f8aa2e9e4',
'Content-Type':'application/json',
'Origin':'https://signup.gmx.com',
'Connection':'keep-alive',
'Referer':'https://signup.gmx.com/',
}
Datos por el método POST:
data = {
"emailAddress":"[email protected]",
"countryCode":"US",
"suggestionProducts":["gmxcomFree"],
"maxResultCountPerProduct":"10",
"mdhMaxResultCount":"5",
"requestedEmailAddressProduct":"gmxcomFree"
}
Mientras que en CURL sería un poco diferente:
curl 'https://onereg-email-suggest.gmx.com/email-alias/availability' -H 'User-Agent: Mozilla/5.0 (X11; Linux i686; rv:71.0) Gecko/20100101 Firefox/71.0' -H 'Accept: application/json, text/plain, */*' -H 'Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3' --compressed -H 'Authorization: Bearer qXeyJhbGciOiJIUzI1NiJ9.eyJjdCI6Ikd2VWgyMVh2NEZEdmY2dnZhNWpLM09scnlpd2dNa01FaXZoWmRuNkduXy0xeGpiaUlEb1k0eXI1VE1DYjBfQTdMYy1rQ2xqZnYxR1lsQ20wc3ZWN0FIRXNOUFVZbEdnekw1ZEREYlpHSlRqSTlhZUxuZXZpVUwtaXc1QVpZZ0NkSGlwckphcDRpOXlSUnFtYU1GWVhvVkozdG01M0Y0aE5JVVF3bV9ZWnJaMCIsInNjb3BlIjoicmVnaXN0cmF0aW9uIiwia2lkIjoiNWFmZjhlMTciLCJleHAiOjE1NzYyOTQ5OTQyNDgsIml2IjoicWdXOVBjekM1eThKWW0tU2dURGs0ZyIsImlhdCI6MTU3NjI4Nzc5NDI0OCwidmVyc2lvbiI6Mn0.L7UNHdDSelRBclCp8FPqJd3kPadDA4K5C2uoGe9b-c4' -H 'X-UI-APP: @umreg/registration-app2/5.9.1' -H 'X-CCGUID: 56c2cfb3-789d-4a38-afc2-0e49ffe318d6' -H 'X-REQUEST-ID: 1e58a517-37e6-4e6f-961b-fa1f8aa2e9e4' -H 'Content-Type: application/json' -H 'Origin: https://signup.gmx.com' -H 'Connection: keep-alive' -H 'Referer: https://signup.gmx.com/' --data '{"emailAddress":"[email protected]","countryCode":"US","suggestionProducts":["gmxcomFree"],"maxResultCountPerProduct":"10","mdhMaxResultCount":"5","requestedEmailAddressProduct":"gmxcomFree"}'
Tuve algunos problemas no sé sí es que me bloquearon o es mis velocidades de conexión.
Alternativamente a la explicacion he creado un pequeño script en bash:
#!/usr/bin/env bash
declare -a params=($*)
declare -x email;
if [ ${#params[@]} -ne 1 ];then
echo -e "Sintaxis: ${params[0]} <Dirección de correo electrónico>"
exit 1
else
email=${params[0]}
fi
echo -e "Primera Petición:"
curl 'https://onereg-email-suggest.gmx.com/email-alias/availability' -X OPTIONS -H 'User-Agent: Mozilla/5.0 (X11; Linux i686; rv:71.0) Gecko/20100101 Firefox/71.0' -H 'Accept: */*' -H 'Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3' --compressed -H 'Access-Control-Request-Method: POST' -H 'Access-Control-Request-Headers: authorization,content-type,x-ccguid,x-request-id,x-ui-app' -H 'Referer: https://signup.gmx.com/' -H 'Origin: https://signup.gmx.com' -H 'Connection: keep-alive' -i
echo -e "Segunda Petición:"
curl 'https://onereg-email-suggest.gmx.com/email-alias/availability' -H 'User-Agent: Mozilla/5.0 (X11; Linux i686; rv:71.0) Gecko/20100101 Firefox/71.0' -H 'Accept: application/json, text/plain, */*' -H 'Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3' --compressed -H 'Authorization: Bearer qXeyJhbGciOiJIUzI1NiJ9.eyJjdCI6ImZhN0NOQlRlQkgtOWg4NmtMTndJbXB6ZXJYX0hlcElTNjJVWEVXQ1ppNjVnSDdnZ0s2YWpxdkt2dTdzVkNPbUMwc3pGRkVTVEI0Y01hNkdfYnFUekNGa2JXUFVtRjVHMGJob1ljaFhLLXl3OUZVcmVpMzFRNVlqdUgxMFlrX09KQTR4dExlQmY4R2k0TUlzMU9CRkRGckxHUlAzLVJMT2FFRVJuTjlVVG8zbyIsInNjb3BlIjoicmVnaXN0cmF0aW9uIiwia2lkIjoiNzllZjg4YTkiLCJleHAiOjE1NzY0MTUzNDY2NTYsIml2IjoiNjVCTmJlWWw1MWVhU041VEpROTdlUSIsImlhdCI6MTU3NjQwODE0NjY1NiwidmVyc2lvbiI6Mn0.CWcOW0NVyUKpJG0cM0rMjAxewJh6LatdTXo9Vj0uO7Y' -H 'X-UI-APP: @umreg/registration-app2/5.9.1' -H 'X-CCGUID: b0846f29-1527-4142-bb51-600d2864f070' -H 'X-REQUEST-ID: 40adec1b-bd05-4920-b74f-9ecf198b17f1' -H 'Content-Type: application/json' -H 'Origin: https://signup.gmx.com' -H 'Connection: keep-alive' -H 'Referer: https://signup.gmx.com/' --data '{"emailAddress":"'$email'","countryCode":"US","suggestionProducts":["gmxcomFree"],"maxResultCountPerProduct":"10","mdhMaxResultCount":"5","requestedEmailAddressProduct":"gmxcomFree"}' -i
OJO: No sé cuánto dure la funcionalidad del script, ya que hay que cambiar algunos parámetros y no he hecho muchas pruebas, cómo le dije por mis conexiones nefastas.
El modo de ejecución es el siguiente: bash <nombre del script>.sh <dirección del correo electrónico>
Ejemplo:
bash GMXXXChecker.sh [email protected]
La salida seria:
Primera Petición:
HTTP/1.1 200 OK
Date: Sun, 15 Dec 2019 11:39:34 GMT
Server: Apache
Strict-Transport-Security: max-age=31536000; includeSubDomains
Access-Control-Allow-Origin: https://signup.gmx.com
Access-Control-Allow-Credentials: true
Vary: Origin
Access-Control-Allow-Methods: HEAD, POST, GET, OPTIONS
Access-Control-Allow-Headers: authorization,content-type,x-ccguid,x-request-id,x-ui-app
Content-Length: 0
Connection: close
Segunda Petición:
HTTP/1.1 200 OK
Date: Sun, 15 Dec 2019 11:39:47 GMT
Server: Apache
Strict-Transport-Security: max-age=31536000; includeSubDomains
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://signup.gmx.com
Vary: Origin
X-UI-VERSION: 2.5.25/2.5.25
X-UI-PROVIDED-IDENTITY: [email protected]
Content-MD5: k3V8C6dWKPHVMwlgVDCKpw==
cache-control: no-cache
X-REQUEST-ID: 40adec1b-bd05-4920-b74f-9ecf198b17f1
X-Content-Type-Options: nosniff
Content-Length: 292
Connection: close
Content-Type: application/json;charset=utf-8
{"requestedEmailAddress":"[email protected]","emailAddressAvailable":false,"suggestedEmailAddresses":{"gmxcomFree":["[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]"]},"mdhSuggestions":[]}
Me preocupa el hecho de que un atacante pueda confirmar con una lista de direcciones sí existen o no en este servicio :(, pero creo que lo que hice podria cambiar al servicio (
creo); También eso solucionaria el problema de @xne7esx, pero igual no se fie del script hay que cambiar algunas cosas manualmente por cada sesión y no sé sí funcione cuando usted lo pruebe, pero yo le recomiendo que aprenda Python y Selenium.
~ DtxdF