احصل على إحصائيات تكلفة مركز عملائي: تينكوف و روكيت بانك


مقدمة


MCC (رمز فئة التاجر) - رمز فئة التاجر المستخدم في العمليات باستخدام البطاقات المصرفية. وفقًا لهذا الرمز ، يحدد البنك المنتج الذي اشتراه العميل. يعتمد الأمر على ما إذا كانوا سيطالبونك باسترداد نقدي أو عمولة أو إلغاء فترة السماح.


في قرن عندما تجني الشركات أموالًا من البيانات التي يتم جمعها من المستخدمين ، فمن الخطأ عدم استخدام الحركة العكسية: استخدم البيانات عن نفسها التي جمعتها الشركات بحيث ، إذا لم تقم بجني الأموال عليها ، على الأقل توفيرها.


بمعرفة المبلغ الذي تنفقه على كل رمز مركز عملائي ، يمكنك حساب البطاقة المصرفية التي ستجلب فوائد رائعة. لذلك ، إذا كنت قد استخدمت بطاقات Tinkoff أو Rocketbank وقتًا كافيًا ، فستكون هذه المقالة مفيدة للحصول على إحصائيات حول الإنفاق لكل مركز عملائي.


تينكوف


يظهر الحساب الشخصي لبنك Tinkoff عمليات مركز عملائي عند النقر فوقه.



حتى تتمكن من رؤية عشرات العمليات ، ولكن إذا احتجنا إلى جمع إحصائيات طوال فترة استخدام البطاقة ، فيجب أن تكون هذه الحالة تلقائية. دعونا نحاول الحصول على البيانات في شكل مناسب لمعالجة البرامج.


UPD: كما أشار Smasher ، يوفر حسابك الشخصي القدرة على تحميل جميع العمليات بتنسيق CSV أو Excel. لذلك ، تحت المفسد وصف لكيفية فعل ذلك ، دون معرفة ذلك.



الذهاب بالطريقة الصعبة

سيتطلب ذلك أدوات تطوير المتصفح ، وتحديدًا تحليل نشاط الشبكة (علامة تبويب الشبكة في Google Chrome). إذا قمت بتشغيل المحلل ثم طلبت من حسابك الشخصي عرض عمليات "لكل الوقت" ، فسوف نجد بسرعة الطلب المطلوب.



يمكنك ملاحظة أن الخادم أعطى البيانات حقًا طوال الوقت ، وأن مركز عملائي المطلوب موجود في استجابة JSON.



لتسهيل معالجة البيانات ، قم بمحاكاة طلب في Python. أنا أستخدم مفكرة Jupyter .



سنرسل طلب POST إلى عنوان URL https://api.tinkoff.ru/v1/grouped_requests مع معلمات جلسة العمل و _methods متطابقة وبيانات dataData .


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) 

إذا فعلنا كل شيء بشكل صحيح ، فسيؤدي إدخال response.text في وحدة التحكم إلى عرض نص الاستجابة. يبقى تحليل هذه البيانات وحفظ الأجزاء التي نحتاجها.


 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) 

عند الإخراج ، نحصل على جدول رموز مركز عملائي ، وتكاليف الشراء وأسماء المتاجر.


روكت بانك


يعرض Rocketbank معاملات MCC عند الاستلام. لذلك ، نحتاج إلى جمع روابط لإيصالات جميع العمليات.



مع Rocketbank أكثر تعقيدًا قليلاً ، لأن الوصول إلى حسابك الشخصي يتم فقط من خلال تطبيق الهاتف المحمول. سأخبر فقط عن ما نجح معي ، وعن Android فقط. قم بتثبيت محلل تشارلز على الكمبيوتر وتمرير حركة المرور من الهاتف من خلاله.


للقيام بذلك ، يجب توصيل الهاتف والكمبيوتر بنفس الشبكة. ستحتاج إلى معرفة IP للكمبيوتر على الشبكة المحلية. على سبيل المثال ، باستخدام ifconfig .


بعد ذلك ، قم بتكوين الهاتف للعمل من خلال خادم وكيل Charles. في Android 7.0 ، يتم ذلك في إعدادات Wi-Fi من خلال الضغط لفترة طويلة على الشبكة المتصلة. حدد IP الخاص بالكمبيوتر والمنفذ 8888 ، الافتراضي تشارلز.



وغني عن القول أن تطبيق Rocketbank يستخدم TLS عند التفاعل مع الخادم ولن نتمكن من الاستماع إلى حركة المرور بهذه الطريقة. تشارلز يدعم اعتراض حركة المرور عن طريق استبدال شهادة TLS ، أي أنها تنفذ هجوم MITM. ومع ذلك ، لهذا يجب أن يثق الجهاز في شهادة جذر تشارلز.


يتم تثبيت شهادة Charles root عند النقر فوق الرابط https://chls.pro/ssl من جهاز محمول مع تمكين الوكيل. بالإضافة إلى ذلك ، تحتاج إلى إضافةocketbank.ru إلى قائمة المضيفين الذين تم تشغيلهم عبر وكيل في Proxy -> SSL Proxying Settings .



ولكن هذا لن يكون كافيًا ، نظرًا لأنه في نظام التشغيل Android 7.0 ، بشكل افتراضي ، لا تثق التطبيقات بسلطات اعتماد المستخدم. الأمان! يجب أن يتم ترجمة الطلب بالإذن المناسب. عقبة؟ ليس مرة واحدة. نحن نترجم ونجمع ما نحتاج إليه.


أولاً نحصل على حزمة التطبيق من الهاتف. يمكن القيام بذلك باستخدام Android Debug Bridge أو تطبيق Apk Extractor . لم تعمل الطريقة الأولى على Android 7.0 ، والثانية تعاملت مع المهمة.


نأخذ الحزمة إلى الكمبيوتر ونقوم بفكها باستخدام apktool .


 apktool d rocket.apk 

يجب عليك إضافة ملف تكوين أمان الشبكة على المسار res / xml / network_security_config.xml. يمكنك قراءة المزيد حول تنسيق ملف التكوين هنا ، ولكن الإعدادات التالية كافية بالنسبة لنا:


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

يجب تحديد ملف التكوين هذا في بيان التطبيق (AndroidManifest.xml في الجذر) عن طريق إضافة معلمة android: networkSecurityConfig إلى علامة التطبيق.


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

ترجمة الآن.


 apktool b rocket 

يبقى التوقيع على التطبيق ، حيث لم يتم تثبيت التطبيقات غير الموقعة. نستخدم لهذا برنامج توقيع بشهادة اختبار مضمنة .


 java -jar sign.jar rocket.apk 

قم بإزالة تطبيق Rocketbank الأصلي من الهاتف ، وانسخ الحزمة المعدلة إلى الهاتف وقم بتثبيتها (على سبيل المثال ، من خلال تطبيق "الملفات").


الآن يجب أن يعمل اعتراض حركة المرور في تشارلز. افتح تطبيق Rocketbank وسجل الدخول وابحث في Charles. ها هو ، وصلتنا إلى الإيصال.



دعنا نعود إلى Python ومحاكاة طلب GET هذا ، فقط لا تضيع الوقت عليه واطلب من الخادم تزويدنا ببيانات حول جميع العمليات. حسنًا ، أو على الأقل حوالي 999999.


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

وقد تم تجريبياً اكتشاف أن الخادم لا يثق في الجلسة إلا إذا تم إرسال معرّف x-device-id و x-time و x-sig مع الرمز المميز. نحن لا نشعر بالأسف ، لأننا لسنا مضطرين لاختراع وإحصاء أي شيء ، فقط قم بنسخه.


 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) 

بانتظام ما يكفي لسحب مركز عملائي من الإيصال. نراجع العمليات ونقرأ الإيصال ونجريها من خلال الجدول الزمني المنتظم وكل ما نحتاجه في جيبنا.


 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) 

ربما يمكنك حذف التطبيق المعدل وتثبيت التطبيق الأصلي مرة أخرى.


المجموع


من خلال دمج البيانات من بنكين ، وتجميع العمليات بواسطة مركز عملائي باستخدام جدول محوري ، ومسح البيانات يدويًا من التحويلات والسحب النقدي ، وتجميعها في فئات مماثلة في الأماكن ، حصلت على الصورة التالية:



الآن ، باستخدام خدمة مثل mcc-codes.ru ، يمكنك التقاط بطاقات مع استرداد نقدي متزايد للفئات الأغلى. وربط مبلغ استرداد النقود المحتمل بتكلفة الصيانة السنوية ، حدد ما إذا كان من المستحسن وضع بطاقة معينة.


ما فائدة هذا؟ مع نفقاتي والاختيار الصحيح للبطاقات ، يمكنني توفير 10 آلاف روبل في السنة. هل يستحق ذلك؟ أنت تقرر :)

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


All Articles