Accesarea Gmail

In unele cazuri veti dori sa verificati cat mai repede cu putinta daca aveti emailuri necitite, folosind serviciile Gmail. In acest tutorial voi prezenta doua metode pentru a realiza acest lucru.

 
1. Folosind functiile IE
 
Pentru inceput avem nevoie de functiile IE si cele pentru managementul sirurilor de caractere.

#include <IE.au3>
#include <String.au3>
#include <Array.au3> ;doar pentru a afisa rezultatul

 
Apoi vom declara doua variabile care contin datele de conectare:

$sEmail = '[email protected]'
$sPasswd = 'parola'

Nota: modificati continutul cu date reale de conectare
 
Cream un obiect(instanta) InternetExplorer:

$oIE = _IECreate('https://mail.google.com/',0,0)

Ultimii parametri indica faptul ca nu se ataseaza unei ferestre existente si nu este o fereastra vizibila.
 
Obtinem referintele pentru form-ul de logare si pentru fiecare element necesar pentru conectare (email, parola, butonul SignIn):

$oForm = _IEFormGetObjByName($oIE,'gaia_loginform')
$oEmail = _IEFormElementGetObjByName($oForm,'Email')
$oPasswd = _IEFormElementGetObjByName($oForm,'Passwd')
$oSignIn = _IEFormElementGetObjByName($oForm,'signIn')

 
Setam datele de logare si apasam butonul pentru conectare, apoi asteptam incarcarea paginii noi:

_IEFormElementSetValue($oEmail,$sEmail)
_IEFormElementSetValue($oPasswd,$sPasswd)
_IEAction($oSignIn,'click')
_IELoadWait($oIE)

 
Obtinem sursa paginii:

$sHTML = _IEBodyReadHTML($oIE)

 
Mai ramane sa ne deconectam si sa distrugem obiectul creat:

_IENavigate($oIE,'https://mail.google.com/mail/?logout&hl=en')
_IEQuit($oIE)

 
Ajunsi in aceasta faza am terminat cu preluarea datelor, mai ramane sa gasim continutul dorit. Pentru acest lucru am creat functia GetMessages, avand ca parametru sursa paginii obtinuta anterior:

$Messages = GetMessages($sHTML)
_ArrayDisplay($Messages)

Fiind un tutorial, pentru a pastra lucrurile cat mai simple, am ales sa afisam rezultatul sub forma matriceala dar pentru a arata mai bine se poate crea o interfata grafica.
 
Functia GetMessages:

Func GetMessages($sHTML)
	Local $aMsg = _StringBetween($sHTML,'<SPAN dir=ltr>','e-mail options')
	If IsArray($aMsg) Then
		Local $Max = UBound($aMsg)
		Local $Messages[1][2]
		$Messages[0][0] = 0
		For $Index = 0 To $Max-1
			Local $Info = _StringBetween($aMsg[$Index],'<B>','</B>')
			If Not @error Then
				$Messages[0][0] += 1
				ReDim $Messages[$Messages[0][0]+1][2]
				$Messages[$Messages[0][0]][0] = $Info[0]
				$Messages[$Messages[0][0]][1] = $Info[1]
			EndIf
		Next
		Return $Messages
	EndIf
	Return False
EndFunc

In prima linie obtinem intr-un vector niste portiuni din codul sursa, specifice pentru fiecare mesaj. Daca au fost gasite astfel de portiuni atunci variabila $aMsg este cu siguranta un vector.
Variabila $Max contine numarul total de mesaje (citite si necitite).
Variabila $Messages o sa contina rezultatul functiei (este o matrice bidimensionala). Initial se creaza doar un index in matrice (inca nu stim cate mesaje sunt necitite), iar pe parcurs vom mai adauga indecsi. $Messages[0][0] este indexul la care stocam numarul de mesaje (emailuri) necitite, valoarea initiala este 0.
Apoi verificam intr-o bucla For…Next, pentru fiecare portiune de cod HTML specific unui email, daca acesta este scris cu text care are atributul bold(specific unui email necitit). Daca se gasesc asemenea texte in portiunea de cod, acestEa reprezinta numele celui care a trimis emailul si subiectul acestuia. Pentru fiecare caz favorabil, se incrementeaza numarul mesajelor necitite, se redimensioneaza matricea care contine rezultatul final si se pun datele obtinute in matrice.
In final se returneaza matricea care contine rezultatul sau valoarea booleana False in caz de eroare.
 
Daca asamblati portiunile de cod de mai sus, obtineti urmatorul script:

#include <IE.au3>
#include <String.au3>
#include <Array.au3> ;doar pentru a afisa rezultatul
 
$sEmail = '[email protected]'
$sPasswd = 'parola'
 
$oIE = _IECreate('https://mail.google.com/',0,0)
$oForm = _IEFormGetObjByName($oIE,'gaia_loginform')
$oEmail = _IEFormElementGetObjByName($oForm,'Email')
$oPasswd = _IEFormElementGetObjByName($oForm,'Passwd')
$oSignIn = _IEFormElementGetObjByName($oForm,'signIn')
_IEFormElementSetValue($oEmail,$sEmail)
_IEFormElementSetValue($oPasswd,$sPasswd)
_IEAction($oSignIn,'click')
_IELoadWait($oIE)
$sHTML = _IEBodyReadHTML($oIE)
_IENavigate($oIE,'https://mail.google.com/mail/?logout&hl=en')
_IEQuit($oIE)
 
$Messages = GetMessages($sHTML)
_ArrayDisplay($Messages)
 
Func GetMessages($sHTML)
	Local $aMsg = _StringBetween($sHTML,'<SPAN dir=ltr>','e-mail options')
	If IsArray($aMsg) Then
		Local $Max = UBound($aMsg)
		Local $Messages[1][2]
		$Messages[0][0] = 0
		For $Index = 0 To $Max-1
			Local $Info = _StringBetween($aMsg[$Index],'<B>','</B>')
			If Not @error Then
				$Messages[0][0] += 1
				ReDim $Messages[$Messages[0][0]+1][2]
				$Messages[$Messages[0][0]][0] = $Info[0]
				$Messages[$Messages[0][0]][1] = $Info[1]
			EndIf
		Next
		Return $Messages
	EndIf
	Return False
EndFunc

 
 
2. Folosind un obiect WinHTTPRequest si Gmail feed atom
 
Si in acest caz vom avea nevoie de functii pentru managementul sirurilor de caractere, deci vom avea nevoie de:

#include <String.au3>
#include <Array.au3> ;doar pentru a afisa rezultatul

 
Apoi vom declara doua variabile care contin datele de conectare:

$sEmail = '[email protected]'
$sPasswd = 'parola'

Nota: modificati continutul cu date reale de conectare
 
Cream un obiect WinHTTPRequest, initiem o cerere GET, setam credentialele si trimitem cererea. Apoi asteptam un raspuns.

$oHTTP = ObjCreate('WinHTTP.WinHTTPRequest.5.1')
With $oHTTP
	.Open('GET','https://gmail.google.com/gmail/feed/atom',False)
	.SetCredentials($sEmail,$sPasswd,0)
	.Send()
EndWith
$sXML = $oHTTP.ResponseText

 
In aceasta faza avem informatiile necesare, mai trebuie doar sa le aranjam intr-o forma utilizabila. Pentru acest lucru am scris functia GetMessages, avand ca parametru o variabila cu datele obtinute anterior. In felul urmator se apeleaza si afiseaza rezultatul functiei(sub forma matriceala):

$Messages = GetMessages($sXML)
_ArrayDisplay($Messages)

 
Functia GetMessages:

Func GetMessages($sXML)
	Local $New = _StringBetween($sXML,'<fullcount>','</fullcount>')
	If $New[0] <> 0 Then
		Local $Messages[$New[0]+1][2]
		$Messages[0][0] = $New[0]
		Local $Entry = _StringBetween($sXML,'<entry>','</entry>')
		For $Index = 0 To $New[0]-1
			Local $sName = _StringBetween($Entry[$Index],'<name>','</name>')
			Local $sTitle = _StringBetween($Entry[$Index],'<title>','</title>')
			$Messages[$Index+1][0] = $sName[0]
			$Messages[$Index+1][1] = $sTitle[0]
		Next
		Return $Messages
	EndIf
	Return False
EndFunc

In prima linie se obitne numarul de emailuri necitite. Daca acest numar este diferit de 0 se trece la procesarea acestora.
Se creaza o matrice bidimensionala care sa stocheze rezultatul functiei.
La indexul [0][0] se stocheaza numarul total de emailuri necitite.
In urmatoarea linie se obtine un vector cu date despre fiecare email.
Apoi intr-o bucla For…Next se obtin doar datele care ne intereseaza(numele si subiectul mesajului) si se stocheaza in matricea cu rezultatele finale.
La iesirea din bucla functia returneaza matricea cu emailuri necitite sau in caz de eroare se returneaza valoarea booleana False
 
Daca asamblati portiunile de cod scrise anterior, obtineti urmatorul script:

#include <String.au3>
#include <Array.au3>
 
$sEmail = '[email protected]'
$sPasswd = 'parola'
 
$oHTTP = ObjCreate('WinHTTP.WinHTTPRequest.5.1')
With $oHTTP
	.Open('GET','https://gmail.google.com/gmail/feed/atom',False)
	.SetCredentials($sEmail,$sPasswd,0)
	.Send()
EndWith
$sXML = $oHTTP.ResponseText
 
$Messages = GetMessages($sXML)
_ArrayDisplay($Messages)
 
 
Func GetMessages($sXML)
	Local $New = _StringBetween($sXML,'<fullcount>','</fullcount>')
	If $New[0] <> 0 Then
		Local $Messages[$New[0]+1][2]
		$Messages[0][0] = $New[0]
		Local $Entry = _StringBetween($sXML,'<entry>','</entry>')
		For $Index = 0 To $New[0]-1
			Local $sName = _StringBetween($Entry[$Index],'<name>','</name>')
			Local $sTitle = _StringBetween($Entry[$Index],'<title>','</title>')
			$Messages[$Index+1][0] = $sName[0]
			$Messages[$Index+1][1] = $sTitle[0]
		Next
		Return $Messages
	EndIf
	Return False
EndFunc

* Pentru orice intrebari sau nelamuriri legate de curs sau limbajul AutoIt accesati sectiunea AutoIt a forumului SkullBox sau platforma de suport tehnic NetHelp.