Я пользуюсь Дзенмани (https://zenmoney.ru/) для учета расходов. Меня это приложение всем устраивает, но не хватает там подкачки траназкций из самого сбер спасибо.
Подкачка событий о карте работает по СМС-кам, а вот стягивать кешбечные транзакции не выходит.
Учитывая, что сберспасибо мне капает достаточно много и операций по ним у меня уже приличное количество (самокат, купер, мегамаркет), я решил себе сделать интеграцию.
Как стягивать данные
Теория
Для стягивания данных пойду по пути подключения к уже включенному браузеру. Авторизация в сбере не из простых и её реализовывать на уровне апишек будет крайне непросто.
Поэтому просто беру отдельный браузер на моем рабочем компе, запущенный с уже проведенной руками авторизацией и стягиваю данные.
Если авторизация слетит, то я руками также спокойно её проделаю на компе и интеграция заработает дальше.
Страница, которая будет парситься — https://spasibosberbank.ru/lk_history
Формат данных
Надо будет реагировать на события XHR запросов к адресу
https://spasibosberbank.ru/api/online/personal/loyalitySystem/transactions?page=1&cnt=100
100штук мне хватит, учитывая что стягивание транзакций будет происходить раз в сутки, а за сутки больше 100шт я не наберу.
Нужные поля уже выявлены. Выделил их на скрине красным
Первый успешный запуск и получение данных
По инструкции отсюда запустил браузер и запустил код для получения данных. Данные стягиваются успешно. Код для стягивания данных:
public async fetchTransactions(): Promise { const browser = await this.puppeteerService.getLocalBrowser(); const page = await browser.newPage(); try { const promise = new Promise((resolve, reject) => { page.on('response', async (response) => { const url = response.url(); if ( url.includes( `https://spasibosberbank.ru/api/online/personal/loyalitySystem/transactions`, ) ) { if (response.status() === 200) { const data = await response.json(); this.logger.log(`Data. ${data.data.length}`); resolve(data.data); } else { this.logger.log(`Error in fetching data`, response); reject(new Error('Error in fetching data')); } } }); }); await page.goto('https://spasibosberbank.ru/lk_history'); await page.waitForSelector('.lk-history-list__transactions'); const data = await promise; await page.close(); return data; } catch (error) { this.logger.error(error); await page.close(); throw error; } }
Сначала надо не забыть запустить сам браузер и разово там войти в спасибо сберовский, чтобы дальше уже использовалась подключенная авторизация.
Обработку ошибок, устаревание сессии и другое пока не делал. Как поймаю такую ошибку - буду думать как отлавливать её.