<?php
/*
Skrypt zawiera dwie funkcje CURL obsługujące logowanie i pobieranie listy odbiorców banku mBank
Skrypt wykorzystuje Xpath'a.
PHP 5*...

Skrypt pozwala na połączenie się z bankiem mBank i pobranie wszystkich odbiorców. Następnie 
zostaną oni zapisani we wskazanym pliku.

Zachęcam do dowolnego wykorzystania, modyfikacji i ulepszania (też chciałbym kopię ;)).
piotr eldora pl
20110402
*/



/*
Ustawienie zmiennych użytkownika, wystarczy wpisać dane i skrypt będzie po prostu działał
*/

// określnie użytkownika
$login '';
$pass  '';

// określenie położenia plików (KONIECZNA ZMIANA JEŚLI POD WINDOWS)
$path './';            // miejsce zapisu plików (cookie, plik z odbiorcami i strony w trybie debug)
$plik 'lista.csv';        // nazwa pliku eksportu
$csv "Twoja Nazwa;Nr konta;Bank;Nazwa;Adres;Kod i miasto;Tytuł;Kwota\n";    // nagłówki pliku CSV, UWAGA, zawsze zapisywane w takiej kolejności!
$debug 1;                // czy zostawić pobrane strony? (domyślne, nie)
$kodowanie 'utf-8';    // docelowe kodowanie pliku csv (iconv)

// określenie adresów stron
$u = array();
$u[] = 'https://www.mbank.com.pl/';                    // strona logowania
$u['dane_odbiorcy']    = $u[0].'defined_transfer_details.aspx';    // strona danych odbiorcy do post'u
$u['lista_odbiorcow']    = $u[0].'defined_transfers_list.aspx';        // lista odbiorców
$u['login']        = $u[0].'logon.aspx';                // login do post'u
$u['if_top']        = $u[0].'top.aspx';                // górny iframe
$u['if_down']        = $u[0].'accounts_list.aspx';            // iframe z kontami


/*
*
*  Koniec zmiennych kontrolnych
*
*/

$p_ar = array();        // array do wszystkich stron

// Funkcje skryptu
$userAgent "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
//$userAgent = $_SERVER['HTTP_USER_AGENT'];
$last_url ='';

function 
curl_get($url$ref=false) {
    global 
$userAgent$cookie$debug$last_url;
    
$last_url ='';
    
$ch curl_init();
    if (
$debug == 1) {
//    curl_setopt($ch, CURLOPT_VERBOSE, true);
    
}
    
curl_setopt($chCURLOPT_FAILONERROR,true);
    
curl_setopt($chCURLOPT_TIMEOUT30);
    
curl_setopt($chCURLOPT_RETURNTRANSFER,1);
    
curl_setopt($chCURLOPT_URL,$url);
    
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
    
curl_setopt($chCURLOPT_USERAGENT$userAgent);
    
curl_setopt($chCURLOPT_COOKIEJAR,$cookie);
    
curl_setopt($chCURLOPT_COOKIEFILE$cookie);
    
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    
curl_setopt($chCURLOPT_AUTOREFERERtrue);
    if (
$ref) {
    
curl_setopt($chCURLOPT_REFERER$ref);
    }
    
$result curl_exec ($ch);
    
$last_url curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);
    
curl_close ($ch);
    return 
$result;
}

function 
curl_post($url,$data$ref=false) {
    global 
$userAgent$cookie$debug$last_url;
    
$last_url ='';
    
$ch curl_init();
    if (
$debug == 1) {
//    curl_setopt($ch, CURLOPT_VERBOSE, true);
    
}
    
curl_setopt($chCURLOPT_FAILONERROR,true);
    
curl_setopt($chCURLOPT_TIMEOUT30);
    
curl_setopt($chCURLOPT_RETURNTRANSFER,1);
    
curl_setopt($chCURLOPT_URL,$url);
    
curl_setopt($chCURLOPT_POST1);
    
curl_setopt($chCURLOPT_POSTFIELDS$data);
    
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
    
curl_setopt($chCURLOPT_USERAGENT$userAgent);
    
curl_setopt($chCURLOPT_COOKIEJAR,$cookie);
    
curl_setopt($chCURLOPT_COOKIEFILE$cookie);
    
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    
curl_setopt($chCURLOPT_AUTOREFERERtrue);
    if (
$ref) {
    
curl_setopt($chCURLOPT_REFERER$ref);
    }
    
$result curl_exec ($ch);
    
$last_url curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);
    
curl_close ($ch);
    return 
$result;
}
// Funkcja zamieniająca array na dane POST
function ar2post ($post) {
    
$data ='';
    foreach (
$post as $z => $y) {
    
$data .= urlencode($z). '=' .urlencode($y). '&';
    }
    
$data substr($data,0,-1);
    return 
$data;
}
// Funkcja zmieniająca iso-8859-2 na $kodowanie w stronach (poprawia też inne rzeczy)
function iso2kod ($page) {
    global 
$kodowanie;
    
$page str_replace("iso-8859-2",$kodowanie,$page);
    
$page iconv ("iso-8859-2",$kodowanie,$page);
    
$page str_replace(array("\r","\n","\t"),"",$page);
    return 
$page;
}
// Funkcja pobierająca odbiorców w formacie csv do zmiennej $csv
function open_odb($nr) {
    global 
$xpath,$u,$debug,$csv,$p_ar;
    
$sub_param $xpath->evaluate('//div[@id="BaseDefinedTransfersList"]/ul/li['.$nr.']/p[@class="TransferName"]/a')->item(0)->getAttribute('onclick');
    
preg_match_all("/'([^']*)'/"$sub_param$param);
    
$post = array();
    
$post['__PARAMETERS'] = $param[1][3];
    
$post['__STATE'] = $xpath -> evaluate('//input[@name="__STATE"]')->item(0)->getAttribute('value');
    
$post['__VIEWSTATE'] = $xpath -> evaluate('//input[@name="__VIEWSTATE"]')->item(0)->getAttribute('value');

    
$p_ar[] = iso2kod(curl_post($u['dane_odbiorcy'],ar2post($post)));

    
$odb_det = new DOMDocument();
    @
$odb_det->loadHTML(end($p_ar));
//    @$odb_det -> loadHTMLFile ("page5.html");
    
$xodb = new DOMXPath($odb_det);

    
$details = array();
    foreach (
$xodb->evaluate('//div[@id="definedTransferDetalis"]//div[@class="content"]') as $node => $cont) {
    
$details[] = '"'.preg_replace(array('/[\t\n]/''/\s{2,}/'), ' ',$cont->nodeValue).'"';
    }
    
$csv .= $details[0].";".ereg_replace("[^0-9]",'',$details[3]).";".$details[4].";".$details[5].";".$details[6].";".$details[7].";".$details[8].";\"".ereg_replace("[^0-9,-]",'',$details[9])."\"\n";
    
// Trzeba wrócić na listę odbiorców
    
$post = array();
    
$post['__PARAMETERS'] = '';
    
$post['__STATE'] = $xpath -> evaluate('//input[@name="__STATE"]')->item(0)->getAttribute('value');
    
$post['__VIEWSTATE'] = $xpath -> evaluate('//input[@name="__VIEWSTATE"]')->item(0)->getAttribute('value');

    
$p_ar['lista_odb'] = iso2kod(curl_post($u['lista_odbiorcow'],ar2post($post)));
    
$doc = new DOMDocument();
    @
$doc->loadHTML($p_ar['lista_odb']);
    
$xpath = new DOMXPath($doc);

// koniec funkcji pobierania odbiorców


################################################
$cookie $path.md5(microtime());
$p_ar[] = iso2kod(curl_get($u[0]));

$doc = new DOMDocument();
@
$doc->loadHTML(end($p_ar));
//@$doc -> loadHTMLFile ("page0.html");
$xpath = new DOMXPath($doc);

$post = array();
$post['seed'] = $xpath->evaluate('//input[@id="seed"]')->item(0)->getAttribute('value');
$post['localDT'] = strftime("%e %B %Y %H:%M:%S");
$post['__PARAMETERS'] = $xpath->evaluate('//input[@id="__PARAMETERS"]')->item(0)->getAttribute('value');
$post['__STATE'] = $xpath->evaluate('//input[@id="__STATE"]')->item(0)->getAttribute('value');
$post['__VIEWSTATE'] = $xpath->evaluate('//input[@id="__VIEWSTATE"]')->item(0)->getAttribute('value');
$post['__EVENTVALIDATION'] = $xpath->evaluate('//input[@id="__EVENTVALIDATION"]')->item(0)->getAttribute('value');
$post['customer'] = $login;
$post['password'] = $pass;

// logowanie -> frames.aspx
$p_ar[] = iso2kod(curl_post($u['login'],ar2post($post)));
// top iframe
$p_ar[] = iso2kod(curl_get($u['if_top']));
// konta iframe
$p_ar[] = iso2kod(curl_get($u['if_down']));

$doc = new DOMDocument();
@
$doc->loadHTML(end($p_ar));
//@$doc -> loadHTMLFile ("page3.html");
$xpath = new DOMXPath($doc);

$sub_param $xpath -> evaluate('//a[@id="AccountsGrid_grid_ctl02_MLink_0_3_A2"]')->item(0)->getAttribute('onclick');
preg_match_all("/'([^']*)'/"$sub_param$param);
$post = array();
$post['__PARAMETERS'] = $param[1][3];
$post['__STATE'] = $xpath -> evaluate('//input[@name="__STATE"]')->item(0)->getAttribute('value');
$post['__VIEWSTATE'] = $xpath -> evaluate('//input[@name="__VIEWSTATE"]')->item(0)->getAttribute('value');

// odczytaj odbiorców
$p_ar['lista_odb'] = iso2kod(curl_post($u['lista_odbiorcow'],ar2post($post)));

$doc = new DOMDocument();
@
$doc->loadHTML(end($p_ar));
//@$doc -> loadHTMLFile ("page4.html");
$xpath = new DOMXPath($doc);

$n_odb 0;
foreach(
$xpath->evaluate('//div[@id="BaseDefinedTransfersList"]/ul/li') as $li) {
    
$n_odb++;
}

for (
$i=2;$i<=$n_odb;$i++) {
    echo 
"Pobieranie odbiorcy nr ".($i-1).".<br />\n";
    
open_odb($i);
}
$fp fopen($path.$plik'w');
fwrite($fp,$csv);
fclose($fp);

if (
$debug == 1) {
    foreach(
$p_ar as $key =>$page) {
    
$fp fopen($path.'page'.$key.'.html''w');
    
fwrite($fp,$page);
    
fclose($fp);
    }
}


unlink($cookie);
?>