
Einführung
MCC (Merchant Category Code) - Ein Händlerkategoriecode, der bei Operationen mit Bankkarten verwendet wird. Nach diesem Code bestimmt die Bank, welches Produkt der Kunde gekauft hat. Es hängt von ihm ab, ob sie Ihnen einen Cashback, eine Provision oder eine Stornierungsfrist in Rechnung stellen.
In einem Jahrhundert, in dem Unternehmen mit von Benutzern gesammelten Daten Geld verdienen, ist es eine Sünde, nicht den umgekehrten Schritt zu machen: Verwenden Sie die von Unternehmen gesammelten Daten über sich selbst, damit Sie zumindest sparen, wenn Sie kein Geld damit verdienen.
Wenn Sie wissen, wie viel Sie für jeden Kundencenter-Code ausgeben, können Sie berechnen, welche Bankkarte große Vorteile bringt. Wenn Sie die Tinkoff- oder Rocketbank-Karten genügend Zeit verwendet haben, ist dieser Artikel hilfreich, um Statistiken zu den Ausgaben für jedes Kundencenter zu erhalten.
Tinkoff
Das persönliche Konto der Tinkoff Bank zeigt die MCC-Vorgänge an, wenn Sie darauf klicken.

Sie können also ein Dutzend Vorgänge sehen, aber wenn wir Statistiken für die gesamte Zeit der Verwendung der Karte sammeln müssen, sollte dieser Fall automatisiert werden. Versuchen wir, die Daten in einer für die Softwareverarbeitung geeigneten Form abzurufen.
UPD: Wie Smasher feststellte, bietet Ihr persönliches Konto die Möglichkeit, alle Vorgänge im CSV- oder Excel-Format hochzuladen. Also unter dem Spoiler eine Beschreibung, wie ich es gemacht habe, ohne davon zu wissen.

Den harten Weg gehenDies erfordert Browser-Entwicklungstools und insbesondere eine Analyse der Netzwerkaktivität (Registerkarte "Netzwerk" in Google Chrome). Wenn Sie den Analysator einschalten und dann Ihr persönliches Konto bitten, die Vorgänge "Für alle Zeiten" anzuzeigen, finden wir schnell die gewünschte Anfrage.

Sie können feststellen, dass der Server die Daten wirklich für die gesamte Zeit angegeben hat und das erforderliche Kundencenter in der JSON-Antwort vorhanden ist.

Simulieren Sie zur Vereinfachung der Datenverarbeitung eine Anforderung in Python. Ich benutze ein Jupyter Notebook .

Wir senden eine POST-Anfrage an die URL https://api.tinkoff.ru/v1/grouped_requests mit identischen SessionID- und _methods-Parametern und RequestsData- Daten.
import requests session_id = "b785Q2R5US2AZo2p5JoCtNQNkbmYsJbl.ds-api02" methods = "operations"
Wenn wir alles richtig gemacht haben, wird durch Eingabe von response.text in der Konsole der Antworttext angezeigt. Es bleibt, diese Daten zu analysieren und die benötigten Fragmente zu speichern.
import csv operations = [] payload = response.json()['payload'] for key in payload: feed = payload[key]['payload'] for operation in feed: mcc = operation['mcc']
Am Ausgang erhalten wir eine Tabelle mit Kundencenter-Codes, Kaufkosten und Geschäftsnamen.
Rocketbank
Rocketbank zeigt MCC-Transaktionen nach Erhalt an. Daher müssen wir Links zu Belegen aller Operationen sammeln.

Mit Rocketbank etwas komplizierter, da der Zugriff auf Ihr persönliches Konto nur über die mobile Anwendung erfolgt. Ich werde nur darüber erzählen, was für mich funktioniert hat, und nur über Android. Installieren Sie den Charles Analyzer auf dem Computer und leiten Sie den Datenverkehr vom Telefon durch den Computer.
Dazu müssen das Telefon und der Computer mit demselben Netzwerk verbunden sein. Sie müssen die IP des Computers im lokalen Netzwerk ermitteln. Zum Beispiel mit ifconfig .
Konfigurieren Sie als Nächstes das Telefon so, dass es über den Charles-Proxyserver funktioniert. In Android 7.0 erfolgt dies in den Wi-Fi-Einstellungen durch langes Drücken auf das verbundene Netzwerk. Geben Sie die Computer-IP und den Port 8888 an, den Standard-Charles.

Es versteht sich von selbst, dass die Rocketbank-Anwendung bei der Interaktion mit dem Server TLS verwendet und wir den Datenverkehr nicht einfach so abhören können. Charles unterstützt das Abfangen von Datenverkehr durch das Ersetzen eines TLS-Zertifikats, dh es implementiert einen MITM-Angriff. Dazu muss das Gerät jedoch dem Charles-Stammzertifikat vertrauen.
Das Charles-Stammzertifikat wird installiert, wenn Sie auf einem mobilen Gerät mit aktiviertem Proxy auf den Link https://chls.pro/ssl klicken. Außerdem müssen Sie rocketbank.ru zur Liste der Proxy-Hosts unter Proxy -> SSL-Proxy-Einstellungen hinzufügen .

Dies reicht jedoch nicht aus, da Anwendungen in Android 7.0 standardmäßig keinen Zertifizierungsstellen für Benutzer vertrauen. Sicherheit! Der Antrag muss mit der entsprechenden Genehmigung erstellt werden. Ein Hindernis? Nicht einmal. Wir dekompilieren und kompilieren nach Bedarf.
Zuerst bekommen wir das Anwendungspaket vom Telefon. Dies kann mit der Android Debug Bridge oder der Apk Extractor- Anwendung erfolgen. Die erste Methode unter Android 7.0 hat bei mir nicht funktioniert, und die zweite hat die Aufgabe bewältigt.
Wir bringen das Paket zum Computer und dekompilieren es mit apktool .
apktool d rocket.apk
Sie müssen die Konfigurationsdatei für die Netzwerksicherheit im Pfad res / xml / network_security_config.xml hinzufügen. Sie können hier mehr über das Konfigurationsdateiformat lesen, aber die folgenden Einstellungen reichen für uns aus:
<network-security-config> <base-config> <trust-anchors> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>
Diese Konfigurationsdatei muss im Anwendungsmanifest (AndroidManifest.xml im Stammverzeichnis) angegeben werden, indem der Parameter android: networkSecurityConfig zum Anwendungs-Tag hinzugefügt wird.
<application android:networkSecurityConfig="@xml/network_security_config" android:allowBackup="false" ...>...</application>
Jetzt kompilieren.
apktool b rocket
Die Anwendung muss noch signiert werden, da nicht signierte Anwendungen nicht installiert sind. Wir verwenden dafür ein Signaturprogramm mit einem eingebauten Testzertifikat .
java -jar sign.jar rocket.apk
Entfernen Sie die ursprüngliche Rocketbank-Anwendung vom Telefon, kopieren Sie das geänderte Paket auf das Telefon und installieren Sie es (z. B. über die Anwendung "Dateien").
Jetzt sollte das Abfangen des Verkehrs in Charles funktionieren. Öffnen Sie die Rocketbank-Anwendung, melden Sie sich an und schauen Sie in Charles nach. Hier ist unser Link zur Quittung.

Kehren wir zu Python zurück und simulieren diese GET-Anforderung. Verschwenden Sie keine Zeit damit und bitten Sie den Server, uns Daten zu allen Vorgängen zu geben. Na ja, oder zumindest über die ersten 999999.
token = 'c8ccb54b-09e3-4608-a5b4-7914a92c21f3206582' params = {'token': token, 'page': 1, 'per_page': 999999}
Es wurde experimentell herausgefunden, dass der Server der Sitzung nur dann vertraut, wenn die richtige x-Geräte-ID , x-Zeit und x-Sig zusammen mit dem Token gesendet wurden . Es tut uns nicht leid, denn wir müssen nichts erfinden und zählen, kopieren Sie es einfach.
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)
Regelmäßig genug, um das Kundencenter aus der Quittung zu ziehen. Wir gehen die Operationen durch, lesen die Quittung, durchlaufen den regulären Zeitplan und alles, was wir brauchen, in unserer Tasche.
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']
Vielleicht können Sie die geänderte Anwendung löschen und die ursprüngliche wieder installieren.
Insgesamt
Durch die Kombination von Daten aus zwei Banken, die Gruppierung von Vorgängen nach Kundencenter mithilfe einer Pivot-Tabelle, das manuelle Löschen von Daten aus Überweisungen und Bargeldabhebungen und die gruppierte Gruppierung in ähnliche Kategorien ergab sich das folgende Bild:

Mit einem Dienst wie mcc-codes.ru können Sie jetzt Karten mit erhöhtem Cashback für die teuersten Kategorien abholen. Wenn Sie den Betrag des möglichen Cashbacks mit den Kosten für die jährliche Wartung korrelieren, bestimmen Sie, ob es ratsam ist, eine bestimmte Karte zu erstellen.
Was ist der Vorteil davon? Mit meinen Ausgaben und der richtigen Auswahl an Karten kann ich von 10 Tausend Rubel pro Jahr sparen. Lohnt es sich? Sie entscheiden :)