Skip to content

Instantly share code, notes, and snippets.

@initbrain
Created September 19, 2013 22:30
Show Gist options
  • Save initbrain/6630761 to your computer and use it in GitHub Desktop.
Save initbrain/6630761 to your computer and use it in GitHub Desktop.
Collecteur d'adresses email (très commenté)
#!/bin/env python
# -*- coding:utf-8 -*-
# Julien Deudon (initbrain)
import os
import urllib
import re
os.system("clear") # Nettoyage de la console
# Initialisation d'une liste qu'on utilisera au fur et à mesure
# pour collecter toute les adresses email et qui sera utilisée
# en fin de script pour créer un fichier
allemailfound=[]
question="Entrez l'adresse du site web sur lequel effectuer la recherche : " # Texte qui sera utilisé pour demander la saisie utilisateur
erreur=1 # On défini erreur à 1 pour rentrer dans la boucle
# Si il y a une erreur, on redemande à l'utilisateur de saisir le site
while erreur==1:
erreur=0 # Il n'y a pas d'erreur pour l'instant
siteweb=raw_input(question) # Saisie utilisateur
# urlopen attend un http://... ou https://... donc on vérifie s'ils y sont, dans le cas contraire on les ajoute
if len(siteweb) < 11 : # minimun requis "http://a.fr" -> 11 caractères, s'ils n'y sont pas c'est qu'il manque http://
siteweb="http://"+siteweb
else: # > 11 caractères ne veux pas forcement dire présence de http:// alors verif début de chaîne
# pk ne pas l'avoir fait directement, car si l'utilisateur a saisi "toto" cela aurait causé une erreur avec siteweb[4] : index out of range
if siteweb[0]+siteweb[1]+siteweb[2]+siteweb[3]+siteweb[4]+siteweb[5]+siteweb[6] != "http://" and siteweb[0]+siteweb[1]+siteweb[2]+siteweb[3]+siteweb[4]+siteweb[5]+siteweb[6]+siteweb[7] != "https://" :
siteweb="http://"+siteweb
# L'utilisateur ne doit pas préciser une page mais rentrer simplement l'adresse du site web
# comptons le nombre de slash, si plus de 2 ... erreur, ex : http:/(1)/(2)www.google.fr/(3)index.html => erreur, http:/(1)/(2)google.fr => ok
countslash=0
for lettre in siteweb:
if lettre == "/":
countslash=countslash+1
if countslash > 2:
# Une erreur, la phrase qui demande une saisie utilisateur change :)
question="Erreur, veuillez saisir le strict minimum,\nexemple : (http://)(www.)google.fr\nles éléments entre parenthèses sont optionnel :"
erreur=1
break
# Un try pour indiquer un message d'erreur personnalisé si la connexion avec le site web n'a pas fonctionné
try:
# Établir une connexion avec le site web
page=urllib.urlopen(siteweb)
except IOError:
# Une erreur, la phrase qui demande une saisie utilisateur change :)
question="Erreur, la connexion avec le site web a échoué.\nVérifiez que vous êtes bien connecté à internet,\nque le site renseigné existe ou que vous n'avez\npas fait de faute de frappe.\nVeuillez réessayer : "
erreur=1
# Recherche d'email sur la page d'accueil du site :
strpage = page.read() # Lire le contenu de la page web
regex = "[\w\.\-]+@[\w\.\-]+\.[a-zA-Z]+" # Expression rationnelle email, ex : cool-man_84@porc2jambon_adr-bidon.fr.st
regex = re.compile(regex, re.MULTILINE) # Définition de l'expression rationnelle à utiliser et on précise qu'il faut chercher sur plusieurs lignes
resultat = regex.findall(strpage) # Mettre tout les résultats dans une liste
resultat=sorted(list(set(resultat))) # Résultats triés et sans doublon
if len(resultat) != 0: # Si il y a des résultats ...
print ('\n').join(resultat)+"\n" # ... on les affiche
# On ajoute également ces emails dans une liste qu'on utilisera en dernier pour créer un fichier
for email in resultat:
allemailfound.append(email)
else: # Autrement ...
print "Aucune adresse email trouvée sur la page d'accueil\n" # ... on le dit
# Définir nom de domaine + extension => variable sitepart
sitepart = siteweb # On récupère la saisie utilisateur traitée "http(s)://(www.)site.fr"
# Définition d'une liste indexée ...
index1 = { 'http://' : '', 'https://' : '', 'www.' : '' } # TODO voir si il faut rajouter 'www1.' etc ...
# Pour chaque clé de la liste ...
for cle in index1:
sitepart=sitepart.replace(cle, index1[cle]) # ... on la remplace par son correspondant
# On récupère "site.fr"
# Définir la partie nom de domaine + extension de l'expression rationnelle (même procédure que ci-dessus)
index2 = { '.' : '\.', '-' : '\-' }
for cle in index2:
sitepartregex = sitepart.replace(cle, index2[cle])
# On récupère "site\.fr" (un morceau de l'expression régulière)
regex = "([\w\.\-%]{2,}"+sitepartregex+")(:[0-9]{2,})?" # L'expression rationnelle => sous-domaine.nom_de_domaine.tld(:port)
regex = re.compile(regex, re.MULTILINE) # Définition de l'expression rationnelle à utiliser et on précise qu'il faut chercher sur plusieur lignes
resultat = regex.findall(strpage) # Mettre tout les résultats dans une liste
resultat = sorted(list(set(resultat))) # Résultat trié et sans doublon
# À cause de mon obstination à vouloir inclure la possibilité qu'il y ai un port de précisé,
# je me retrouve avec des tuples dans ma liste [('sous-domaine.nom_de_domaine.tld',':port'),('',''),...]
# alors je remet tout ça dans une simple liste !
sousdomaines=[]
i=0
while i < len(resultat):
sousdomaines.append(resultat[i][0]+resultat[i][1])
i=i+1
# on indique le nombre de sous-domaine trouvé et on les affiche
print str(len(sousdomaines))+" sous-domaine(s) trouvé(s) pour le site "+siteweb
print ('\n').join(sousdomaines)+"\n"
# Enfin pour chaque sous-domaine trouvé on recherche sur leur "page d'accueil" les emails
for x in sousdomaines:
print x
erreur=0
try:
# Établir une connexion avec le sous-domaine
page = urllib.urlopen("http://"+x)
except IOError:
# Si il y a une erreur de connexion, on indique que le domaine ne répond pas (timeout ou faute de liens dans le code source)
print "Erreur : le sous-domaine \'"+x+"\' ne répond pas ..."
erreur=1
# Si il n'y a pas d'erreur de connexion sur le sous-domaine on recherche les adresses email éventuellement présentes dans le code source
if erreur != 1:
strpage=page.read() # Lire le contenu de la page web
regex = "[\w\.\-]+@[\w\.\-]+\.[a-zA-Z]+" # Expression rationnelle email, ex : cool-man_84@porc2jambon_adr-bidon.fr.st
regex = re.compile(regex, re.MULTILINE) # Définition de l'expression rationnelle à utiliser et on précise qu'il faut chercher sur plusieurs lignes
resultat = regex.findall(strpage) # Mettre tout les résultats dans une liste
resultat=sorted(list(set(resultat))) # Résultat trié et sans doublon
if len(resultat) != 0: # Si il y a des résultats ...
print ('\n').join(resultat)+"\n" # ... on les affiche
# On ajoute également ces emails dans une liste qu'on utilisera en dernier pour créer un fichier
for email in resultat:
allemailfound.append(email)
else: # Autrement ...
print "Aucune adresse email trouvée\n" # ... on le dit
# Si il y a email trouvée, on écrit dans un fichier texte
if len(allemailfound) != 0:
allemailfound=sorted(list(set(allemailfound)))
fichier = open('all_email_found.txt','w')
fichier.write("Site : "+siteweb+"\n\n")
for email in allemailfound:
fichier.write(email+"\n")
fichier.close()
print str(len(allemailfound))+" adresse(s) email trouvée(s) au total !\nUn fichier all_email_adresse.txt a été créé !\n(Ces adresses y ont été stockées)"
else:
print "Aucune adresse email trouvée, donc aucun fichier créé !"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment