Minule jsme naprogramovali bota, který se dokázal automatizovaně zaregistrovat na Facebooku. Po registraci je ale ještě potřeba potvrdit platnost uvedené e-mailové adresy. K přijmutí e-mailu žádajícího o potvrzení využijeme dočasné e-mailové schránky. Já jsem pro tento účel vybral službu TrashcanMail.com, ale podobný postup by šel aplikovat i na jiné služby poskytující dočasné e-mailové schránky. Některé z nich jsou ale už Facebookem blokovány. Dočasnou schránku jsem zvolil proto, že nás to oprošťuje od registrace e-mailu a tudíž i vypisování captchy, nebo dokonce čísla mobilního telefonu.
TrashcanMail.com navíc poskytuje RSS feed, který umožní kontrolovat, zda již e-mail dorazil, aniž bychom museli stahovat objemnou HTML stránku obsahující spousty nepotřebných informací.Vzhledem k tomu, že není zapotřebí řešit formuláře, ani nic podobného, tak namísto Mechanize použijeme Urllib2.
Nejdříve si nadefinujeme funkce, které použijeme při potvrzování emailu:
def isNewMail(address):
req = urllib2.urlopen("http://trashcanmail.com/en/mailbox/"+address+"/rss") # stáhneme RSS feed
rss = req.read() # z objektu odpovedi dostaneme XML kód
if "" in rss: # pokud kód obsahuje string ''
return rss # vrátíme XML
else:
return False
def waitForMail(address):
received = False
while not received: # dokud nám nepřišel email, pokaždé
sleep(5) # počkáme pět sekund
received = isNewMail(address) # a zkontrolujeme zda už nepřišel
return received # pak vrátíme RSS feed
Nyní tedy máme všechny potřebné funkce a můžeme začít se samotným potvrzováním emailu.
Nejdříve zavoláme funkci waitForMail, která počká než přijde email a pak vrátí RSS feed.
rss = waitForMail(address)
Poté můžeme vyhledat odkaz, na stránku s posledním emailem a stáhnout jí.
link = re.findall("\s*([^<]*)\s*", rss)[-1]
html = urllib2.urlopen(link).read()
Najdeme v ní potvrzovací odkaz na Facebook.
conLink = re.search("https:\/\/www.facebook.com\/n\/\?confirmemail\.php[^<]*", html).group()
A odkaz otevřeme, čímž potvrdíme email.
urllib2.urlopen(conLink)
Když naimportujeme nutné knihovny a dáme to dohromady s našimi funkcemi, dostaneme tento výsledný skript:
import urllib2
import re
from time import sleep
def isNewMail(address):
req = urllib2.urlopen("http://trashcanmail.com/en/mailbox/"+address+"/rss")
rss = req.read()
if "" in rss:
return rss
else:
return False
def waitForMail(address):
received = False
while not received:
sleep(5)
received = isNewMail(address)
return received
def confirmMail(address):
rss = waitForMail(address)
link = re.findall("\s*([^<]*)\s*", rss)[-1]
html = urllib2.urlopen(link).read()
conLink = re.search("https:\/\/www.facebook.com\/n\/\?confirmemail\.php[^<]*", html).group()
urllib2.urlopen(conLink)
Nyní nám stačí zavolat funkci confirmMail s emailovou adresou (bez části @trashcanmail.com) v parametru a máme plně funkční účet na Facebooku.
Někdy by bylo užitečné emaily nejen přijímat, ale také odesílat. Například, když se změní obsah webové stránky, můžeme si nechat zaslat upozornění. K tomu bude potřeba mít nainstalován smtp server. Ve většině linuxových distribucí už je předinstalován a pokud není, je jednoduché ho doinstalovat. K tomu mohu doporučit například tutoriál na rosehosting.com.
Nejdříve naimportujeme e-mail MIME knihovnu, která nám umožní vytvořit objekt e-mailu, a SMTP knihovnu, pomocí které budeme email odesílat.
from email.mime.text import MIMEText
import smtplib
Když máme importovaný MIME modul, můžeme za jeho pomoci vytvořit objekt e-mailu
msg = MIMEText('text emailu')
Poté vyplníme předmět, příjemce a odesílatele. Jako odesílatele můžeme nastavit jakýkoliv string vypadající jako emailová adresa, není tedy nutné, abychom použili naši skutečnou adresu. Hodnoty které vyplníme zde, se zobrazí příjemci v e-mailovém klientu.
msg['Subject'] = 'Predmet'
msg['From'] = 'odesilatel@nekde.tld'
msg['To'] = 'prijemce@nekde.tld'
Nyní otevřeme sezení s SMTP serverem, který běží na našem počítači.
s = smtplib.SMTP('localhost')
A zprávu odešleme. Druhým argumentem je seznam obsahující adresy všech příjemců.
s.sendmail('odesilatel@nekde.tld', ['prijemce@nekde.tld'], msg.as_string())
To je vše. Nyní už stačí jen uzavřít sezení.
s.quit()
Tím jsme odeslali e-mail na požadovanou adresu. Je ale dobré podotknout, že na počet odeslaných emailů bývá z důvodu spamu často omezení. Proto obvzlášť pokud plánujete použít k odesílání VPS, nedoporučuji odesílat příliš mnoho zpráv současně. Není žádná jasně vymezená hranice, kolik emailů odeslat, ale dokud to budete používat pouze jako upozornění, tak byste s tím neměli mít problém.
Pro dnešek je to vše, příště budeme v Mechanize používat TOR a ukážeme si další možnosti této knihovny.