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>&nbsp;</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>&nbsp;</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>&nbsp;</th>
<th>&nbsp;</th>
<th>SALDO:</th>
<th>&nbsp;</th>
<th align="left"><?php echo ( !$balance )? 'Gagal mengambil saldo': number_format( $balance, 2 ); ?></th>
</tr>
</table>
 
<body>

2. IbParser.php


3. notifikasi.php

var/www/saldo/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)
 
    $headers    = 'From: "BCA Notifier"<[email protected]>' . "\n";
 
 
    $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 );
 
 
}


Tidak ada komentar

Diberdayakan oleh Blogger.