
Pendahuluan
MCC (Kode Kategori Pedagang) - kode kategori pedagang yang digunakan dalam operasi dengan kartu bank. Menurut kode ini, bank menentukan produk mana yang telah dibeli oleh pelanggan. Tergantung padanya apakah mereka akan menagih Anda cashback, komisi atau membatalkan masa tenggang.
Di abad ketika perusahaan menghasilkan uang dari data yang dikumpulkan dari pengguna, adalah dosa untuk tidak menggunakan langkah sebaliknya: gunakan data tentang diri mereka sendiri yang dikumpulkan oleh perusahaan sehingga, jika Anda tidak menghasilkan uang di dalamnya, setidaknya simpan.
Mengetahui berapa banyak yang Anda belanjakan untuk setiap kode PKS, Anda dapat menghitung kartu bank mana yang akan memberikan manfaat besar. Karenanya, jika Anda telah menggunakan cukup banyak waktu pada kartu Tinkoff atau Rocketbank, artikel ini akan berguna untuk mendapatkan statistik pengeluaran untuk setiap PKS.
Tinkoff
Akun pribadi Tinkoff Bank menunjukkan operasi PKS ketika Anda mengkliknya.

Jadi Anda dapat melihat selusin operasi, tetapi jika kami perlu mengumpulkan statistik untuk seluruh waktu penggunaan kartu, kasing ini harus otomatis. Mari kita coba untuk mendapatkan data dalam bentuk yang nyaman untuk pemrosesan perangkat lunak.
UPD: Seperti yang dicatat Smasher , akun pribadi Anda menyediakan kemampuan untuk mengunggah semua operasi dalam format CSV atau Excel. Jadi di bawah spoiler deskripsi tentang bagaimana saya melakukannya, tidak mengetahuinya.

Pergi dengan cara yang sulitIni akan memerlukan alat pengembangan browser, dan khususnya, analisis aktivitas jaringan (tab Jaringan di Google Chrome). Jika Anda menghidupkan alat analisis dan kemudian meminta akun pribadi Anda untuk menampilkan operasi "Sepanjang Masa", maka kami akan segera menemukan permintaan yang diinginkan.

Anda dapat melihat bahwa server benar-benar memberikan data sepanjang waktu, dan PKS yang diperlukan ada di respons JSON.

Untuk kenyamanan pemrosesan data, simulasikan permintaan dengan Python. Saya menggunakan Notebook Jupyter .

Kami akan mengirimkan permintaan POST ke URL https://api.tinkoff.ru/v1/grouped_requests dengan parameter sessionid dan _methods dan data data data requestSata yang identik.
import requests session_id = "b785Q2R5US2AZo2p5JoCtNQNkbmYsJbl.ds-api02" methods = "operations"
Jika kami melakukan semuanya dengan benar, maka memasukkan response.text di konsol akan menampilkan badan respons. Tetap mem-parsing data ini dan menyimpan fragmen yang kita butuhkan.
import csv operations = [] payload = response.json()['payload'] for key in payload: feed = payload[key]['payload'] for operation in feed: mcc = operation['mcc']
Di bagian keluaran, kami mendapatkan tabel kode PKS, biaya pembelian, dan nama toko.
Rocketbank
Rocketbank menunjukkan transaksi MCC pada saat diterima. Karena itu, kita perlu mengumpulkan tautan ke tanda terima dari semua operasi.

Dengan Rocketbank sedikit lebih rumit, karena akses ke akun pribadi Anda hanya dilakukan melalui aplikasi seluler. Saya hanya akan memberi tahu tentang apa yang berhasil untuk saya, dan hanya tentang Android. Instal penganalisa Charles di komputer dan berikan lalu lintas dari telepon melalui itu.
Untuk melakukan ini, telepon dan komputer harus terhubung ke jaringan yang sama. Anda perlu mengetahui IP komputer di jaringan lokal. Misalnya, menggunakan ifconfig .
Selanjutnya, konfigurasikan ponsel agar berfungsi melalui server proxy Charles. Di Android 7.0, ini dilakukan dalam pengaturan Wi-Fi dengan menekan lama pada jaringan yang terhubung. Tentukan IP komputer dan port 8888, Charles default.

Tak perlu dikatakan bahwa aplikasi Rocketbank menggunakan TLS ketika berinteraksi dengan server dan kami tidak akan dapat mendengarkan lalu lintas begitu saja. Charles mendukung intersepsi lalu lintas dengan substitusi sertifikat TLS, yaitu mengimplementasikan serangan MITM. Namun, untuk ini, perangkat harus mempercayai sertifikat root Charles.
Sertifikat root Charles diinstal ketika Anda mengklik tautan https://chls.pro/ssl dari perangkat seluler dengan proxy yang diaktifkan. Selain itu, Anda perlu menambahkan rocketbank.ru ke daftar host proksi di Proxy -> Pengaturan Proxy SSL .

Tetapi ini tidak akan cukup, karena di Android 7.0, secara default, aplikasi tidak mempercayai otoritas sertifikasi pengguna. Keamanan! Aplikasi harus dikompilasi dengan izin yang sesuai. Sebuah kendala? Tidak sekali pun. Kami mendekompilasi dan mengkompilasi sesuai kebutuhan.
Pertama kita mendapatkan paket aplikasi dari ponsel. Ini dapat dilakukan menggunakan Android Debug Bridge atau aplikasi Apk Extractor . Metode pertama di Android 7.0 tidak bekerja untuk saya, dan yang kedua mengatasi tugas itu.
Kami membawa paket ke komputer dan mendekompilasi menggunakan apktool .
apktool d rocket.apk
Anda harus menambahkan file konfigurasi keamanan jaringan di sepanjang jalur res / xml / network_security_config.xml. Anda dapat membaca lebih lanjut tentang format file konfigurasi di sini , tetapi pengaturan berikut cukup bagi kami:
<network-security-config> <base-config> <trust-anchors> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>
File konfigurasi ini harus ditentukan dalam manifes aplikasi (AndroidManifest.xml di root) dengan menambahkan parameter android: networkSecurityConfig ke tag aplikasi.
<application android:networkSecurityConfig="@xml/network_security_config" android:allowBackup="false" ...>...</application>
Sekarang kompilasi.
apktool b rocket
Tetap menandatangani aplikasi, karena aplikasi yang tidak ditandatangani tidak diinstal. Kami menggunakan ini untuk program tanda tangan dengan sertifikat uji bawaan .
java -jar sign.jar rocket.apk
Hapus aplikasi Rocketbank asli dari telepon, salin paket yang dimodifikasi ke telepon dan instal (misalnya, melalui aplikasi "File").
Sekarang intersepsi lalu lintas di Charles harus bekerja. Buka aplikasi Rocketbank, masuk dan cari di Charles. Ini dia, tautan kami ke tanda terima.

Mari kembali ke Python dan mensimulasikan permintaan GET ini, jangan buang waktu dan minta server untuk memberi kami data tentang semua operasi. Ya, atau setidaknya tentang 999999 pertama.
token = 'c8ccb54b-09e3-4608-a5b4-7914a92c21f3206582' params = {'token': token, 'page': 1, 'per_page': 999999}
Secara eksperimental diketahui bahwa server mempercayai sesi hanya jika x-device-id , x-time dan x-sig yang benar dikirim bersama dengan token. Kami tidak merasa menyesal, karena kami tidak perlu menemukan dan menghitung apa pun, cukup salin saja.
x_device_id = 'ANDROID_C6FBB57CD433E756_899EE771-4AC5-46ED-44A1-656CE47A417B' x_time = '1529194008' x_sig = 'c486365013ddebe8b7f4599afbf73d26' headers = {'x-device-id': x_device_id, 'x-time': x_time, 'x-sig': x_sig} response = requests.get('https://rocketbank.ru/api/v5/operations/sexy_feed', params=params, headers=headers)
Cukup teratur untuk mengeluarkan PKS dari tanda terima. Kita membahas operasi, membaca tanda terima, menjalankannya melalui jadwal reguler dan semua yang kita butuhkan di saku kita.
import re regex = re.compile('MCC:</dt><.+?>(\d+)</dd>') operations = [] feed = response.json()['feed'] for item in feed: if item[0] == 'operation': operation = item[1] merchant_name = operation['merchant']['name'] receipt_url = operation['receipt_url'] cost = operation['money']['amount']
Mungkin Anda dapat menghapus aplikasi yang dimodifikasi dan menginstal yang asli kembali.
Total
Dengan menggabungkan data dari dua bank, mengelompokkan operasi berdasarkan MCC menggunakan Tabel Pivot, secara manual menghapus data dari transfer dan penarikan tunai, dan mengelompokkannya ke dalam kategori yang sama di beberapa tempat, saya mendapatkan gambar berikut:

Sekarang, dengan menggunakan layanan seperti mcc-codes.ru , Anda dapat mengambil kartu dengan peningkatan cashback untuk kategori paling mahal. Dan, mengkorelasikan jumlah kemungkinan cashback dengan biaya pemeliharaan tahunan, tentukan apakah disarankan untuk membuat kartu tertentu.
Apa manfaatnya? Dengan pengeluaran saya dan pemilihan kartu yang benar, saya dapat menghemat dari 10 ribu rubel per tahun. Apakah itu sepadan? Anda yang memutuskan :)