Script Notifikasi Perubahan Saldo BCA
Berikut adalah tutorial untuk script yang akan menampilkan data saldo pada rekening Bank BCA yang kita miliki, serta dapat mengirimkan email pemberitahuan jika ada perubahan (penambahan ataupun pengurangan)
Ada tiga file yang diperlukan, serta satu cron untuk memonitor perubahan dan mengirimkan email.
- index.php
- IbParser.php
- notifikasi.php
1. index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <html> <head> <title>Mutasi BCA</title> <style> body, th, td, pre { font-size:12px; color: #000; font-family:'Open Sans',Verdana, Geneva, sans-serif; } </style> <head> <body> <?php error_reporting( E_ALL ); require( 'IbParser.php' ); $parser = new IbParser(); ?> <?php $bank = 'BCA'; $user = 'useridKlikBCA'; $pass = 'passwordKlikBCA'; $balance = $parser->getBalance( $bank, $user, $pass ); ?> <table> <tr> <th align="left">Transaction History:</th> </tr> <tr> <td><?php echo $bank . ' ' . $user ?></td> <td><?php echo "Last access: ".date("F d Y H:i:s.",fileatime("index.php")); ?></td> </tr> </table> <hr /> <?php $transactions = $parser->getTransactions( $bank, $user, $pass ); ?> <table> <tr> <th> </th> <th align="left">Tgl</th> <th align="left">Keterangan</th> <th>DB/CR</th> <th>Nominal</th> </tr> <?php foreach( $transactions as $index => $baris ) : ?> <tr> <td> </td> <td><?php echo $baris[0]; ?></td> <td><?php echo $baris[1]; ?></td> <td><?php echo $baris[2]; ?></td> <td><?php echo $baris[3]; ?></td> </tr> <?php endforeach; ?> </table> <table> <tr> <th> </th> <th> </th> <th>SALDO:</th> <th> </th> <th align="left"><?php echo ( !$balance )? 'Gagal mengambil saldo': number_format( $balance, 2 ); ?></th> </tr> </table> <body> |
2. IbParser.php
3. notifikasi.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | #!/usr/local/bin/php <?php error_reporting( E_ALL ); // Akun-akun yang akan dicek. // Parameter terakhir adalah interval pengecekan agar independen dari cron. // File ini bisa dipanggil tiap 5-10 menit sekali lewat cron. $accounts = array( array( 'BCA', 'useridKlikBCA', 'passwordKlikBCA', '[email protected]', ( 60 * 30 ) ), // tiap 30 menit ); // Saya mendapat tips legal bahwa otomasi login ke klik BCA dibolehkan // selama dilakukan oleh pemilik akun. // Saya juga mendapat tips teknis yang menyebutkan agar login dilakukan // tidak lebh dari 100x per hari. // Jalan run( $accounts ); // run() logic function run( $accounts ) { require( 'IbParser.php' ); $notifier = new IbParser; $datadir = dirname( __FILE__ ) . '/data'; if ( !is_dir( $datadir ) ) mkdir( $datadir ); // Langkah-langkah untuk setiap akun foreach( $accounts as $account ) { // Periksa file data, kalau false langsung lanjut ke akun berikut if ( !$balance = checkDataFile( $account, $datadir ) ) continue; // Ambil balance, kalau false langsung lanjut if ( !$new_balance = $notifier->getBalance( $account[0], $account[1], $account[2] ) ) continue; $balance = json_decode( $balance )->balance; // Update file data walaupun balancenya sama updateDataFile( $account, $datadir, $new_balance ); // Bandingkan balance, kalau sama langsung lanjut if ( $balance == $new_balance ) continue; // Ambil transaksi $transactions = $notifier->getTransactions( $account[0], $account[1], $account[2] ); // Kirim email notify( $account, $balance, $new_balance, $transactions ); } } function checkDataFile( $account, $datadir ) { $datafile = $datadir . '/' . md5( $account[0] . $account[1] ); if ( !file_exists( $datafile ) ) { touch( $datafile ); return json_encode( array( 'balance' => 0 ) ); } if ( filemtime( $datafile ) > time() - $account[4] ) return false; else return file_get_contents( $datafile ); } function updateDataFile( $account, $datadir, $new_balance ) { $datafile = $datadir . '/' . md5( $account[0] . $account[1] ); $fh = fopen( $datafile, 'w' ); fwrite( $fh, json_encode( array( 'balance' => $new_balance ) ) ); fclose( $fh ); } function notify( $account, $balance, $new_balance, $transactions ) { $difference = $new_balance - $balance; $subject = ( $difference > 0 )? 'Peningkatan ': 'Penurunan '; $subject .= 'Saldo ' . $account[0] . ' sebesar Rp ' . number_format( abs( $difference ), 2 ); // Ganti dengan email anda (yang boleh dikirim dari server) $body = 'Saldo saat ini Rp ' . number_format( ( $new_balance ), 2 ); // 50 ribu saldo wajib di BCA $body .= "\n\n" . 'Transaksi:' . "\n"; if ( $transactions ) { foreach( $transactions as $transaction ) { $drcr = ( $transaction[2] == 'CR' )? 'CREDIT': 'DEBIT'; $body .= "\n" . $transaction[0] . ' === ' . number_format( $transaction[3], 2 ) . ' === ' . $drcr . "\n" . strtolower( str_replace( "\n", ' ', $transaction[1] ) ) . "\n"; } } else { $body .= 'Gagal mengambil transaksi'; } mail( $account[3], $subject, $body, $headers ); } |
Leave a Comment