Obtenez les statistiques de coûts du MCC: Tinkoff et Rocketbank


Présentation


MCC (Merchant Category Code) - un code de catégorie marchand utilisé dans les opérations avec des cartes bancaires. Selon ce code, la banque détermine quel produit le client a acheté. Cela dépend de lui s'ils vous factureront une remise en argent, une commission ou annuler le délai de grâce.


Dans un siècle où les entreprises gagnent de l'argent à partir des données collectées auprès des utilisateurs, c'est un péché de ne pas utiliser le mouvement inverse: utilisez les données les concernant collectées par les entreprises afin que, si vous ne gagnez pas d'argent dessus, économisez au moins.


En sachant combien vous dépensez pour chaque code MCC, vous pouvez calculer quelle carte bancaire apportera de grands avantages. Par conséquent, si vous avez utilisé suffisamment de temps les cartes Tinkoff ou Rocketbank, cet article vous sera utile pour obtenir des statistiques sur les dépenses de chaque MCC.


Tinkoff


Le compte personnel de Tinkoff Bank affiche les opérations MCC lorsque vous cliquez dessus.



Vous pouvez donc voir une douzaine d'opérations, mais si nous devons collecter des statistiques pour toute la durée d'utilisation de la carte, ce cas doit être automatisé. Essayons d'obtenir les données sous une forme pratique pour le traitement logiciel.


UPD: Comme Smasher l'a noté, votre compte personnel offre la possibilité de télécharger toutes les opérations au format CSV ou Excel. Donc, sous le spoiler, une description de la façon dont je l'ai fait, sans le savoir.



Aller à la dure

Cela nécessitera des outils de développement de navigateur, et en particulier, une analyse de l'activité du réseau (onglet Réseau dans Google Chrome). Si vous allumez l'analyseur et demandez ensuite à votre compte personnel d'afficher les opérations «For All Time», nous trouverons rapidement la demande souhaitée.



Vous pouvez remarquer que le serveur a vraiment donné les données à tout moment et que le MCC requis est présent dans la réponse JSON.



Pour la commodité du traitement des données, simulez une demande en Python. J'utilise un ordinateur portable Jupyter .



Nous enverrons une demande POST à ​​l'URL https://api.tinkoff.ru/v1/grouped_requests avec des paramètres sessionid et _methods et des donnéesDataData identiques.


import requests session_id = "b785Q2R5US2AZo2p5JoCtNQNkbmYsJbl.ds-api02" methods = "operations" #     , payments   params = {'sessionid': session_id, '_methods': methods} #      requestsData   requests_data = '[{"key":0,"operation":"operations","params":{"wuid":"28a44beaeee7460b94dbdd0aa0dc935a","account":"5059373083","start":1136062800000,"end":1529269199999}}]' data = {'requestsData': requests_data} response = requests.post('https://api.tinkoff.ru/v1/grouped_requests', params=params, data=data) 

Si nous avons tout fait correctement, la saisie de response.text dans la console affichera le corps de la réponse. Il reste à analyser ces données et à sauvegarder les fragments dont nous avons besoin.


 import csv operations = [] payload = response.json()['payload'] for key in payload: feed = payload[key]['payload'] for operation in feed: mcc = operation['mcc'] # MCC   < 100         if (mcc > 100): #     ,    if 'merchant' in operation: merchant_name = operation['merchant']['name'] else: merchant_name = operation['description'] #  accountAmount     «»  cost = operation['accountAmount']['value'] operations.append((mcc, cost, merchant_name)) print(mcc, cost, merchant_name) #    csv output = open("tinkoff.csv",'w') wr = csv.writer(output) for item in operations: wr.writerow(item) 

À la sortie, nous obtenons un tableau des codes MCC, des coûts d'achat et des noms de magasins.


Rocketbank


Rocketbank montre les transactions du MCC à la réception. Par conséquent, nous devons collecter des liens vers les reçus de toutes les opérations.



Avec Rocketbank un peu plus compliqué, car l'accès à votre compte personnel se fait uniquement via l'application mobile. Je ne parlerai que de ce qui a fonctionné pour moi, et seulement d'Android. Installez l'analyseur Charles sur l'ordinateur et faites passer le trafic depuis le téléphone.


Pour ce faire, le téléphone et l'ordinateur doivent être connectés au même réseau. Vous devrez connaître l'adresse IP de l'ordinateur sur le réseau local. Par exemple, en utilisant ifconfig .


Ensuite, configurez le téléphone pour qu'il fonctionne via le serveur proxy Charles. Dans Android 7.0, cela se fait dans les paramètres Wi-Fi en appuyant longuement sur le réseau connecté. Spécifiez l'adresse IP et le port 8888 de l'ordinateur, Charles par défaut.



Il va sans dire que l'application Rocketbank utilise TLS lors de l'interaction avec le serveur et nous ne pourrons pas écouter le trafic comme ça. Charles prend en charge l'interception du trafic avec la substitution d'un certificat TLS, c'est-à-dire qu'il implémente une attaque MITM. Cependant, pour cela, l'appareil doit faire confiance au certificat racine Charles.


Le certificat racine Charles est installé lorsque vous cliquez sur le lien https://chls.pro/ssl à partir d'un appareil mobile avec proxy activé. De plus, vous devez ajouter rocketbank.ru à la liste des hôtes mandatés dans Proxy -> Paramètres de proxy SSL .



Mais cela ne sera pas suffisant, car dans Android 7.0, par défaut, les applications ne font pas confiance aux autorités de certification des utilisateurs. La sécurité! L'application doit être compilée avec l'autorisation appropriée. Un obstacle? Pas une seule fois. Nous décompilons et compilons selon nos besoins.


Nous recevons d'abord le dossier de candidature par téléphone. Cela peut être fait en utilisant Android Debug Bridge ou l'application Apk Extractor . La première méthode sur Android 7.0 n'a pas fonctionné pour moi, et la seconde a fait face à la tâche.


Nous prenons le paquet sur l'ordinateur et décompilons en utilisant apktool .


 apktool d rocket.apk 

Vous devez ajouter le fichier de configuration de sécurité réseau le long du chemin res / xml / network_security_config.xml. Vous pouvez en savoir plus sur le format du fichier de configuration ici , mais les paramètres suivants nous suffisent:


 <network-security-config> <base-config> <trust-anchors> <!-- Always trust user added CAs --> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config> 

Ce fichier de configuration doit être spécifié dans le manifeste d'application (AndroidManifest.xml à la racine) en ajoutant le paramètre android: networkSecurityConfig à la balise d'application.


 <application android:networkSecurityConfig="@xml/network_security_config" android:allowBackup="false" ...>...</application> 

Compilez maintenant.


 apktool b rocket 

Il reste à signer l'application, car les applications non signées ne sont pas installées. Nous utilisons pour cela un programme de signature avec un certificat de test intégré .


 java -jar sign.jar rocket.apk 

Supprimez l'application Rocketbank d'origine du téléphone, copiez le package modifié sur le téléphone et installez-le (par exemple, via l'application «Fichiers»).


Maintenant, l'interception du trafic dans Charles devrait fonctionner. Ouvrez l'application Rocketbank, connectez-vous et regardez dans Charles. Le voici, notre lien vers le reçu.



Revenons à Python et simulons cette demande GET, ne perdez pas de temps dessus et demandez au serveur de nous fournir des données sur toutes les opérations. Eh bien, ou du moins vers le premier 999999.


 token = 'c8ccb54b-09e3-4608-a5b4-7914a92c21f3206582' params = {'token': token, 'page': 1, 'per_page': 999999} 

Il a été expérimentalement découvert que le serveur ne fait confiance à la session que si les bons x-device-id , x-time et x-sig ont été envoyés avec le jeton. Nous ne nous sentons pas désolés, car nous n'avons rien à inventer et à compter, copiez-le.


 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) 

Assez régulièrement pour retirer le MCC du reçu. Nous passons en revue les opérations, lisons le reçu, parcourons le calendrier régulier et tout ce dont nous avons besoin dans notre poche.


 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'] #    if cost < 0: receipt = requests.get(receipt_url) match = regex.search(receipt.text) if match is not None: mcc = match[1] operations.append((mcc, -cost, merchant_name)) print(mcc, -cost, merchant_name) else: #  MCC  ,      , #        MCC operations.append((merchant_name, -cost)) print(merchant_name, -cost) output = open("rocket.csv",'w') wr = csv.writer(output) for item in operations: wr.writerow(item) 

Vous pouvez peut-être supprimer l'application modifiée et réinstaller celle d'origine.


Total


En combinant les données de deux banques, en regroupant les opérations par MCC à l'aide d'un tableau croisé dynamique, en effaçant manuellement les données des transferts et des retraits d'espèces et en les regroupant dans des catégories similaires à certains endroits, j'ai obtenu l'image suivante:



Maintenant, en utilisant un service comme mcc-codes.ru , vous pouvez récupérer des cartes avec un cashback accru pour les catégories les plus chères. Et, en corrélant le montant du cashback possible avec le coût de la maintenance annuelle, déterminez s'il est conseillé d'établir une carte spécifique.


Quel en est l'avantage? Avec mes dépenses et la bonne sélection de cartes, je peux économiser 10 000 roubles par an. Est-ce que ça vaut le coup? Vous décidez :)

Source: https://habr.com/ru/post/fr414349/


All Articles