Skip to content

Instantly share code, notes, and snippets.

@SahaSG552
Forked from Ampa1R/index.js
Created March 9, 2022 10:02
Show Gist options
  • Save SahaSG552/ead1e72af3ae6e446bcc834006b8b089 to your computer and use it in GitHub Desktop.
Save SahaSG552/ead1e72af3ae6e446bcc834006b8b089 to your computer and use it in GitHub Desktop.
Оповещения о появлении $ в банкоматах тинькофф
/*
Актуальная информация есть в канале https://t.me/cashout_tinkoff_spb
Но там она публикуется с некоторой задержкой. Для оперативного получения информации можно использовать этот скрипт.
Для запуска требуется node.js
Перед запуском:
- Скопировать файл index.js и package.json
- Выполнить команду `npm i` в директории для установки зависимостей: axios, ms и node-notifier
- Ниже в коде указать нужные координаты для поиска банкоматов. По умолчанию указаны координаты для поиска по всем Петербурге
- Убедиться, что включены и разрешены уведомления
Для запуска выполнить команду `node index.js`, для остановки нажать `ctrl+c`
*/
const axios = require('axios')
const ms = require('ms');
const notifier = require('node-notifier');
// Границы, в которых нужно искать
const BOUNDS = {
bottomLeft: { // нижний левый угол зоны поиска
lat: 59.766238204568616, // Широта
lng: 30.037819928656514, // Долгота
},
topRight: { // верхний правый угол зоны поиска
lat: 60.10529265014078, // Широта
lng: 30.620781964789316, // Долгота
},
};
// Интервал запроса данных
const INTERVAL = '30s';
let atms = new Set();
// Запрашиваем список банкоматов из api тинькоффа
const fetchAtms = async () => {
const result = await axios.post(
'https://api.tinkoff.ru/geo/withdraw/clusters',
{
bounds: BOUNDS,
filters: {
banks: ['tcs'],
showUnavailable: false,
currencies: ['USD'], // Валюты, которые нас интересуют
},
zoom: 11,
}
);
return result.data;
};
// Сравниваем банкоматы из прошлого запроса с новыми
const syncAtms = (clusters) => {
const points = [];
clusters.forEach((cluster) => {
cluster.points.forEach((point) => {
points.push(point);
});
});
const newPoints = [];
const newAtms = new Set();
points.forEach((point) => {
if (!atms.has(point.id)) {
newPoints.push(point);
}
newAtms.add(point.id);
});
atms = newAtms;
return newPoints;
};
// Отправляем оповещение для каждого из банкомата
const notify = (atms) => {
atms.forEach((atm) => {
notifier.notify({
title: 'Found new ATM',
message: atm.address,
sound: false,
});
});
};
const checkAtms = async () => {
const result = await fetchAtms();
const newAtms = syncAtms(result.payload.clusters);
notify(newAtms);
};
const init = () => {
checkAtms(true);
setInterval(() => {
checkAtms(true);
}, ms(INTERVAL));
};
init();
{
"name": "tinkoff-atms",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"axios": "^0.26.0",
"ms": "^2.1.3",
"node-notifier": "^10.0.1"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment