<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jedrzej Schmeidel (aka Yunnan) &#187; Programowanie</title>
	<atom:link href="http://www.yunnan.tk/category/pomoce/programowanie/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.yunnan.tk</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 09 Jan 2012 22:52:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>mBank skrypt v3</title>
		<link>http://www.yunnan.tk/pomoce/programowanie/mbank-skrypt-v3/</link>
		<comments>http://www.yunnan.tk/pomoce/programowanie/mbank-skrypt-v3/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 21:03:30 +0000</pubDate>
		<dc:creator>Yunnan</dc:creator>
				<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://www.yunnan.tk/?p=431</guid>
		<description><![CDATA[Po ukończeniu skryptu do wyciągu z konta mBank w wersji 3, zdecydowałem się założyć nowy wpis, żeby uporządkować sprawy. mBank auto skrypt v3.0.0 v3.0.1 v3.0.3 v3.0.4 v3.0.5 v3.0.6 v3.0.8 Główna różnica to rozdzielenie skryptu na 4 pliki: plik README z instrukcją itp plik konfiguracyjny plik z funkcjami główny plik wykonywalny Readme to każdy wie co [...]]]></description>
			<content:encoded><![CDATA[<p>Po ukończeniu skryptu do wyciągu z konta mBank w wersji 3, zdecydowałem się założyć nowy wpis, żeby uporządkować sprawy.</p>
<h2>mBank auto skrypt <del datetime="2010-03-10T21:36:44+00:00">v3.0.0</del> <span style="text-decoration: line-through;">v3.0.1 v3.0.3 v3.0.4 v3.0.5 v3.0.6</span> v3.0.8</h2>
<p>Główna różnica to rozdzielenie skryptu na 4 pliki:</p>
<ul>
<li>plik README z instrukcją itp</li>
<li>plik konfiguracyjny</li>
<li>plik z funkcjami</li>
<li>główny plik wykonywalny</li>
</ul>
<p>Readme to każdy wie co tam jest.<br />
Plik konfiguracyjny ma być o tyle korzystnym rozwiązaniem, że przy updacie pozostałych plików, plik z konfiguracją może pozostać nieruszony.<br />
Plik z funkcjami, to będzie prawdopodobnie najczęściej aktualizowany plik.<br />
Plik główny wykonywalny, łączy pozostałe pliki do kupy, oraz zawiera wygląd danych wyjściowych. To właśnie w pliku głównym należy podłączyć skrypt np do bazy danych.</p>
<p>Będę się starał żeby zarówno plik konfiguracyjny, jak i zmienne wychodzące z funkcji były zawsze takie same. Przez to przy nawet przy zintegrowaniu skryptu z czymś innym, aktualizacja powinna być bezproblemowa.</p>
<h2>Aktualne pliki skryptu</h2>
<p>Aktualizacja v3.0.3 dotyczy dwóch plików: mbank_auto_skrypt i mbank_auto_skrypt.func.<br />
Aktualizacja v3.0.4 dotyczy pliku: mbank_auto_skrypt.func.<br />
Aktualizacja v3.0.5 dotyczy pliku: mbank_auto_skrypt.func i mbank_auto_skrypt.README.<br />
Aktualizacja v3.0.6 dotyczy pliku: mbank_auto_skrypt.func i mbank_auto_skrypt.README.<br />
Aktualizacja v3.0.8 dotyczy pliku: zasadniczo wszystkich, ale teoretycznie konfig moze zostac jesli sie go odpowiednio poprawi.<br />
<a href="http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v308/mbank_auto_skrypt.README">mbank_auto_skrypt_v308/mbank_auto_skrypt.README</a><br />
<a href="http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v308/mbank_auto_skrypt.conf">mbank_auto_skrypt_v308/mbank_auto_skrypt.conf</a><br />
<a href="http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v308/mbank_auto_skrypt.func">mbank_auto_skrypt_v308/mbank_auto_skrypt.func</a><br />
<a href="http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v308/mbank_auto_skrypt">mbank_auto_skrypt_v308/mbank_auto_skrypt</a></p>
<h2>Kod źródłowy skryptu</h2>
<p>http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v308/mbank_auto_skrypt.README</p>
<pre class="code">#-#############################################
# mBank_auto_skrypt v3.0.8
# Made by Jedrzej Schmeidel (Yunnan)
# on 2009/02
# www.yunnan.tk
# yunnan@yunnan.tk
#-#############################################

#-## LICENCJA
# Creative Commons License - Attribution, Share Alike
# http://creativecommons.org/licenses/by-sa/2.5/pl/
# WOLNO: Kopiowac, rozpowszechniac, odtwarzac i wykonywac utwor.
# WOLNO: Tworzyc utwory zalezne.
# WARUNEK: Uznanie autorstwa.
# WARUNEK: Na tych samych warunkach.

#-## OPIS
# Skrypt do zautomatyzowanego uzyskiwania wyciagu
# z kont mBanku.
# Bardzo przydatny do integracji z programami ksiegowymi itp.
# Przy odpowiednich zmianach moze wysylac mejle, albo zapisywac
# transakcje w bazie danych.
# SKRYPT WYSWIETLA transakcje przychodzace i wychodzace
# SKRYPT WYSWIETLA oplatydodatkowe (prowadzenie konta, przelew, oplaty za przelewy, stale zlecenia, podatek od odsetek itp)

#-## HISTORIA
# v0.1 dziala
# v0.2 zakodowane hasla base64
#      nie daja calkowitego bezpieczenstwa !
#      zabezpieczaja jedynie przy przegladaniu kodu
# v0.3 listowanie kont
# v0.4 listowanie transakcji dla kazdego konta
# v1.0 oczyszczenie kodu, definicje
# v1.1 mozliwosc wybrania pojedynczego konta do listowania
# v1.1 uzyskiwanie numeru transakcji
# v1.2 opisy i instrukcje
# v1.3 wybor rodzaju transakcji po numerze typu, mozliwosc wielokrotnego wyboru (regexp)
# v1.4 wybor konta, mozliwosc wielokrotnego wyboru (regexp), wiecej pol transakcji
# v1.5 usuwanie wielokrotnych spacji, oczyszczanie stringow, czytelniejsze domyslne wyswietlanie
# v1.6 przechwytywanie bledow
# v1.6.1 argument read byl za maly i nie wszystkie konta sie odczytywaly
# v1.6.2 poprawki instrukcji i opisu
# v1.6.3 dodatkowe opisy transakcji
# v1.6.4 wyswietlanie w "prawdziwym" utf8
# v2.0.0 wersja dostosowana do nowego interfejsu mBanku
# UWAGA: Tylko funkcje get_konta i get_trans zostaly zmienione i tylko je nalezy zaktualizowac
# czyli jesli ktos uzywa tego skryptu jako modulu, wystarczy ze zamieni te dwie fukcje, a output
# jest identyczny (komorki sa numerowane tak samo i sposob wyswietlania jest taki sam)
# v2.0.1 drobny blad przy logowaniu (dziwna niepotrzebna komorka None=)
# v2.0.2 get_konta: zmienna nr 3 to "saldo" konta, dodano zmienna 5, czyli "dostepne srodki"
# v2.0.3 zmiana wyswietlania, obok salda dodano walute oraz w nawiasie wyswietlane sa "dostepne srodki"
# UWAGA: dostepne srodki zawieraja zablokowane srodki (wykonane ale nie zaksiegowane transakcje) oraz odnawialne kredyty
# v2.0.4 skrypt akceptuje ujemny stan konta
# v2.0.5 mBankowcy znowu cos zmieniali, musialem przepisac regexpy
# UWAGA: numeryczny kod transakcji nie jest juz podawany przez mBank, tak wiec filtrowanie po tym numerze nie dziala !
# UWAGA: tylko funkcje sz_konto, sz_trans1, sz_trans2 i sz_trans3 sie zmienily !!! wystarczy je podstawic
# v2.1.0 znowu mozna wybierac rodzaje operacji, teraz przebiega to przez system mbanku uzywajac ich trzyliterowych kodow
#        mozna wybierac dowolny okres do wyswietlenia wstecz
#        wybieranie przedzialu bedzie w nastepnej wersji <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
# v2.1.1 dodane pauzy na czekanie na odpowiedz
#        sa podejrzenia ze za szybkie zapytania do serwera byly powodem sporadycznych timeoutow
# v2.1.2 drobne poprawki, optymalizacja sleepow, chyba bylo ich za duzo <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
# v2.2.0 sciaganie calej listy transakcji, nawet jak jest na paru stronach
# v3.0.0 podzial na plik glowny, funkcje i plik konfiguracyjny
# v3.0.1 usprawnienie includowania pozostalych plikow
# v3.0.2 Pawel Maziarz - poprawka pozwalajaca uruchamianie skryptu z dowolnego katalogu
# v3.0.3 mbank znowu musial cos zmienic... poprawione <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
# v3.0.4 chyba jakas drobnostka, bo nie pamietam co poprawilem <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
# v3.0.? mbank tak szybko zmienil kod html (usuniecie informacji o transakcji),
#        a potem przywrocil spowrotem stary, ze nie zdazylem zareagowac <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
# v3.0.5 skrypt nie wyswietlal kont z cyframi w nazwie - poprawione
#        drobne oczyszczenie kodu
# v3.0.6
# v3.0.7 mbank zmienil troche nazwy w selektorze operacji, tak wiec plik konfiguracji i func sie troszke zmienil
# v3.0.8 wpisanie kodowania utf-8 do wszystkich plikow uruchamialnych, bo python zaczal narzekac
#        pewnie nie dotyczy to nikogo oprocz mnie, bo nie kazdy jedzie na debianie experimental <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> 

#-## AKTUALNE WERSJE
# zeby zachowac porzadek i wyjasnic ktore pliki nalezy zaktualizowac, zrobilem liste aktualnych wersji plikow
# posiadajac wymieniona wersje pliku, nie trzeba go aktualizowac
# mbank_auto_skrypt           v3.0.8 Nowy
# mbank_auto_skrypt.README    v3.0.8 Nowy
# mbank_auto_skrypt.conf      v3.0.8 Nowy
# mbank_auto_skrypt.func      v3.0.8 Nowy

#-## TODO
# wykrywanie kredytu gotowkowego
# wypisywanie operacji karta, ktore sa wykonane, ale jeszcze nie zaksiegowanie na koncie
# wypisywanie inwestycji
# wypisywanie lokat

#-## Instalacja i uruchomienie
# - program wymaga Python i Python-Mechanize
#   (w debianie to paczki "python" i "python-mechanize")
# - plik skryptu wgrac do dowolnego katalogu
# - z powodow bezpieczenstwa katalogowi i skryptowi nadac prawa odczytu tylko dla wlasciciela
# - podac uzytkownika i haslo do mbanku, z powodow bezpieczenstwa jest zakodowane base64
#   UWAGA: podajac prawdziwy login, nalezy podawac prawdziwe haslo !!!
#   3 bledne logowania powoduja zablokowanie dostepu do konta !!! Trzeba potem odblokowywac przez telefon <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
# - mozna ustawic zmienna "wybrane" na jedno z kont ktore ma byc monitorowane, np:
#   wybor_konto = '(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)'
#   jesli zmienna jest '(.*)', skrypt wyswietla wszystkie konta tego uzytkownika, np:
#   wybor_konto = '(.*)'
#   zwykle wyrazenie regularne
# - mozna wybrac tylko okreslone transakcje do wyswietlenia
#####
### Selektory operacji
# ALL000000 Wszystkie
# ABO000000 Uznania rachunku
# CAR000000 Obci??enia rachunku
# TRI111000 Przelewy przychodz?ce
# TRO111000 Przelewy wychodz?ce
# TUS111000 Przelewy podatkowe
# TRZ101000 Przelewy do ZUS
# LDS100000 Operacje kartowe
# CRE100000 Operacje na kredycie
# CAI100000 Wp?aty gotówkowe
# CAO100000 Wyp?aty gotówkowe
# INT000000 Kapitalizacja odsetek
# COM100000 Prowizje i op?aty
# TDI111000 Przelew z/na r-ek brokerski
#####
# - jak zakodowac haslo i uzytkownika base64 ?
#   mozna uzyc dowolnego base64 calculator z googli
#   albo ponizszej funkcji pythona
#print 'nasze_haslo'.encode('base64')

#-## Integracja i edycja
# - program zostal napisany w Linuxie, tak wiec mozna go dowolnie zintegrowac w Linuxie
# - aby uruchomic program w Windowsie potrzebny jest Python do windowsa z pakietem Mechanize
#   ODRADZAM uzywania go na Windowsie, z powodu latwego dostepu do wszystkich plikow i zapisanych w nich hasel
#   nalezy posiadac zaufany komputer, najlepiej tylko z jednym (wlasnym) kontem uzytkownika
# - funkcje podaja tablice z numerami kont oraz odpowiednio wyciag z konta
#   tablica moze byc w dowolny sposob przetworzona i wyswietlona, wyslana mejlem, lub zapisana do bazy
#   python w prosty sposob oferuje te wszystkie mozliwosci
# - skrypt mozna bez problemu uruchamiac cronem
# - pola danych sa wziete bezposrednio ze strony, tak wiec ich kolejnosc jest podobna jak na stronie
#   tabela z informacjami o koncie ma 6 pol
#   0 - zmienna POST, niezbedna do uzyskania wyciagu, raczej nieczytelna <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
#   1 - nazwa konta
#   2 - numer konta
#   3 - saldo
#   4 - waluta
#   5 - dostepne srodki
#   tabela z informacjami o transakcji ma 11 pol
#   0 - data wydania polecenia transakcji
#   1 - data wykonania polecenia transakcji
#   2 - wewnetrzny systemowy numer transakcji, transakcje numerowane kolejno
#   3 - numer oznaczajacy rodzaj transakcji (opisane ponizej) - NIEAKTUALNE ! NUMERYCZNY TYP TRANSAKCJI NIE JEST JUZ PODAWANY PRZEZ MBANK
#   4 - slownie rodzaj transakcji
#   5 - druga strona bioraca udzial w transakcji
#   6 - numer konta drugiej strony bioracej udzial w transakcji (w niektorych przypadkach pusty)
#   7 - tytul przelewu/transakcji
#   8 - kwota transakcji
#   9 - saldo po transakcji
#   10- waluta transakcji

#-## Bezpieczenstwo i gwarancje
# Uzywanie na wlasna odpowiedzialnosc !!! Uzywajac programu zgadzasz sie na to ze nie
# ponosze odpowiedzialnosci za za zadne szkody ktore moga powstac uzywajac tego skryptu.
# Gwarantuje jednak ze moj oryginalny kod nie zawiera zadnych spyware, zadnych metod
# podgladania i przechwytywania czulych danych. Mozna to oczywiscie zobaczyc przegladajac
# krociutki kod.
# Aby zwiekszyc bezpieczenstwo, niektore pola i zmienne sa zakodowane base64. To uniemozliwia
# bezposrednie odczytanie lub znalezienie hasel w pliku.
</pre>
<p>http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v308/mbank_auto_skrypt.conf</p>
<pre class="code">#!/usr/bin/python
# coding: utf-8
#-#############################################
# KONFIGURACJA
# mBank_auto_skrypt v3.0.8
#-#############################################
#user zakodowany base64
Y3VzdG9tZXI = ''
#haslo zakodowane base64
cGFzc3dvcmQ = ''
#-#############################################
# wybrane konta
# aby wyswietlic wszystkie konta (.*), aby wyswietlic wybrane (xxx|xxx) znak | to znak OR
#wybor_konto = '(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)'
wybor_konto = '(.*)'
#-#############################################
# kryteria wyswietlania operacji
# wybor_typ => rodzaje operacji opisane na koncu pliku i w readme
wybor_typ = 'ALL000000'
# wybor_period => okres - D dzien, W tydzien, M miesiac
# wybor_numer => liczba dni, miesiecy, tygodni, czyli np wybor_numer 1 i wybor_period M to jeden miesiac
wybor_period = 'W'
wybor_numer = '4'
#-#############################################
# nie zaimplementowane
#rangepanel_group=[daterange_radio, *lastdays_radio, lastlogin_radio])>
#wybor_data_od = '20091101'
#wybor_data_do = '20091203'
################
### Selektory operacji
# ALL000000 Wszystkie
# ABO000000 Uznania rachunku
# CAR000000 Obci??enia rachunku
# TRI111000 Przelewy przychodz?ce
# TRO111000 Przelewy wychodz?ce
# TUS111000 Przelewy podatkowe
# TRZ101000 Przelewy do ZUS
# LDS100000 Operacje kartowe
# CRE100000 Operacje na kredycie
# CAI100000 Wp?aty gotówkowe
# CAO100000 Wyp?aty gotówkowe
# INT000000 Kapitalizacja odsetek
# COM100000 Prowizje i op?aty
# TDI111000 Przelew z/na r-ek brokerski
###</pre>
<p>http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v308/mbank_auto_skrypt.func</p>
<pre class="code">#!/usr/bin/python
# coding: utf-8
#-#############################################
# FUNKCJE
# mBank_auto_skrypt v3.0.8
#-#############################################
def strip_space(value): 	#oczyszczanie ze spacji
    return re.sub(r'\ ', '', value)

def strip_dspace(value):	#usuwanie podwojnych niepotrzebnych spacji z tekstu
    return re.sub(r'\ [\ ]+', ' ', value)

def get_konta(br, value='(.*)'):
    #global wybor_period
    #time.sleep(1)
    response_get = br.open("https://www.mbank.com.pl/accounts_list.aspx") # otwarcie listy kont
    # response_get.seek(5000)
    strona = response_get.read().decode('iso8859-2')
    strona = re.sub(r'&lt;li>|&lt;/li>', '\n', strona)
    # magiczny regexp 2010.09, poprawiony dla kont z cyframi z nazwie rachunku
    sz_konto = re.compile('\'/account_details.aspx\',\'\',\'POST\',\'[^&lt;]+href="#">([^&lt;]+)\ ([0-9\ ]{28}[0-9]{4})&lt;/a>.*\'/account_oper_list.aspx\',\'\',\'POST\',\'([^\']+)\'[^&lt;]+href="#">([0-9-,\ ]+)\ ([A-Z]{3})&lt;/a>&lt;/p>&lt;p class="Amount">.*">([0-9-,\ ]+)\ [A-Z]{3}&lt;/span>&lt;/p>')

    r_konta = []
    for konto_temp in list(sz_konto.findall(strona)):
	konto_temp = list(konto_temp)
	# odwracanie zmiennych, zeby zachowac kolejnosc
	temp = konto_temp[2]
	konto_temp[2] = konto_temp[1]
	konto_temp[1] = konto_temp[0]
	konto_temp[0] = temp
	#
	konto_temp[2] = strip_space(konto_temp[2])
	konto_temp[3] = strip_space(konto_temp[3])
	konto_temp[5] = strip_space(konto_temp[5])
	if re.match(value, str(konto_temp[2])):
	    r_konta.append(konto_temp)
    return r_konta

def get_trans(br, value='', valuea='ALL000000'):
    global wybor_period
    #time.sleep(1)
    br.open("https://www.mbank.com.pl/accounts_list.aspx") # powrot na liste kont
    # magiczny regexp
    sz_grep = re.compile('&lt;p class="Date">&lt;(.*\n)')
    # magiczny regexp po 2009.11
    sz_trans1 = re.compile('_0_0">([0-9-]+)&lt;/span>&lt;span[^&lt;]+_0_1">([0-9-]+)&lt;/span>&lt;.*MCheckBox_[0-9]+_1_([0-9]+)" />().*href="#">([^&lt;]+)&lt;/a>&lt;span>([^&lt;]+)&lt;/span>&lt;span>([^&lt;]+)&lt;/span>&lt;span>([^&lt;]+)&lt;/span>.*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>&lt;/p>.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    sz_trans2 = re.compile('_0_0">([0-9-]+)&lt;/span>&lt;span[^&lt;]+_0_1">([0-9-]+)&lt;/span>&lt;.*MCheckBox_[0-9]+_1_([0-9]+)" />().*href="#">([^&lt;]+)&lt;/a>&lt;span>([^&lt;]+)&lt;/span>&lt;span>([^&lt;]+)&lt;/span>()&lt;/p>&lt;p.*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    sz_trans3 = re.compile('_0_0">([0-9-]+)&lt;/span>&lt;span[^&lt;]+_0_1">([0-9-]+)&lt;/span>&lt;.*MCheckBox_[0-9]+_1_([0-9]+)" />().*href="#">([^&lt;]+)&lt;/a>&lt;span>([^&lt;]+)&lt;/span>()()&lt;/p>&lt;p.*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    # magiczny regexp po 2010.12
    sz_next = re.compile('button\ id="PrevPage"\ onclick="doSubmit\(\'/account_oper_list.aspx\',\'\',\'POST\',\'(.*)\',true,false,true,null\);return false"\ class="button">Poprzednie')

    # przejscie do konta
    submit = []
    for form in br.forms():
        for forma in form.controls:
    	    submit.append((forma.name, forma.value))
    submit[0] = ('__PARAMETERS', value)
    none = None, ''
    while submit.count(none)>0:
	submit.remove(none)
    submitstr = urlencode(submit) # zbieranie danych do POST
    br.open("https://www.mbank.com.pl/account_oper_list.aspx", submitstr)

    # strona z kontem, teraz istnieje mozliwosc filtrowania operacji
    br.select_form(name="MainForm")

#    br["daterange_from_day"] = '21'
#    br["daterange_from_month"] = '11'
#    br["daterange_from_year"] = '2009'
#    br["daterange_to_day"] = '5'
#    br["daterange_to_month"] = '12'
#    br["daterange_to_year"] = '2009'

    br["lastdays_period"] = [str(wybor_period)]
    br["lastdays_days"] = str(wybor_numer)
    br["accoperlist_typefilter_group"] = [str(wybor_typ)]

    response_get = br.submit()

    # zbieranie danych do klikniecia guzika Poprzednie operacje
    strona = ''
    stronatmp = response_get.read()

    while sz_next.findall(stronatmp).__len__() == 1:
	strona = strona+stronatmp
        submit = []
        for form in br.forms():
            for forma in form.controls:
        	submit.append((forma.name, forma.value))
        trans_next = sz_next.findall(stronatmp)
        submit.pop(0) # bezpieczniejsze jest remove (('__PARAMETERS', '')) ale wtedy potrzeba try
        submit[0] = ('__PARAMETERS', trans_next) # niby trans_next[0] bedzie poprawniej, ale tak tez dziala <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
        while submit.count(none)>0:
	    submit.remove(none)
        submitstr = urlencode(submit) # zbieranie danych do POST
        submitstr = re.sub(r'\%5B|\%5D|\%27|\&#038;account[^=]+=', '', submitstr)
        response_get = br.open("https://www.mbank.com.pl/account_oper_list.aspx?",submitstr)
	stronatmp = response_get.read()
    ###
    strona = strona+stronatmp
    strona = strona.decode('iso8859-2')

#    print strona
    strona = re.sub(r'\&shy;|&lt;wbr />', '', strona)
    strona = re.sub(r'&lt;/li>|&lt;li class="alternate">|&lt;li>', '\n', strona)

#    print strona
    r_trans = []
    for trans_html in sz_grep.findall(strona):
	trans_temp = sz_trans1.findall(strip_dspace(trans_html))
	if trans_temp.__len__() == 0:
	    trans_temp = sz_trans2.findall(trans_html)
	if trans_temp.__len__() == 0:
	    trans_temp = sz_trans3.findall(trans_html)
	if trans_temp.__len__() == 1: # and re.match(valuea, str(trans_temp[0][3])):
	    trans_temp = list(trans_temp[0])
	    trans_temp[8] = strip_space(trans_temp[8])
	    trans_temp[9] = strip_space(trans_temp[9])
	    r_trans.append(trans_temp)
	#if trans_temp.__len__() == 0:
	    #print "Rodzaj nieznany"+trans_html
#    print r_trans
    return r_trans
</pre>
<p>http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v308/mbank_auto_skrypt</p>
<pre class="code">#!/usr/bin/python
# coding: utf-8
#-#############################################
# mBank_auto_skrypt v3.0.8
# Made by Jedrzej Schmeidel (Yunnan)
# on 2009/02
# www.yunnan.tk
# yunnan@yunnan.tk
#-#############################################

import os
import time
import re
import sys
from mechanize import Browser
from urllib import urlencode
#from urllib2 import Request

#-#############################################
# KONFIGURACJA i FUNKCJE
#-#############################################

execfile(os.path.dirname(sys.argv[0]) + '/mbank_auto_skrypt.conf')
execfile(os.path.dirname(sys.argv[0]) + '/mbank_auto_skrypt.func')

#-########mBank#####################################
print "===> Uruchomienie wersja mBank_auto_skrypt v3.0.3"
br = Browser()	# uruchomienie przegladarki
# ewentualny debugging
#br.set_debug_redirects(True)
#br.set_debug_responses(True)
#br.set_debug_http(True)
br.open("https://www.mbank.com.pl/")
##################
# LOGOWANIE
#time.sleep(1)
br.select_form(name="MainForm") # wypelnienie formularza
try:
    br['Y3VzdG9tZXI='.decode('base64')] = Y3VzdG9tZXI.decode('base64')
    br['cGFzc3dvcmQ='.decode('base64')] = cGFzc3dvcmQ.decode('base64')
except:
    print "===> BLAD przy odszyfrowywaniu - ", sys.exc_info()[1]
    sys.exit()
#time.sleep(1)
response_in = br.submit() # wyslanie formularza
if response_in.geturl() == "https://www.mbank.com.pl/frames.aspx":
    print "===> Zalogowano poprawnie"
else:
    print "===> BLAD przy logowywaniu"
    sys.exit()
##################
# Wyswietlanie listy kont i wyciagow
# funkcja get_konta pobiera wszystkie konta i potrzebne dane do uzyskania wyciagu z konta
# jako opcje przyjmuje numer/numery konta bez spacji ktore maja zostac wyswietlone
# funkcja get_trans pobiera transakcje w ostatnich 14 dniach (domyslnie w mbanku)
# jako opcje przyjmuje zmienna post do uzyskania wyciagu oraz rodzaj transakcji do wyswietlenia
# (wg specjalnej numeracji mbanku)
##################
##################
konta = get_konta(br, wybor_konto)
print "===> Znalezione konta:",konta.__len__()
for konto in konta:
    print ("---> "+konto[2]+"  "+(konto[3]+"("+konto[5]+")"+konto[4]).rjust(15, ' ')+"  "+konto[1]).encode("utf8")
    trans = get_trans(br, konto[0], wybor_typ)
    for transa in trans:
#        print transa
        print ("  -> "+transa[2].ljust(4, ' ')+"  "+transa[0]+"  "+transa[3]+"  "+transa[6].ljust(32,' ')+"  "+transa[8].rjust(10,' ')+"  "+transa[7]).encode("utf8")
##################
##################
# WYLOGOWANIE
response_out = br.open("https://www.mbank.com.pl/logout.aspx")
response_out.seek(2000)
if response_out.read(6000).find('Poprawne wylogowanie z cz') > 0:
    print "===> Wylogowano poprawnie"
else:
    print "===> BLAD przy wylogowywaniu"
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.yunnan.tk/pomoce/programowanie/mbank-skrypt-v3/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>mBank skrypt do zautomatyzowanego pobierania wyciagu z konta</title>
		<link>http://www.yunnan.tk/pomoce/programowanie/mbank-skrypt-do-zautomatyzowanego-pobierania-wyciagu-z-konta/</link>
		<comments>http://www.yunnan.tk/pomoce/programowanie/mbank-skrypt-do-zautomatyzowanego-pobierania-wyciagu-z-konta/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 16:04:18 +0000</pubDate>
		<dc:creator>Yunnan</dc:creator>
				<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://www.yunnan.tk/?p=227</guid>
		<description><![CDATA[-&#62; NOWA WERSJA SKRYPTU &#60;- Moze sie komus przyda skrypt do zautomatyzowanego logowania i pobierania wyciagu z konta z banku mBank. Na nieszczescie brakuje takiej funkcj w mBanku, a przysylanie mejli po dwoch dniach, ktore potem rowniez ciezko sparsowac nie rozwiazuje problemu. Logowanie, sciaganie codziennie recznie wyciagu w CSV i parsowanie go, to tez nie [...]]]></description>
			<content:encoded><![CDATA[<p><br/><br/></p>
<h1 style="text-align: center;"><a href="http://www.yunnan.tk/pomoce/programowanie/mbank-skrypt-v3/">-&gt; NOWA WERSJA SKRYPTU &lt;-<br />
</a></h1>
<p><br/><br/></p>
<p>Moze sie komus przyda skrypt do zautomatyzowanego logowania i pobierania wyciagu z konta z banku mBank. Na nieszczescie brakuje takiej funkcj w mBanku, a przysylanie mejli po dwoch dniach, ktore potem rowniez ciezko sparsowac nie rozwiazuje problemu.</p>
<p>Logowanie, sciaganie codziennie recznie wyciagu w CSV i parsowanie go, to tez nie rozwiazanie. Takwiec stwierdzilem ze napisze skrypt ktory robi to sam.</p>
<p>I tak powstal:</p>
<h2>mBank auto skrypt <span style="text-decoration: line-through;">v1.2</span> <span style="text-decoration: line-through;">v1.5</span> <span style="text-decoration: line-through;">v1.6.3 v2.0.1</span> <span style="text-decoration: line-through;">v2.0.3</span> <span style="text-decoration: line-through;">v2.0.4</span> <span style="text-decoration: line-through;">v2.0.5</span> <span style="text-decoration: line-through;">v2.1.0</span> <span style="text-decoration: line-through;">v2.2.0</span></h2>
<p>Skrypt automatycznie pobiera wyciag ze wszystkich kont bankowych zalogowanego uzytkownika. Mozna rowniez wybrac pojedyncze konto ktore ma byc monitorowane.</p>
<p>Bardzo przydatny do integracji z programami ksiegowymi itp. Przy odpowiednich zmianach moze wysylac mejle, albo zapisywac transakcje w bazie danych.</p>
<h3>Instalacja i wymagania</h3>
<p>Krotka instrukcja instalacji:</p>
<ul>
<li>plik skryptu wgrac do dowolnego katalogu</li>
<li> z powodow bezpieczenstwa katalogowi i skryptowi nadac prawa odczytu tylko dla wlasciciela</li>
<li>podac uzytkownika i haslo do mbanku, z powodow bezpieczenstwa jest zakodowane base64<br />
<span style="color: #ff0000;">UWAGA: podajac prawdziwy login, nalezy podawac prawdziwe haslo !!!<br />
3 bledne logowania powoduja zablokowanie dostepu do konta !!!<br />
Trzeba potem odblokowywac przez telefon <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </span></li>
<li>mozna ustawic zmienna &#8222;wybrane&#8221; na jedno z kont ktore ma byc monitorowane, np:<br />
wybrane = &#8216;xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx&#8217;<br />
jesli zmienna jest zostawiona pusta, skrypt wyswietla wszystkie konta tego uzytkownika, np:<br />
wybrane = &#8221;</li>
<li>jako zakodowac haslo i uzytkownika base64 ?<br />
mozna uzyc dowolnego base64 calculator z googli<br />
albo ponizszej funkcji pythona<br />
print &#8216;nasze_haslo&#8217;.encode(&#8216;base64&#8242;)</li>
</ul>
<p>Program wymaga:</p>
<ul>
<li>python</li>
<li>python-mechanize<br />
(w debianie to paczki &#8222;python&#8221; i &#8222;python-mechanize&#8221;)</li>
</ul>
<p><strong>Bezpieczenstwo i gwarancje</strong></p>
<p>Uzywanie na wlasna odpowiedzialnosc !!!<br />
Uzywajac programu zgadzasz sie na to ze nie ponosze odpowiedzialnosci za za zadne szkody ktore moga powstac uzywajac tego skryptu.</p>
<p>Gwarantuje jednak ze moj oryginalny kod nie zawiera zadnych spyware, zadnych metod podgladania i przechwytywania czulych danych. Mozna to oczywiscie zobaczyc przegladajac krociutki kod.<br />
Aby zwiekszyc bezpieczenstwo, niektore pola i zmienne sa zakodowane base64. To uniemozliwia bezposrednie odczytanie lub znalezienie hasel w pliku. Nie daje to jednak calkowitej gwarancji ze ktos po przechwyceniu zakodowanego hasla, po prostu go nie odkoduje (to nie hash jednokierunkowy, jedynie kodowanie base64).</p>
<p><strong>Historia wersji</strong></p>
<ul>
<li>v0.1 dziala</li>
<li>v0.2 zakodowane hasla base64<br />
<span style="color: #ff0000;">nie daja calkowitego bezpieczenstwa !<br />
zabezpieczaja jedynie przed podejrzeniem hasla przy przegladaniu kodu</span></li>
<li>v0.3 listowanie kont</li>
<li>v0.4 listowanie transakcji dla kazdego konta</li>
<li>v1.0 oczyszczenie kodu, definicje</li>
<li>v1.1 mozliwosc wybrania pojedynczego konta do listowania</li>
<li>v1.1 uzyskiwanie numeru transakcji</li>
<li>v1.2 opisy i instrukcje</li>
<li>v1.3 wybor rodzaju transakcji po numerze typu, mozliwosc wielokrotnego wyboru (regexp)</li>
<li>v1.4 wybor konta, mozliwosc wielokrotnego wyboru (regexp), wiecej pol transakcji</li>
<li>v1.5 usuwanie wielokrotnych spacji, oczyszczanie stringow, czytelniejsze domyslne wyswietlanie</li>
<li><strong>v2.0.1 skrypt dostosowany do nowego interfejsu mBanku !!!<br />
UWAGA: jedynie dwie glowne funkcje (get_konta i get_trans) zostaly zmienione, kolejnosc zmiennych, sposob wyswietlania jest identycznie jak bylo, co powinno ulatwic update zaimplementowanego skryptu (wystarczy podmienic te dwie fukcje ;D)</strong></li>
<li>v2.0.3 wyswietlanie &#8222;dostepnych srodkow&#8221; i waluty konta</li>
<li>v2.0.4 skrypt akceptuje ujemny stan konta</li>
<li>v2.0.5 dostosowanie do zmian w mbanku</li>
<li>v2.1.0 znowu mozna wybrac typy transakcji oraz mozna okreslic okres wyswietlania wstecz</li>
<li>v2.1.1 drobne poprawki i optymalizacje</li>
<li>v2.2.0 skrypt sciaga cala liste transakcji nawet jak jest rozbita w mbanku na pare stron</li>
</ul>
<p><span style="text-decoration: underline;">Ponizszy kod jest tylko podany informacyjnie, wyrazenia regularne nie sa za dobrze trawione przez WordPressa tak wiec najlepiej sciagnij kod w pliku powyzej.</span></p>
<p><a href="http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v205">SCIAGNIJ SKRYPT w wersji v2.0.5</a><br />
<a href="http://www.yunnan.tk/wp-content/files/skrypty/mbank_auto_skrypt_v220">SCIAGNIJ SKRYPT w najnowszej wersji</a></p>
<pre class="code">#!/usr/bin/env python
# coding: utf8
#-#############################################
# mBank_auto_skrypt v2.2.0
# Made by Jedrzej Schmeidel (Yunnan)
# on 2009/02
# www.yunnan.tk
# yunnan@yunnan.tk

#-## LICENCJA
# Creative Commons License - Attribution, Share Alike
# http://creativecommons.org/licenses/by-sa/2.5/pl/
# WOLNO: Kopiowac, rozpowszechniac, odtwarzac i wykonywac utwor.
# WOLNO: Tworzyc utwory zalezne.
# WARUNEK: Uznanie autorstwa.
# WARUNEK: Na tych samych warunkach.

#-## OPIS
# Skrypt do zautomatyzowanego uzyskiwania wyciagu
# z kont mBanku.
# Bardzo przydatny do integracji z programami ksiegowymi itp.
# Przy odpowiednich zmianach moze wysylac mejle, albo zapisywac
# transakcje w bazie danych.
# SKRYPT WYSWIETLA transakcje przychodzace i wychodzace
# SKRYPT WYSWIETLA oplatydodatkowe (prowadzenie konta, przelew, oplaty za przelewy, stale zlecenia, podatek od odsetek itp)

#-## HISTORIA
# v0.1 dziala
# v0.2 zakodowane hasla base64
#      nie daja calkowitego bezpieczenstwa !
#      zabezpieczaja jedynie przy przegladaniu kodu
# v0.3 listowanie kont
# v0.4 listowanie transakcji dla kazdego konta
# v1.0 oczyszczenie kodu, definicje
# v1.1 mozliwosc wybrania pojedynczego konta do listowania
# v1.1 uzyskiwanie numeru transakcji
# v1.2 opisy i instrukcje
# v1.3 wybor rodzaju transakcji po numerze typu, mozliwosc wielokrotnego wyboru (regexp)
# v1.4 wybor konta, mozliwosc wielokrotnego wyboru (regexp), wiecej pol transakcji
# v1.5 usuwanie wielokrotnych spacji, oczyszczanie stringow, czytelniejsze domyslne wyswietlanie
# v1.6 przechwytywanie bledow
# v1.6.1 argument read byl za maly i nie wszystkie konta sie odczytywaly
# v1.6.2 poprawki instrukcji i opisu
# v1.6.3 dodatkowe opisy transakcji
# v1.6.4 wyswietlanie w "prawdziwym" utf8
# v2.0.0 wersja dostosowana do nowego interfejsu mBanku
# UWAGA: Tylko funkcje get_konta i get_trans zostaly zmienione i tylko je nalezy zaktualizowac
# czyli jesli ktos uzywa tego skryptu jako modulu, wystarczy ze zamieni te dwie fukcje, a output
# jest identyczny (komorki sa numerowane tak samo i sposob wyswietlania jest taki sam)
# v2.0.1 drobny blad przy logowaniu (dziwna niepotrzebna komorka None=)
# v2.0.2 get_konta: zmienna nr 3 to "saldo" konta, dodano zmienna 5, czyli "dostepne srodki"
# v2.0.3 zmiana wyswietlania, obok salda dodano walute oraz w nawiasie wyswietlane sa "dostepne srodki"
# UWAGA: dostepne srodki zawieraja zablokowane srodki (wykonane ale nie zaksiegowane transakcje) oraz odnawialne kredyty
# v2.0.4 skrypt akceptuje ujemny stan konta
# v2.0.5 mBankowcy znowu cos zmieniali, musialem przepisac regexpy
# UWAGA: numeryczny kod transakcji nie jest juz podawany przez mBank, tak wiec filtrowanie po tym numerze nie dziala !
# UWAGA: tylko funkcje sz_konto, sz_trans1, sz_trans2 i sz_trans3 sie zmienily !!! wystarczy je podstawic
# v2.1.0 znowu mozna wybierac rodzaje operacji, teraz przebiega to przez system mbanku uzywajac ich trzyliterowych kodow
#        mozna wybierac dowolny okres do wyswietlenia wstecz
#        wybieranie przedzialu bedzie w nastepnej wersji <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
# v2.1.1 dodane pauzy na czekanie na odpowiedz
#        sa podejrzenia ze za szybkie zapytania do serwera byly powodem sporadycznych timeoutow
# v2.1.2 drobne poprawki, optymalizacja sleepow, chyba bylo ich za duzo <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
# v2.2.0 sciaganie calej listy transakcji, nawet jak jest na paru stronach

#-## TODO
# wykrywanie kredytu gotowkowego

#-## Instalacja i uruchomienie
# - program wymaga Python i Python-Mechanize
#   (w debianie to paczki "python" i "python-mechanize")
# - plik skryptu wgrac do dowolnego katalogu
# - z powodow bezpieczenstwa katalogowi i skryptowi nadac prawa odczytu tylko dla wlasciciela
# - podac uzytkownika i haslo do mbanku, z powodow bezpieczenstwa jest zakodowane base64
#   UWAGA: podajac prawdziwy login, nalezy podawac prawdziwe haslo !!!
#   3 bledne logowania powoduja zablokowanie dostepu do konta !!! Trzeba potem odblokowywac przez telefon <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
# - mozna ustawic zmienna "wybrane" na jedno z kont ktore ma byc monitorowane, np:
#   wybor_konto = '(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)'
#   jesli zmienna jest '(.*)', skrypt wyswietla wszystkie konta tego uzytkownika, np:
#   wybor_konto = '(.*)'
#   zwykle wyrazenie regularne
# - mozna wybrac tylko okreslone transakcje do wyswietlenia
#     ALL - Wszystkie
#     ABO - Uznania rachunku
#     CAR - Obci??enia rachunku
#     TRI - Przelewy przychodz?ce
#     TRO - Przelewy wychodz?ce
#     TUS - Przelewy podatkowe
#     TRZ - Przelewy do ZUS
#     LDS - Operacje kartowe
#     CRE - Operacje na kredycie
#     CAI - Wp?aty gotówkowe
#     CAO - Wyp?aty gotówkowe
#     INT - Kapitalizacja odsetek
#     COM - Prowizje i op?aty
# - jak zakodowac haslo i uzytkownika base64 ?
#   mozna uzyc dowolnego base64 calculator z googli
#   albo ponizszej funkcji pythona
#print 'nasze_haslo'.encode('base64')

#-## Integracja i edycja
# - program zostal napisany w Linuxie, tak wiec mozna go dowolnie zintegrowac w Linuxie
# - aby uruchomic program w Windowsie potrzebny jest Python do windowsa z pakietem Mechanize
#   ODRADZAM uzywania go na Windowsie, z powodu latwego dostepu do wszystkich plikow i zapisanych w nich hasel
#   nalezy posiadac zaufany komputer, najlepiej tylko z jednym (wlasnym) kontem uzytkownika
# - funkcje podaja tablice z numerami kont oraz odpowiednio wyciag z konta
#   tablica moze byc w dowolny sposob przetworzona i wyswietlona, wyslana mejlem, lub zapisana do bazy
#   python w prosty sposob oferuje te wszystkie mozliwosci
# - skrypt mozna bez problemu uruchamiac cronem
# - pola danych sa wziete bezposrednio ze strony, tak wiec ich kolejnosc jest podobna jak na stronie
#   tabela z informacjami o koncie ma 6 pol
#   0 - zmienna POST, niezbedna do uzyskania wyciagu, raczej nieczytelna <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
#   1 - nazwa konta
#   2 - numer konta
#   3 - saldo
#   4 - waluta
#   5 - dostepne srodki
#   tabela z informacjami o transakcji ma 11 pol
#   0 - data wydania polecenia transakcji
#   1 - data wykonania polecenia transakcji
#   2 - wewnetrzny systemowy numer transakcji, transakcje numerowane kolejno
#   3 - numer oznaczajacy rodzaj transakcji (opisane ponizej) - NIEAKTUALNE ! NUMERYCZNY TYP TRANSAKCJI NIE JEST JUZ PODAWANY PRZEZ MBANK
#   4 - slownie rodzaj transakcji
#   5 - druga strona bioraca udzial w transakcji
#   6 - numer konta drugiej strony bioracej udzial w transakcji (w niektorych przypadkach pusty)
#   7 - tytul przelewu/transakcji
#   8 - kwota transakcji
#   9 - saldo po transakcji
#   10- waluta transakcji

#-## Bezpieczenstwo i gwarancje
# Uzywanie na wlasna odpowiedzialnosc !!! Uzywajac programu zgadzasz sie na to ze nie
# ponosze odpowiedzialnosci za za zadne szkody ktore moga powstac uzywajac tego skryptu.
# Gwarantuje jednak ze moj oryginalny kod nie zawiera zadnych spyware, zadnych metod
# podgladania i przechwytywania czulych danych. Mozna to oczywiscie zobaczyc przegladajac
# krociutki kod.
# Aby zwiekszyc bezpieczenstwo, niektore pola i zmienne sa zakodowane base64. To uniemozliwia
# bezposrednie odczytanie lub znalezienie hasel w pliku.

############# KONFIGURACJA
#user zakodowany base64
Y3VzdG9tZXI = ''
#haslo zakodowane base64
cGFzc3dvcmQ = ''
#wybrane konta, aby wyswietlic wszystkie konta (.*), aby wyswietlic wybrane (xxx|xxx) znak | to znak OR
#wybor_konto = '(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)'
wybor_konto = '(.*)'
# kryteria wyswietlania operacji
# wybor_typ => rodzaje operacji opisane wyzej - ALL, ABO, CAR, TRI, TRO, TUS, TRZ, LDS, CRE, CAI, CAO, INT, COM
wybor_typ = 'ALL'
# wybor_period => okres - D dzien, W tydzien, M miesiac
# wybor_numer => liczba dni, miesiecy, tygodni, czyli np wybor_numer 1 i wybor_period M to jeden miesiac
wybor_period = 'D'
wybor_numer = '14'
#############
#rangepanel_group=[daterange_radio, *lastdays_radio, lastlogin_radio])>
#wybor_data_od = '20091101'
#wybor_data_do = '20091203'
####

import time
import re
import sys
from mechanize import Browser
from urllib import urlencode
from urllib2 import Request

#-#############################################
# Program
#-#############################################
def strip_space(value): 	#oczyszczanie ze spacji
    return re.sub(r'\ ', '', value)

def strip_dspace(value):	#usuwanie podwojnych niepotrzebnych spacji z tekstu
    return re.sub(r'\ [\ ]+', ' ', value)

def get_konta(value='(.*)'):
    time.sleep(1)
    response_get = br.open("https://www.mbank.com.pl/accounts_list.aspx") # otwarcie listy kont
    # response_get.seek(5000)
    strona = response_get.read().decode('iso8859-2')
    strona = re.sub(r'&lt;li>|&lt;/li>', '\n', strona)
    # magiczny regexp przed 2009.11
    #sz_konto = re.compile('\'account_details.aspx\',\'\',\'POST\',\'[^&lt;]+href="#">([^0-9&lt;]+)\ ([0-9\ ]+)&lt;/a>.*(bLast14=[^\']+).*\ href="#">([0-9-,\ ]+)\ ([A-Z]{3})&lt;/a>&lt;/p>&lt;p class="Amount">.*">([0-9-,\ ]+)\ [A-Z]{3}&lt;/span>&lt;/p>&lt;p class="Actions">')
    # magiczny regexp po 2009.11
    sz_konto = re.compile('\'account_details.aspx\',\'\',\'POST\',\'[^&lt;]+href="#">([^0-9&lt;]+)\ ([0-9\ ]+)&lt;/a>.*\'account_oper_list.aspx\',\'\',\'POST\',\'([^\']+)\'[^&lt;]+href="#">([0-9-,\ ]+)\ ([A-Z]{3})&lt;/a>&lt;/p>&lt;p class="Amount">.*">([0-9-,\ ]+)\ [A-Z]{3}&lt;/span>&lt;/p>&lt;p class="Actions">')

    r_konta = []
    for konto_temp in list(sz_konto.findall(strona)):
	konto_temp = list(konto_temp)
	# odwracanie zmiennych, zeby zachowac kolejnosc
	temp = konto_temp[2]
	konto_temp[2] = konto_temp[1]
	konto_temp[1] = konto_temp[0]
	konto_temp[0] = temp
	#
	konto_temp[2] = strip_space(konto_temp[2])
	konto_temp[3] = strip_space(konto_temp[3])
	konto_temp[5] = strip_space(konto_temp[5])
	if re.match(value, str(konto_temp[2])):
	    r_konta.append(konto_temp)
    return r_konta

def get_trans(value='', valuea='ALL'):
    time.sleep(1)
    br.open("https://www.mbank.com.pl/accounts_list.aspx") # powrot na liste kont
    # magiczny regexp
    sz_grep = re.compile('&lt;p class="Date">&lt;(.*\n)')
    # magiczny regexp przed 2009.11
    #sz_trans1 = re.compile('span>([0-9-]+)&lt;/span>&lt;span>([0-9-]+)&lt;/span>.*iNumber=([0-9]+).*cCodeOper=([0-9]+).*href="#">([^&lt;]+)&lt;/a>&lt;span>([^&lt;]+)&lt;/span>&lt;span>([0-9]+)&lt;/span>&lt;span>([^&lt;]+)&lt;/span>.*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>&lt;/p>.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    #sz_trans2 = re.compile('span>([0-9-]+)&lt;/span>&lt;span>([0-9-]+)&lt;/span>.*iNumber=([0-9]+).*cCodeOper=([0-9]+).*href="#">([^&lt;]+)&lt;/a>&lt;span>([^&lt;]+)&lt;/span>&lt;/p>()().*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>&lt;/p>&lt;p class="Amount">.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    #sz_trans3 = re.compile('span>([0-9-]+)&lt;/span>&lt;span>([0-9-]+)&lt;/span>.*iNumber=([0-9]+).*cCodeOper=([0-9]+).*href="#">([^&lt;]+)&lt;/a>()()().*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>&lt;/p>&lt;p.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    # magiczny regexp po 2009.11
    sz_trans1 = re.compile('_0_0">([0-9-]+)&lt;/span>&lt;span[^&lt;]+_0_1">([0-9-]+)&lt;/span>&lt;.*MCheckBox_[0-9]+_1_([0-9]+)" />().*href="#">([^&lt;]+)&lt;/a>&lt;span>([^&lt;]+)&lt;/span>&lt;span>([^&lt;]+)&lt;/span>&lt;span>([^&lt;]+)&lt;/span>.*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>&lt;/p>.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    sz_trans2 = re.compile('_0_0">([0-9-]+)&lt;/span>&lt;span[^&lt;]+_0_1">([0-9-]+)&lt;/span>&lt;.*MCheckBox_[0-9]+_1_([0-9]+)" />().*href="#">([^&lt;]+)&lt;/a>&lt;span>([^&lt;]+)&lt;/span>&lt;span>([^&lt;]+)&lt;/span>()&lt;/p>&lt;p.*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    sz_trans3 = re.compile('_0_0">([0-9-]+)&lt;/span>&lt;span[^&lt;]+_0_1">([0-9-]+)&lt;/span>&lt;.*MCheckBox_[0-9]+_1_([0-9]+)" />().*href="#">([^&lt;]+)&lt;/a>&lt;span>([^&lt;]+)&lt;/span>()()&lt;/p>&lt;p.*">([0-9-\ ,]+)\ [A-Z]+&lt;/span>.*">([0-9-\ ,]+)\ ([A-Z]+)&lt;/span>&lt;/p>\n')
    sz_next = re.compile('button\ id="PrevPage"\ onclick="doSubmit\(\'\',\'\',\'\',\'(.*)\',true,false,true,null\);return false"\ class="button">Poprzednie')

    # przejscie do konta
    submit = []
    for form in br.forms():
        for forma in form.controls:
    	    submit.append((forma.name, forma.value))
    submit[0] = ('__PARAMETERS', value)
    none = None, ''
    while submit.count(none)>0:
	submit.remove(none)
    submitstr = urlencode(submit) # zbieranie danych do POST
    br.open("https://www.mbank.com.pl/account_oper_list.aspx", submitstr)

    # strona z kontem, teraz istnieje mozliwosc filtrowania operacji
    br.select_form(name="MainForm")

#    br["daterange_from_day"] = '21'
#    br["daterange_from_month"] = '11'
#    br["daterange_from_year"] = '2009'
#    br["daterange_to_day"] = '5'
#    br["daterange_to_month"] = '12'
#    br["daterange_to_year"] = '2009'

    br["lastdays_period"] = [str(wybor_period)]
    br["lastdays_days"] = str(wybor_numer)
    br["accoperlist_typefilter_group"] = [str(wybor_typ)]

    response_get = br.submit()

    # zbieranie danych do klikniecia guzika Poprzednie operacje
    strona = ''
    stronatmp = response_get.read()
    while sz_next.findall(stronatmp).__len__() == 1:
	strona = strona+stronatmp
        submit = []
        for form in br.forms():
            for forma in form.controls:
        	submit.append((forma.name, forma.value))
        trans_next = sz_next.findall(stronatmp)
        submit[0] = ('__PARAMETERS', trans_next)
        while submit.count(none)>0:
	    submit.remove(none)
        submitstr = urlencode(submit) # zbieranie danych do POST
        submitstr = re.sub(r'\%5B|\%5D|\%27|\&#038;account[^=]+=', '', submitstr)
        response_get = br.open("https://www.mbank.com.pl/account_oper_list.aspx?",submitstr)
	stronatmp = response_get.read()
    ###
    strona = strona+stronatmp
    strona = strona.decode('iso8859-2')

#    print strona
    strona = re.sub(r'\&shy;|&lt;wbr />', '', strona)
    strona = re.sub(r'&lt;/li>|&lt;li class="alternate">|&lt;li>', '\n', strona)

#    print strona
    r_trans = []
    for trans_html in sz_grep.findall(strona):
	trans_temp = sz_trans1.findall(strip_dspace(trans_html))
	if trans_temp.__len__() == 0:
	    trans_temp = sz_trans2.findall(trans_html)
	if trans_temp.__len__() == 0:
	    trans_temp = sz_trans3.findall(trans_html)
	if trans_temp.__len__() == 1: # and re.match(valuea, str(trans_temp[0][3])):
	    trans_temp = list(trans_temp[0])
	    trans_temp[8] = strip_space(trans_temp[8])
	    trans_temp[9] = strip_space(trans_temp[9])
	    r_trans.append(trans_temp)
	#if trans_temp.__len__() == 0:
	    #print "Rodzaj nieznany"+trans_html
    return r_trans

#-########mBank#####################################
print "===> Uruchomienie wersja mBank_auto_skrypt v2.2.0"
br = Browser()	# uruchomienie przegladarki
# ewentualny debugging
#br.set_debug_redirects(True)
#br.set_debug_responses(True)
#br.set_debug_http(True)
br.open("https://www.mbank.com.pl/")
##################
# LOGOWANIE
time.sleep(1)
br.select_form(name="MainForm") # wypelnienie formularza
try:
    br['Y3VzdG9tZXI='.decode('base64')] = Y3VzdG9tZXI.decode('base64')
    br['cGFzc3dvcmQ='.decode('base64')] = cGFzc3dvcmQ.decode('base64')
except:
    print "===> BLAD przy odszyfrowywaniu - ", sys.exc_info()[1]
    sys.exit()
time.sleep(1)
response_in = br.submit() # wyslanie formularza
if response_in.geturl() == "https://www.mbank.com.pl/frames.aspx":
    print "===> Zalogowano poprawnie"
else:
    print "===> BLAD przy logowywaniu"
    sys.exit()
##################
# Wyswietlanie listy kont i wyciagow
# funkcja get_konta pobiera wszystkie konta i potrzebne dane do uzyskania wyciagu z konta
# jako opcje przyjmuje numer/numery konta bez spacji ktore maja zostac wyswietlone
# funkcja get_trans pobiera transakcje w ostatnich 14 dniach (domyslnie w mbanku)
# jako opcje przyjmuje zmienna post do uzyskania wyciagu oraz rodzaj transakcji do wyswietlenia
# (wg specjalnej numeracji mbanku)
##################
##################
konta = get_konta(wybor_konto)
print "===> Znalezione konta:",konta.__len__()
for konto in konta:
    print ("---> "+konto[2]+"  "+(konto[3]+"("+konto[5]+")"+konto[4]).rjust(15, ' ')+"  "+konto[1]).encode("utf8")
    trans = get_trans(konto[0], wybor_typ)
    for transa in trans:
#        print transa
        print ("  -> "+transa[2].ljust(4, ' ')+"  "+transa[0]+"  "+transa[3]+"  "+transa[6].ljust(32,' ')+"  "+transa[8].rjust(10,' ')+"  "+transa[5]).encode("utf8")
##################
##################
# WYLOGOWANIE
response_out = br.open("https://www.mbank.com.pl/logout.aspx")
response_out.seek(2000)
if response_out.read(6000).find('Poprawne wylogowanie z cz') > 0:
    print "===> Wylogowano poprawnie"
else:
    print "===> BLAD przy wylogowywaniu"
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.yunnan.tk/pomoce/programowanie/mbank-skrypt-do-zautomatyzowanego-pobierania-wyciagu-z-konta/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>SlimRat plugins</title>
		<link>http://www.yunnan.tk/pomoce/programowanie/slimrat-plugins/</link>
		<comments>http://www.yunnan.tk/pomoce/programowanie/slimrat-plugins/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 12:34:02 +0000</pubDate>
		<dc:creator>Yunnan</dc:creator>
				<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://www.yunnan.tk/?p=292</guid>
		<description><![CDATA[Na prosbe czytelnikow zmotywowalem sie do napisania paru pluginow do SlimRata. Na pierwszy ogien poszly: ShareBase.to OK FastShare.org OK OdSiebie.com OK HotFile.com OK DepositFiles.com Poprawione SendSpace.pl Share-Now.net Raczej sie nie uda Musze powiedziec ze kiedys zdarzylo mi sie cos napisac w Perlu, ale teraz jestem nie przekonany do tego jezyka (zeby nie powiedziec ze wrecz [...]]]></description>
			<content:encoded><![CDATA[<p>Na prosbe czytelnikow zmotywowalem sie do napisania paru pluginow do SlimRata.</p>
<p>Na pierwszy ogien poszly:</p>
<ul>
<li><span style="text-decoration: line-through;">ShareBase.to</span> OK<span style="text-decoration: line-through;"><br />
</span></li>
<li><span style="text-decoration: line-through;">FastShare.org</span> OK<span style="text-decoration: line-through;"><br />
</span></li>
<li><span style="text-decoration: line-through;">OdSiebie.com</span> OK<span style="text-decoration: line-through;"><br />
</span></li>
<li><span style="text-decoration: line-through;">HotFile.com</span> OK</li>
<li><span style="text-decoration: line-through;">DepositFiles.com</span> Poprawione<span style="text-decoration: line-through;"><br />
</span></li>
<li>SendSpace.pl</li>
<li><span style="text-decoration: line-through;">Share-Now.net</span> Raczej sie nie uda<span style="text-decoration: line-through;"><br />
</span></li>
</ul>
<p>Musze powiedziec ze kiedys zdarzylo mi sie cos napisac w Perlu, ale teraz jestem nie przekonany do tego jezyka (zeby nie powiedziec ze wrecz go nie lubie). Od jakiegos czasu mam duzo milych doswiadczen z Pythonem, wiec mialem pewne trudnosci zeby wrocic do Perla&#8230;<br />
Nie wspominam o drobnych roznicach pakietu Mechanize dla Perla i Pythona. Na szczescie (lub moje chwilowe nieszczescie) znowu przekonalem sie ze Python jest lepszym jezykiem.</p>
<h3>Problem z Captcha</h3>
<p>Wiele podobnych stron stosuje Captcha aby uniknac zautomatyzowanego pobierania plikow. Chwilowo takie strone sa stosunkowo niezagrozone, poniewaz systemy AntiCaptcha niestety nie do konca daja sobie rade. Pozatym, po np 3-krotnym blednym wpisaniu Captcha mozna zabanowac IP na dluzej, podejrzewajac skrypt sciagajacy.</p>
<p>Bazy danych obrazkowo Captcha wydaja sie prawie niezawodnym rozwiazaniem, ale troche przesadzonym, no i ktos musi te literki Captcha chociaz raz zgadnac&#8230;</p>
<p>Tak czy owak, moze kiedys bedzie warto zajac sie stronkami z Captcha, tymczasem jednak jest dosc bez takich zabezpieczen <img src='http://www.yunnan.tk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>ShareBase.to v0.2</h3>
<p>Oto plugin do ShareBase.to. Transfery duzo szybsze niz RapidShare (do 7MB/s). Wystarczy skopiowac go do katalogu plugins i od razu powinien zaczac dzialac.</p>
<p><a href="http://www.yunnan.tk/wp-content/files/slimrat/ShareBase.pm">Sciagnij plugin do ShareBase.to.<br />
</a>(testowane na Slimrat 0.9.4)<a href="http://www.yunnan.tk/wp-content/files/slimrat/ShareBase.pm"></a></p>
<h3>FastShare.org v0.1</h3>
<p>Rowniez szybkie transfery do 5MB/s.</p>
<p><a href="http://www.yunnan.tk/wp-content/files/slimrat/FastShare.pm">Sciagnij plugin do FastShare.org.<br />
</a>(testowane na Slimrat 0.9.4)</p>
<h3>OdSiebie.com v0.3</h3>
<p>Sympatyczne transfery do 4MB/s (podobno tylko tymczasowo bez Captcha).</p>
<p><a href="http://www.yunnan.tk/wp-content/files/slimrat/OdSiebie.pm">Sciagnij plugin do OdSiebie.com.<br />
</a>(testowane na Slimrat 0.9.4)</p>
<h3>HotFile.com v0.3</h3>
<p>Powolny, ale mozna co 3 minuty sciagac.</p>
<p><a href="http://www.yunnan.tk/wp-content/files/slimrat/HotFile.pm">Sciagnij plugin do HotFile.com.</a></p>
<h3>DepositFiles.com corrected/poprawiony</h3>
<p>Powolny, ale mozna czesto sciagac.</p>
<p><a href="http://www.yunnan.tk/wp-content/files/slimrat/DepositFiles.pm">Sciagnij plugin do DepositFiles.com.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yunnan.tk/pomoce/programowanie/slimrat-plugins/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP Gadu Gadu status skrypt</title>
		<link>http://www.yunnan.tk/pomoce/komunikatory-internetowe/php-gadu-gadu-status-skrypt/</link>
		<comments>http://www.yunnan.tk/pomoce/komunikatory-internetowe/php-gadu-gadu-status-skrypt/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 21:38:36 +0000</pubDate>
		<dc:creator>Yunnan</dc:creator>
				<category><![CDATA[Komunikatory internetowe]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://www.yunnan.tk/?p=175</guid>
		<description><![CDATA[Maly skrypcik w PHP do sprawdzania czy jestes obecny na gg. Zwykla 5-minutowka. Skrypcik jest juz funkcją, wiec łatwo go się używa. Za duzo sie w tych 10 linijkach poprawic nie da ;D ale jak ktos znajdzie buga to prosze pisac. W skrocie, jesli wyskoczy komunikat &#8222;Twoj numer jest bledny&#8221; oznacza to ze albo zmienna [...]]]></description>
			<content:encoded><![CDATA[<p>Maly skrypcik w PHP do sprawdzania czy jestes obecny na gg. Zwykla 5-minutowka.<br />
Skrypcik jest juz funkcją, wiec łatwo go się używa.<br />
Za duzo sie w tych 10 linijkach poprawic nie da ;D ale jak ktos znajdzie buga to prosze pisac.</p>
<pre class="code"></pre>
<p>W skrocie, jesli wyskoczy komunikat &#8222;Twoj numer jest bledny&#8221; oznacza to ze albo zmienna jest pusta, lub zero, albo zmienna nie jest integerem.<br />
Jesli wyskoczy &#8222;Cos sie nie udalo&#8230;&#8221; znaczy to ze polaczenie z serwerem sie nie udalo, albo konto z takim numerem gg nie istnieje.</p>
<p><strong>EDIT:</strong> Zeby uniknac problemow z kodowaniem znakow itp, zamieszczam kod w pliku do sciagniecia -&gt; <a href="http://www.yunnan.tk/wp-content/files/skrypty/gg_stat.txt">gg_stat.txt<br />
</a><strong>Uwaga dla windowsowcow:</strong> Jakby ktos nie zauwazyl, to kodowanie znakow to ISO-8859-2 !</p>
<p><strong>Poprawki 2009.10</strong>:</p>
<ul>
<li> gg zmienilo adres obrazka statusu</li>
<li> kodowanie znakow encjami rozwiazuje problem kodowania znakow</li>
<li> funkcja zwraca komunikat jako string, a nie wyswietla go sama</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.yunnan.tk/pomoce/komunikatory-internetowe/php-gadu-gadu-status-skrypt/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using apc
Object Caching 525/563 objects using apc

Served from: www.yunnan.tk @ 2012-02-09 12:16:08 -->
