[ wex-alpha @ 20.05.2011. 20:44 ] @
Iz hobija sam pokusao napraviti aplikaciju preko koje se moze logovati na Facebook. Nisam htio da koristim nijedan API, zbog nekoliko razloga. Sa API-jem je vec gotovo sve odradjeno, a i mora se uzeti onaj developer key... mrzilo me da citam sta je potrebno da se dobije. Dakle, app je trebao imati sljedece stvari:
- Da je wpf
- Da se ne koristi nijedan API
- Da izvuce sve frendove i njihove:
*slike
*albume
- Da se moze spamati :D

Aplikacija je gotova sa nekoliko bugova, ali bitno je da radi. Necu stavljati source, ali cu staviti smjernice i ukazati na probleme na koje sam nailazio, pa ako neko zeli napraviti nadam se da ce mu biti lakse nego meni.

Kao prvo krenuo sam na sljedeci nacin, sve rucno:

Code (csharp):

HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create("https://login.facebook.com/log...2F%2Fm.facebook.com%2Fhome.php");
///jos koda

 

Uspjesno sam se logovao, ali fb trazi da identifikujem novi PC sa kojeg sam se logovao. Dakle jos mnogo posla. Svaki zahtjev se mora rucno obradjivati. Na kraju sam se odlucio za webbrowser kontrolu. Cisto da ne moram paziti na cookies, i pracenje requestova.

Dakle ovo:
Code (csharp):


            webBrowser1.Navigate(new Uri("http://www.facebook.com/"));

            mshtml.HTMLDocument fb1 = ((mshtml.HTMLDocument)this.webBrowser1.Document);

 


Ali problemima tu nije kraj. Buduci da sada simuliram click, FB krije id login dugmeta. Dinamicki ga mijenja svaki put, ali evo lijeka i za to:

Code (csharp):


           
            string[] rijeci= fb1.body.innerHTML.ToString().Split('<'); //sve strpaj u array
             string [] rrrr = rijeci[38].Split(' '); // uzmi 38 element arraya te ga razbi po space
             string falakurcu = rrrr[1].Replace("id=", ""); // 1 element koji sadrzi submit, ukni mu id= da bi dosli da naseg ID-a :)

/*
TO DO: Izbaciti parsiranje po elementu [38], vec koristiti parsiranje po kljucnoj rijeci.
Mor TO DO: Napraviti listu kljucnih rijeci putem kojih se vrsi parsiranje

*/

 


i nakon toga:

Code (csharp):


((mshtml.IHTMLElement)fb1.all.item("email")).setAttribute("value", "korisnickoime");
            ((mshtml.IHTMLElement)fb1.all.item("pass")).setAttribute("value", "password");

//persist u html-u se moze aktivirati na click, ako ne zelimo biti logovani svaki put
                                        ((mshtml.HTMLInputElement)doc.all.item(falakurcu)).click();
           
 


Sad smo napokon logovani. Dodouse FB trazi identifikaciju, tj. potvrdu novog PC-a, ali se to moze detektovati parsiranjem, fb1.
Na srecu, fb uvijek koristi iste tagove pa se moze analiziranjem fb1 utvrditi sta hoce fb.
Ima i slucaj kada fb trazi da se verifikuje email za nalog koji koristite, ali i to je lagano za detektovati.

I na kraju, necu dati sourse gotove aplikacije, ali ako neko zeli mogu mu pomoci :)

PS
Spamanje necijeg zida, se lagano rijesava... fb ima onu opciju da se blokira nezeljeni korisnik. :)

PSS
web kontrola vam jedino sluzi kao sredstvo komunikacije sa fb... uposte ne mora biti vidljiva na ekranu.









[ Shadowed @ 20.05.2011. 21:18 ] @
Cek, kakvo identifikovanje novog pc-a? Nije bas da koristim FB.. Ali zar, kada standardno koristis FB, nije samo da upises mail i password i ulogovan si?
[ wex-alpha @ 20.05.2011. 21:55 ] @
Security feature. Ako se logujes sa druge masine, fb ti trazi potvrdu da si to zaista ti...
[ Shadowed @ 20.05.2011. 22:54 ] @
Kako oni znaju da sam sa druge masine? :)
Moracu jednom bas da probam to ali mi prilicno cudno.
[ wex-alpha @ 21.05.2011. 17:21 ] @
Znaju.
Nije u pitanju masina, mislim da je vise browser u pitanju.

Trazi da nazoves novu masinu sa koje si se logovao, i onda ti fb zalje upozorenje na postavljeni mail.

Kada sam pokusavao na prvi nacin sa httpwebrequest klasom, i potipisivanjem browsera:
Code (csharp):

WebReq.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)";


 

fb je svaki put trazio da potvrdim novi PC :)