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
;-)
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.
> 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.
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?
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);
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...
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.
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.
Nie używasz urlencode(). Powinno być:
$postfield="customer=".urlencode($customer)."&password=".urlencode($password)...
cagret.
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.
> 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 :)
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