Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

mBank logowanie - jak zrobic za pomoca curl'a lub czegos innego?

209 views
Skip to first unread message

Guardian

unread,
Jul 4, 2008, 3:18:13 PM7/4/08
to
Witam,
Musze napisac skrypt, ktory wyciagac bedzie co jakis czas informacje
informacje o stanie konta w mBanku.
Zaczalem od czegos takiego:

function curl_string ($url,$user_agent,$postfield=""){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt ($ch, CURLOPT_COOKIEFILE, "c:\cookie.txt");
curl_setopt ($ch, CURLOPT_COOKIEJAR, "c:\cookie.txt");
if ($postfield!="")
{
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfield);
}
$result = curl_exec ($ch);
curl_close($ch);
return $result;
}
$user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9)
Gecko/2008052906 Firefox/3.0";
$strona=curl_string("https://www.mbank.com.pl/logon.aspx",$user_agent);
//pobranie strony logowania mBanku

wyciagam wartosci zmiennych przesylanych w formularzu:
$__STATE=znajdz('id="__STATE" value="', '" />',$strona);
$seed=znajdz('id="seed" value="', '" />',$strona);
....

ustawiam zmienna $postfield
$postfield="customer=".$customer."&password=".$password."&__STATE=".$__STATE."&seed=".$seed."&__PARAMETERS=&sCounter=0&__VIEWSTATE=&customer=&__EVENTVALIDATION=".$__EVENTVALIDATION.'&localDT='.$localDT;

i razem ze wszystkimi parametrami wysylam zapytanie jeszcze raz
$strona=curl_string("https://www.mbank.com.pl/logon.aspx",$user_agent,$postfield);

Niestety otrzymuje komunikat:
Blad systemu
Alarm bezpieczenstwa!
[Zaloguj ponownie]

Jakies sugestie? Moze komus juz sie to udalo? Pomozcie zanim mnie zbanuja
;-)


keczerad

unread,
Jul 4, 2008, 3:33:30 PM7/4/08
to
Guardian pisze:

Za piwerwszym razem wejdz na strone pobierz cokie za pomocą COKIEJAR
(file: tmp0), za drugi drugim razem przedstaw COOKIEFILE jako tmp0 i
pobierz COKIEJAR tmp1 , a potem przedstawiaj COOKIEFILE jakos tmp1


PS. zawsze moze odzyskac haslo :), albo po nieudanej probie przez robota
logowac sie recznie tym skasuje nieudane logowania.


--

keczerad

http://www.e-mo.com.pl
Integracje Action,Pronox,Subiekt,NTT,osCommerce
Chcesz mieć swoją integracje ? Proszę o kontakt.

keczerad

unread,
Jul 4, 2008, 3:34:25 PM7/4/08
to
keczerad pisze:

> Za piwerwszym razem wejdz na strone pobierz cokie za pomocą COKIEJAR
> (file: tmp0), za drugi drugim razem przedstaw COOKIEFILE jako tmp0 i
> pobierz COKIEJAR tmp1 , a potem przedstawiaj COOKIEFILE jakos tmp1
>
>
> PS. zawsze moze odzyskac haslo :), albo po nieudanej probie przez robota
> logowac sie recznie tym skasuje nieudane logowania.
>

Zamin zaczniesz sie logowac postem koniecznie pobierz cookie.

Guardian

unread,
Jul 4, 2008, 4:16:54 PM7/4/08
to
Dzieki za pomoc, ale...

zmienilem funkcje w ten sposob:

function curl_string ($url,$user_agent,$postfield=""){

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_HEADER, 0);

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_setopt($ch, CURLOPT_POST, true);
//drugie wywolanie pobiera cookie1.txt, wysyla cookie0 oraz parametry
$postfield
if ($postfield!="")
{
curl_setopt ($ch, CURLOPT_COOKIEFILE, "c:\cookie0.txt");

curl_setopt($ch, CURLOPT_POSTFIELDS, $postfield);
curl_setopt ($ch, CURLOPT_COOKIEJAR, "c:\cookie1.txt");
}
else
{
//pierwsze zapytanie jest bez $postfield wiec zapisuje cookie0.txt
curl_setopt ($ch, CURLOPT_COOKIEJAR, "c:\cookie0.txt");


}
$result = curl_exec ($ch);
curl_close($ch);
return $result;
}

//chwilowo trzeciego wywolania narazie nie ma, wiec nie uzywam jeszcze
cookie1.txt

Mam nadziej, ze dobrze zrozumialem? Niestety efekt taki sam i ten bardzo
lakoniczny komunikat :-(
Co ciekawe - zalogowalem sie za pomoca strony, zeby obejrzec plik cookie,
ale zaden sie nie stworzyl (?)
Jeszcze jakas podpowiedz?

keczerad

unread,
Jul 4, 2008, 7:29:29 PM7/4/08
to
Guardian pisze:

> Mam nadziej, ze dobrze zrozumialem? Niestety efekt taki sam i ten bardzo
> lakoniczny komunikat :-(
> Co ciekawe - zalogowalem sie za pomoca strony, zeby obejrzec plik cookie,
> ale zaden sie nie stworzyl (?)
> Jeszcze jakas podpowiedz?
>

1. Wejscie na strone, pobranie ciacha:

$ch = curl_init ();

$path = $this->global_config['path_tmp'];
$file_tmp='ab_'.md5(rand());
$handle = fopen($path.$file_tmp, "w");
fclose ($handle);

curl_setopt($ch, CURLOPT_URL, 'http://xxx.pl/');
curl_setopt($ch, CURLOPT_COOKIEJAR, $file_tmp);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Agent');
$string_tmp=curl_exec ($ch);
curl_close ($ch);


2. Logowanie, aktualziacja ciacha:
$ch = curl_init ();
curl_setopt ($ch, CURLOPT_URL, "http://xxx.pl/main.php");

if(!empty($config_proxy)){

curl_setopt ($ch, CURLOPT_PROXY, $config_proxy);

}
$post_pytanie="dane do logowanie";
$file_tmp_1='ab_'.md5(rand());
$handle = fopen($path.$file_tmp_1, "w");
fclose ($handle);
//echo $path.$file_tmp;
curl_setopt($ch, CURLOPT_COOKIEFILE, $file_tmp);
curl_setopt($ch, CURLOPT_COOKIEJAR, $file_tmp_1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_pytanie);
curl_setopt ($ch, CURLOPT_USERAGENT, 'agent');
$string_tmp=curl_exec ($ch);
curl_close ($ch);

//echo $string_tmp;

3. Przegladanie za pomoca zaktualizowanego ciacha:

$ch = curl_init ();
curl_setopt ($ch, CURLOPT_URL,
"http://xxx.pl/szukaj.php?terms=$pn&stype=3");



curl_setopt($ch, CURLOPT_COOKIEFILE, $path.$file_tmp_1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'agent');
$string_tmp=curl_exec ($ch);
curl_close ($ch);

Koteczek

unread,
Jul 5, 2008, 3:43:53 AM7/5/08
to

>
> Mam nadziej, ze dobrze zrozumialem? Niestety efekt taki sam i ten
> bardzo lakoniczny komunikat :-(
> Co ciekawe - zalogowalem sie za pomoca strony, zeby obejrzec plik
> cookie, ale zaden sie nie stworzyl (?)
> Jeszcze jakas podpowiedz?


hihi jak sobie poradzisz to wyslesz kod na grupe? Moze byc bez hasel do mbanku
;)

Nie ma jakiegos API? Zeby skrypt pokazywal ostatnie 10 wplywow na rachunek
np...

Pewnie juz to ktos napisal ale czy sie podzieli? Curl nigdy nie ruszalem...

cagret

unread,
Jul 6, 2008, 6:43:23 AM7/6/08
to
> Co ciekawe - zalogowalem sie za pomoca strony, zeby obejrzec plik cookie,
> ale zaden sie nie stworzyl (?)

Używałeś Bookmarkleta do obejrzenia cookies? Ciasteczka mogą być
tworzone z opcją HttpOnly, nie są wtedy widoczne z poziomu javascript.
Użyj opcji w przeglądarce do przeglądania cookies.

> Jeszcze jakas podpowiedz?

W google znalazłem bug z CURLOPT_COOKIEJAR:
http://bugs.php.net/bug.php?id=33475
> Add 'unset($ch);' after the 'curl_close($ch);' call and it will work.

Nie miałem okazji wcześniej korzystać z CURLOPT_COOKIEFILE i
CURLOPT_COOKIEJAR, zawsze ręcznie sprawdzam jakie cookiesy serwer
wysyła ustawiając opcję CURLOPT_HEADER, dołączone zostaną nagłówki do
$result - sprawdź czy pokrywa się to z tym co jest w cookie.txt w
kolejnych requestach.

cagret.

cagret

unread,
Jul 6, 2008, 7:00:45 AM7/6/08
to
> Jeszcze jakas podpowiedz?

Zwróc uwagę na wywoływaną funkcję javascript przy submicie:
<button id="confirm"
onclick="doSubmit('logon.aspx','','POST','',null,true,false,true,'var
dt\; dt = new Date(\)\; document.MainForm.localDT.value =
dt.toLocaleString(\)\;');

Zmienia ona wartości pól w formularzu np sCounter:
if (isAction == true) theform.sCounter.value = '1';

Przetestuj też czy funkcja znajdz() poprawnie wyciąga wartości,
print_r($html), print_r($postfield).

cagret.

cagret

unread,
Jul 6, 2008, 7:19:02 AM7/6/08
to
> ustawiam zmienna $postfield
> $postfield="customer=".$customer."&password=".$password."&__STATE=".$__STATE."&seed=".$seed."&__PARAMETERS=&sCounter=0&__VIEWSTATE=&customer=&__EVENTVALIDATION=".$__EVENTVALIDATION.'&localDT='.$localDT;

Nie używasz urlencode(). Powinno być:
$postfield="customer=".urlencode($customer)."&password=".urlencode($password)...

cagret.

cagret

unread,
Jul 6, 2008, 7:33:44 AM7/6/08
to
Sorry za spam. Ostatnia podpowiedź:

Nie ustawiasz ciasteczka "wnd", którego curl Ci nie wykryje, bo jest
ustawiane z poziomu javascript na stronie. Jeżeli mają zabezpieczenia
sprawdzające czy przypadkiem logowanie nie jest wykonywane przez
jakiegoś robota, to mogą sprawdzać takie szczegóły.

> document.cookie='wnd=' +escape(window.top.name) +'; secure';

cagret.

keczerad

unread,
Jul 6, 2008, 1:25:33 PM7/6/08
to
Koteczek pisze:

> Nie ma jakiegos API? Zeby skrypt pokazywal ostatnie 10 wplywow na
> rachunek np...

3 lata temu mowili ze to nie jest priorytet i API powinno sie pojawić
pod koniec roku, ale jak widać sa inne priorytety :)

Guardian

unread,
Jul 7, 2008, 4:24:57 PM7/7/08
to
keczerad, cagret

Dzieki za wszelkie podpowiedzi. Nie mialem czasu jeszcze wszystkiego
sprawdzic, ale jak mi sie uda,
to na pewno podziele sie dobrymi wiadomosciami.

Cookie ktore pokazuje bookmarklet sa inne niz te w plikach zapisanych przez
curla.
Pojawia sie wlasnie mb-logout=1, mBank2, no i tajemnicze "wnd"
po zalogowaniu mb-logout=1, mBank1 i mBank2 maja jakas wartosc, a wnd=notset
;-)
Dziwy....

Guardian


0 new messages