Obtenga estadísticas de costos de MCC: Tinkoff y Rocketbank


Introduccion


MCC (Código de categoría de comerciante): un código de categoría de comerciante utilizado en operaciones con tarjetas bancarias. Según este código, el banco determina qué producto ha comprado el cliente. Depende de él si le cobrarán un reembolso, una comisión o cancelarán el período de gracia.


En un siglo en el que las empresas ganan dinero con los datos recopilados de los usuarios, es un pecado no dar el paso inverso: utilizar los datos sobre sí mismos recopilados por las empresas para que, si no gana dinero con ellos, al menos ahorre.


Al saber cuánto gasta en cada código MCC, puede calcular qué tarjeta bancaria le brindará grandes beneficios. Por lo tanto, si ha utilizado las tarjetas Tinkoff o Rocketbank el tiempo suficiente, este artículo será útil para obtener estadísticas sobre los gastos de cada MCC.


Tinkoff


La cuenta personal de Tinkoff Bank muestra las operaciones de MCC cuando hace clic en ella.



Por lo tanto, puede ver una docena de operaciones, pero si necesitamos recopilar estadísticas durante todo el tiempo de uso de la tarjeta, este caso debe automatizarse. Intentemos obtener los datos en una forma conveniente para el procesamiento del software.


UPD: como señaló Smasher , su cuenta personal ofrece la posibilidad de cargar todas las operaciones en formato CSV o Excel. Entonces, debajo del spoiler, una descripción de cómo lo hice, sin saberlo.



Yendo por el camino difícil

Esto requerirá herramientas de desarrollo del navegador y, específicamente, análisis de la actividad de la red (pestaña Red en Google Chrome). Si enciende el analizador y luego solicita a su cuenta personal que muestre las operaciones "Para siempre", encontraremos rápidamente la solicitud deseada.



Puede notar que el servidor realmente proporcionó los datos todo el tiempo, y el MCC requerido está presente en la respuesta JSON.



Para la conveniencia del procesamiento de datos, simule una solicitud en Python. Estoy usando un cuaderno Jupyter .



Enviaremos una solicitud POST a la URL https://api.tinkoff.ru/v1/grouped_requests con idénticos parámetros sessionid y _methods y datos de RequestData .


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 hicimos todo bien, al ingresar response.text en la consola se mostrará el cuerpo de la respuesta. Queda por analizar estos datos y guardar los fragmentos que necesitamos.


 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) 

En la salida, obtenemos una tabla de códigos MCC, costos de compra y nombres de tiendas.


Rocketbank


Rocketbank muestra las transacciones de MCC en el recibo. Por lo tanto, necesitamos recopilar enlaces a los recibos de todas las operaciones.



Con Rocketbank un poco más complicado, porque el acceso a su cuenta personal se realiza solo a través de la aplicación móvil. Solo contaré sobre lo que funcionó para mí, y solo sobre Android. Instale el analizador Charles en la computadora y pase el tráfico del teléfono a través de él.


Para hacer esto, el teléfono y la computadora deben estar conectados a la misma red. Deberá averiguar la IP de la computadora en la red local. Por ejemplo, usando ifconfig .


Luego, configure el teléfono para que funcione a través del servidor proxy Charles. En Android 7.0, esto se hace en la configuración de Wi-Fi presionando prolongadamente en la red conectada. Especifique la IP de la computadora y el puerto 8888, el valor predeterminado de Charles.



No hace falta decir que la aplicación Rocketbank utiliza TLS cuando interactúa con el servidor y no podremos escuchar el tráfico de esa manera. Charles admite la intercepción de tráfico con la sustitución de un certificado TLS, es decir, implementa un ataque MITM. Sin embargo, para esto, el dispositivo debe confiar en el certificado raíz de Charles.


El certificado raíz de Charles se instala cuando hace clic en el enlace https://chls.pro/ssl desde un dispositivo móvil con proxy habilitado. Además, debe agregar rocketbank.ru a la lista de hosts proxy en Proxy -> Configuración de proxy SSL .



Pero esto no será suficiente, ya que en Android 7.0, por defecto, las aplicaciones no confían en las autoridades de certificación del usuario. Seguridad! La aplicación debe compilarse con el permiso correspondiente. Un obstáculo? Ni una sola vez Descompilamos y compilamos según sea necesario.


Primero recibimos el paquete de la aplicación desde el teléfono. Esto se puede hacer usando Android Debug Bridge o la aplicación Apk Extractor . El primer método en Android 7.0 no funcionó para mí, y el segundo hizo frente a la tarea.


Llevamos el paquete a la computadora y lo descompilamos usando apktool .


 apktool d rocket.apk 

Debe agregar el archivo de configuración de seguridad de red a lo largo de la ruta res / xml / network_security_config.xml. Puede leer más sobre el formato del archivo de configuración aquí , pero la siguiente configuración es suficiente para nosotros:


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

Este archivo de configuración debe especificarse en el manifiesto de la aplicación (AndroidManifest.xml en la raíz) agregando el parámetro android: networkSecurityConfig a la etiqueta de la aplicación.


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

Ahora compila.


 apktool b rocket 

Queda por firmar la aplicación, ya que las aplicaciones sin firmar no están instaladas. Usamos para esto un programa de firma con un certificado de prueba incorporado .


 java -jar sign.jar rocket.apk 

Retire la aplicación Rocketbank original del teléfono, copie el paquete modificado en el teléfono e instálelo (por ejemplo, a través de la aplicación "Archivos").


Ahora la intercepción de tráfico en Charles debería funcionar. Abra la aplicación Rocketbank, inicie sesión y busque en Charles. Aquí está, nuestro enlace al recibo.



Volvamos a Python y simulemos esta solicitud GET, simplemente no perdamos el tiempo y solicite al servidor que nos brinde datos sobre todas las operaciones. Bueno, o al menos sobre el primer 999999.


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

Se descubrió experimentalmente que el servidor confía en la sesión solo si se enviaron el x-device-id , x-time y x-sig correctos junto con el token. No sentimos pena, porque no tenemos que inventar y contar nada, solo cópielo.


 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) 

Con regularidad suficiente para extraer el MCC del recibo. Revisamos las operaciones, leemos el recibo, lo ejecutamos a través del horario regular y todo lo que necesitamos en nuestro bolsillo.


 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) 

Tal vez pueda eliminar la aplicación modificada e instalar la original nuevamente.


Total


Al combinar datos de dos bancos, agrupar operaciones por MCC utilizando una tabla dinámica, borrar manualmente los datos de transferencias y retiros de efectivo, y agruparlos en categorías similares en lugares, obtuve la siguiente imagen:



Ahora, utilizando un servicio como mcc-codes.ru , puede recoger tarjetas con mayor reembolso para las categorías más caras. Y, correlacionando la cantidad de reembolso posible con el costo del mantenimiento anual, determine si es aconsejable extraer una tarjeta específica.


¿Cuál es el beneficio de esto? Con mis gastos y la selección correcta de tarjetas, puedo ahorrar desde 10 mil rublos al año. ¿Vale la pena? Tu decides :)

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


All Articles