Приват24 mobile edition :)
От: Gosha Украина  
Дата: 22.06.06 17:57
Оценка:
Всем привет!

Вступление:
В связи с покупкой нового телефона с бАААльшущим экраном
захотелось пользоваться всеми благАми современной мобильной связи.
Среди прочего, захотелось смотреть выписки и движение средств по
банковскому счету. У банка, где мы обслуживаемся (Приватбанк, Украина)
есть для этого специальная онлайн служба, называется Приват24.
Т.к. оригинальную версию качать долго/дорого и смотреть/работать
с ней неудобно (на телефоне) — решил написать небольшой "переходник".
Банк довольно популярный (не сочтите за рекламу) клиентов куча,
а получилось ну ОЧЕНЬ симпатично и удобно — решил выложить. Может
кому-нибудь из коллег подобный "прогиб" перед шефом/бухгалтером будет
засчитан и выплачен/вылит в виде бонуса — буду рад за вас.
А может вы сам себе шеф и бухгалтер, тогда тем более полезная вещь.
Короче.

Что нужно чтоб заработало:
1) телефон, который умеет ходить в Интернет.
2) браузер на нем (у меня Opera Mini)
3) хост, на котором будет лежать скрипт

Как работает:
Работает просто — в браузере телефона запрашивается урл вида:
http://host.com/script.php?u=<privat24 login>&p=<privat24 password>
Сразу соглашусь, передавать в урле такие данные — ужОс . Но меня в еще
больших ужас повергает процедура вбивания в форму (для POST-a) данных
для авторизации. Привыкнув работать всеми десятью пальцами, лично я,
к телефонным клавишам испытываю стойкую неприязнь. Поэтому мне в урле
проще (тем более проверяю кроме своего еще и аккаунт начальника, а это
всего навсего еще одна закладка, только с другими аргументами).
А про безопасность я помню .
Тем более этот пароль только для просмотра, для трансфера другой нужен
+ ключи. Но это детали. Хотите — прямо в скрипте логин/пароль пропишите,
хотите — прочитайте откуда-нибудь... изменить эту часть не сложно.
Можно через HTTPS. Но набивать каждый раз пальцами — пожалейте людей .
Но я отвлекся.
После выполнения запроса показывает текущее состояние по всем счетам
предприятия + формочка для запроса движения по счету. Писалось с расчетом
на то, чтобы как можно меньше набирать текста. В идеале, при запросе
движения за текущий/вчерашний день все обходиться только манипуляциями
с джойстиком. Максимум что придется вводить — дату на которую хотите
получить движение. Но и тут я в соответствующее поле ввел текущую, чтоб
не с нуля набирать.

По понятным причинам проверить мог только на себе и начальнике.
Но если вы ЧП или юр. лицо — заработает. Да, еще одно: иногда
(на очень короткие промежутки времени) их служба "замирает",
т.е. отказывается пускать к себе кого-либо. Ну... тут уж ничего
не поделать — скрипт тоже обломится. К их чести, случается это
довольно редко.

Жалко не могу скриншот снять с телефона... красотень .
Трафа — на копейки, 4-6 Кб на сеанс, в зависимости от движения.

Вот скрипт:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body><center>
<? if ((!isset($u)) || (!isset($p)))
    die('Требуется URL вида:<br>' .
    'script.php?u=&lt;privat24 login&gt;&amp;p=&lt;privat24 password&gt;');
?>
<table border="1">
<?
/*       ВЫПИСКИ ЗА СЕГОДНЯ       */
$ch = curl_init('https://privat24.pbank.com.ua/p24/c2brest');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$u:$p");
$page = mb_convert_encoding(curl_exec($ch), 'windows-1251', 'UTF-8');
curl_close($ch);
preg_match_all('/(<tr[^>]+?>.+?<\/tr>)/si', $page, $result, PREG_PATTERN_ORDER);
echo '<tr><th colspan="8" bgcolor="darkblue">' .
     '<font color="white">Выписки (' . $u . ')</font></th></tr>';
$tmp = "";
for ($i = 0; $i < count($result[0]); $i++)
    if (!preg_match('/class="list3"/si', $result[0][$i])) 
        $tmp .= preg_replace(
            array(  '/<tr[^>]+?style(?!([^>]+?background-color))[^>]+?>/',
                    '/<tr[^>]+?>/',
                    '/<tr([^>]*?)>(?!<th)/',
                    '/<td>([\\d\\.]+)<\/td><td>([\\d\\.]+)<\/td><td>([\\d\\.]+)<\/td><\/tr>/',
                    '/<a[^>]+?>(\\d+)<\/a>/'),
            array(  '<tr>',
                    '<tr bgcolor="lavender">',
                    '<tr$1 align="center">',
                    '<td><font color="red">$1</font></td><td><font color="blue">$2</font></td><td><b>$3</b></td></tr>',
                    '<b>$1</b>'),
            $result[0][$i]);
echo $tmp;
?>
</table>
<? if (isset($accN) && isset($accD) && isset($editDate)) : ?>
<table border="1">
<tr><th colspan="3" bgcolor="darkblue"><font color="white">
    Движение средств по счету <? echo $accN; ?> за <? echo ($accD == 'fromEdit') ? $editDate : $accD; ?>
</font></th></tr>
<?
/*       ДВИЖЕНИЕ ПО СЧЕТУ (РЕЗУЛЬТАТ ЗАПРООСА)       */
if ($accD == 'fromEdit') 
    $accD = $editDate;
$ch = curl_init("https://client-bank.privatbank.ua/p24/c2bstatements?stdate=$accD&endate=$accD&acc=$accN");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$u:$p");
$page = mb_convert_encoding(curl_exec($ch), 'windows-1251', 'UTF-8');
curl_close($ch);
if(!preg_match_all('/<form[^>]+?onsubmit(?=([^>]+?return show_nbupay))[^>]+?>.+?<\/form>/si', $page, $result, PREG_PATTERN_ORDER))
    echo '<tr><td colspan="3">не было движения по счету</td></tr>';
$attrArr = array('DOC_AMT', 'A_NAM', 'B_NAM', 'DETAILS');
for ($i = 0; $i < count($result[0]); $i++)
{
    $useA = true;
    $isAmt = false;
    $doBold = false;
    echo '<tr align="center"' . ((!($i % 2)) ? ' bgcolor="lavender">' : '>');
    foreach ($attrArr as $attr)
    {
        preg_match('/<input[^>]+?name="' . $attr . 
            '"[^>]value="([^"]+?)">/si', $result[0][$i], $regs);
        $isAmt = ($attr == 'DOC_AMT');
        if ($isAmt)
            $useA = !($regs[1][0] == '-');
        $amtColor = (($useA) ? 'blue' : 'red');
        $doBold = (($attr == 'A_NAM') || ($attr == 'B_NAM'));
        if (($attr == 'A_NAM' && !$useA) || ($attr == 'B_NAM' && $useA))
            continue;
        echo '<td>' . 
             ($isAmt ? "<font color=\"$amtColor\">" : '') .
             ($doBold ? '<b>' : '') .
             $regs[1] . 
             ($doBold ? '</b>' : '') . 
             ($isAmt ? '</font>' : '') .
             '</td>';
    }
    echo '</tr>';
}
?>
</table>
<? endif; ?>
<table border="1">
<tr>
    <th bgcolor="darkblue"><font color="white">Запрос движения по счету</font></th>
</tr>
<form method="GET">
<input type="hidden" name="u" value="<? echo $u; ?>">
<input type="hidden" name="p" value="<? echo $p; ?>">
<?
preg_match_all('/<tr[^>]+?><td>[\\d\\.]+?<\/td><td><b>(\\d+)<\/b><\/td><td>.+?<\/td><td>(.+?)<\/td>/', $tmp, $result, PREG_SET_ORDER);
for ($i = 0; $i < count($result); $i++)
    echo '<tr><td><input' . (($i == 0) ? ' checked ' : ' ') . 
         'type="radio" name="accN" value="' . $result[$i][1] . 
         '">' . $result[$i][1] . ' (' . $result[$i][2] . ')</td></tr>';
?>
<tr><td><hr></td></tr>
<?
    $t = time() + 2*60*60; /*подстроились под временную зону, если нужно*/
    $today = gmdate('d.m.Y', $t);
    $yesterday = gmdate('d.m.Y', $t-86400);
?>
<tr><td><input checked type="radio" name="accD" 
    value="<? echo $today; ?>">сегодня (<? echo $today; ?>)</td></tr>
<tr><td><input type="radio" name="accD" 
    value="<? echo $yesterday; ?>">вчера (<? echo $yesterday; ?>)</td></tr>
<tr><td><input type="radio" name="accD" 
    value="fromEdit">на дату:
<input type="text" name="editDate" 
    value="<? echo $today; ?>"></td></tr>
<tr><td><input type="submit" value="получить"></td></tr>
</form>
</table>
</center></body>
</html>
Re: Приват24 mobile edition :)
От: Mr.Oizo Украина  
Дата: 23.06.06 09:46
Оценка:
Не работает.
Появляется форма запрос движения по счету и все
Счета и выписки не отображаются
Re[2]: Приват24 mobile edition :)
От: Gosha Украина  
Дата: 23.06.06 13:35
Оценка:
Здравствуйте, Mr.Oizo, Вы писали:

MO>Не работает.

MO>Появляется форма запрос движения по счету и все
MO>Счета и выписки не отображаются

Странно... Точно юр. лицо или ЧП? Входишь так? :

Может скрипт перенес не правильно (кодировки, переносы)?
Вот, на всякий случай в архивчике тот, с которым
я работаю: http://rsdn.ru/File/2894/p24.zip

Сегодня несколько раз запускал, да и только что
проверил — все ОК.
Re[2]: Приват24 mobile edition :)
От: Gosha Украина  
Дата: 23.06.06 14:02
Оценка:
Здравствуйте, Mr.Oizo, Вы писали:

И еще одно. Может ты неправильно авторизовался?
Тогда да — покажет только форму запроса, потому как
остальное не получит от приватовского сервака.
Либо логин/пароль неправильный, либо в урле их
неправильно указал:
http://host.com/script.php?u=<privat24 login>&p=<privat24 password>

может ты угловые скобки поставил? Не нужно.
т.е. должно быть так:
http://host.com/script.php?u=login&p=password
Re[3]: Приват24 mobile edition :)
От: Mr.Oizo Украина  
Дата: 26.06.06 08:58
Оценка:
Здравствуйте, Gosha, Вы писали:

G>Здравствуйте, Mr.Oizo, Вы писали:


G>И еще одно. Может ты неправильно авторизовался?

G>Тогда да — покажет только форму запроса, потому как
G>остальное не получит от приватовского сервака.
G>Либо логин/пароль неправильный, либо в урле их
G>неправильно указал:
G>
G>http://host.com/script.php?u=<privat24 login>&p=<privat24 password>
G>

G>может ты угловые скобки поставил? Не нужно.
G>т.е. должно быть так:
G>
G>http://host.com/script.php?u=login&p=password
G>


Все вроде правильно сделал, но данных не возвращает возвращает.

https://privat24.pbank.com.ua/p24/login
Re[3]: Приват24 mobile edition :)
От: Mr.Oizo Украина  
Дата: 26.06.06 09:01
Оценка:
Здравствуйте, Gosha, Вы писали:

G>Здравствуйте, Mr.Oizo, Вы писали:


G>И еще одно. Может ты неправильно авторизовался?

G>Тогда да — покажет только форму запроса, потому как
G>остальное не получит от приватовского сервака.
G>Либо логин/пароль неправильный, либо в урле их
G>неправильно указал:
G>
G>http://host.com/script.php?u=<privat24 login>&p=<privat24 password>
G>

G>может ты угловые скобки поставил? Не нужно.
G>т.е. должно быть так:
G>
G>http://host.com/script.php?u=login&p=password
G>


вот такая картинка

, а данных
Re[4]: Приват24 mobile edition :)
От: Gosha Украина  
Дата: 26.06.06 14:24
Оценка:
Здравствуйте, Mr.Oizo, Вы писали:

MO>вот такая картинка

MO>
MO>, а данных


Обидно. Должно быть что-то вроде этого:


Получается (если ты действительно входишь как корпоративщик),
что по разному строят для разных субъектов хозяйствования.
Хоть это и маловероятно...

Уж больно информация "личная", без доступа к страницам разобраться
невозможно. Если хочешь — сохрани страницы с выписками и с движением
по счету (изменив строки/числа, но не тэги), и вышли их на мыло в
профайле. Попробую поковырять.

В принципе, я в наш, николаевский филиал отнес (мы с ними сотрудничаем
по другим делам), ребятам показал. Может это их натолкнет на мысль
сделать что-нибудь свое, для мобильных пользователей. Но это врядли
будет скоро, если вообще будет. Контора большая, инертная и все такое...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.