Created
September 19, 2013 22:30
-
-
Save initbrain/6630761 to your computer and use it in GitHub Desktop.
Collecteur d'adresses email (très commenté)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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