160 lines
5.6 KiB
Python
160 lines
5.6 KiB
Python
|
import telebot
|
|||
|
import requests
|
|||
|
import json
|
|||
|
import copy
|
|||
|
import time
|
|||
|
import threading
|
|||
|
from datetime import datetime
|
|||
|
|
|||
|
saved_points = []
|
|||
|
new_points = []
|
|||
|
history = []
|
|||
|
count = 0
|
|||
|
last_check = datetime.now()
|
|||
|
start_time = datetime.now()
|
|||
|
|
|||
|
TOKEN = ''
|
|||
|
|
|||
|
bot = telebot.TeleBot(TOKEN)
|
|||
|
|
|||
|
HELP = '''
|
|||
|
* start - приветствие.
|
|||
|
* help - напечатать справку по программе.
|
|||
|
* history - напечатать накопленную историю по банкоматам в которых были $.
|
|||
|
* show - напечатать банкоматы в которых на текущий момент есть $.
|
|||
|
* clear_history - очистить накопленную историю по банкоматам в которых были $.
|
|||
|
* statistics - метрика по программе.
|
|||
|
'''
|
|||
|
|
|||
|
id_chats = []
|
|||
|
|
|||
|
@bot.message_handler(commands=['start'])
|
|||
|
def echo(message):
|
|||
|
bot.send_message(message.chat.id, 'Данная программа позволяет в реальном времени (частота обновления данных 10 мин) получать информацию о наличии $ в банкоматах Тинькофф в г. Самара. Для получения справки введите команду: help')
|
|||
|
|
|||
|
@bot.message_handler(commands=['help'])
|
|||
|
def echo(message):
|
|||
|
bot.send_message(message.chat.id, HELP)
|
|||
|
|
|||
|
@bot.message_handler(commands=['clear_history'])
|
|||
|
def echo(message):
|
|||
|
global history
|
|||
|
history = []
|
|||
|
history.append(f'История была очищена: {datetime.now()}')
|
|||
|
bot.send_message(message.chat.id, 'История очищена')
|
|||
|
|
|||
|
@bot.message_handler(commands=['history'])
|
|||
|
def echo(message):
|
|||
|
global history
|
|||
|
if len(history) != 0:
|
|||
|
for item in history:
|
|||
|
bot.send_message(message.chat.id, item)
|
|||
|
else:
|
|||
|
bot.send_message(message.chat.id, 'История отсутствует')
|
|||
|
|
|||
|
@bot.message_handler(commands=['show'])
|
|||
|
def echo(message):
|
|||
|
global new_points
|
|||
|
if len(new_points) != 0:
|
|||
|
for point in new_points:
|
|||
|
decoded = json.loads(point)
|
|||
|
atmInfo = decoded['atmInfo']
|
|||
|
limits = atmInfo['limits']
|
|||
|
for limit in limits:
|
|||
|
if limit['currency'] == 'USD':
|
|||
|
bot.send_message(message.chat.id, f'{decoded["address"]} - Сумма: {limit["amount"]}$')
|
|||
|
else:
|
|||
|
bot.send_message(message.chat.id, 'На текущий момент в банкоматах отсутствуют $')
|
|||
|
|
|||
|
@bot.message_handler(commands=['statistics'])
|
|||
|
def echo(message):
|
|||
|
global count
|
|||
|
global start_time
|
|||
|
global last_check
|
|||
|
bot.send_message(message.chat.id, f'Дата запуска программы: {start_time}')
|
|||
|
bot.send_message(message.chat.id, f'Кол-во проверок банкоматов: {count}')
|
|||
|
bot.send_message(message.chat.id, f'Дата и время последней проверки банкоматов: {last_check}')
|
|||
|
bot.send_message(message.chat.id, f'Текущее время работы программы: {datetime.now() - start_time}')
|
|||
|
|
|||
|
def check():
|
|||
|
global saved_points
|
|||
|
global history
|
|||
|
global new_points
|
|||
|
global count
|
|||
|
global last_check
|
|||
|
saved_points = []
|
|||
|
request_body = {
|
|||
|
"bounds": {
|
|||
|
"bottomLeft": {
|
|||
|
"lat": 53.38178296125362,
|
|||
|
"lng": 49.99419620132086
|
|||
|
},
|
|||
|
"topRight": {
|
|||
|
"lat": 52.89227311754313,
|
|||
|
"lng": 50.84048678969975
|
|||
|
}
|
|||
|
},
|
|||
|
"filters": {
|
|||
|
"banks": [
|
|||
|
"tcs"
|
|||
|
],
|
|||
|
"showUnavailable": True,
|
|||
|
"currencies": [
|
|||
|
"USD"
|
|||
|
]
|
|||
|
},
|
|||
|
"zoom": 11
|
|||
|
}
|
|||
|
|
|||
|
url = 'https://api.tinkoff.ru/geo/withdraw/clusters'
|
|||
|
headers = {
|
|||
|
'content-type': 'application/json'
|
|||
|
}
|
|||
|
while True:
|
|||
|
try:
|
|||
|
response = requests.post(
|
|||
|
url,
|
|||
|
headers=headers,
|
|||
|
data=json.dumps(request_body)
|
|||
|
)
|
|||
|
except requests.ConnectionError:
|
|||
|
for id in id_chats:
|
|||
|
bot.send_message(id, 'ConnectionError. Waiting and resuming')
|
|||
|
time.sleep(10)
|
|||
|
continue
|
|||
|
|
|||
|
if (response.status_code == 200):
|
|||
|
response_content = response.content
|
|||
|
json_response = json.loads(response_content)
|
|||
|
payload = json_response['payload']
|
|||
|
clusters = payload['clusters']
|
|||
|
new_points = []
|
|||
|
for idx_cluster, cluster in enumerate(clusters):
|
|||
|
points = cluster['points']
|
|||
|
for idx_point, point in enumerate(points):
|
|||
|
new_points.append(json.dumps(point))
|
|||
|
difference = list(set(new_points) - set(saved_points))
|
|||
|
saved_points = copy.copy(new_points)
|
|||
|
for point in difference:
|
|||
|
decoded = json.loads(point)
|
|||
|
atmInfo = decoded['atmInfo']
|
|||
|
limits = atmInfo['limits']
|
|||
|
for limit in limits:
|
|||
|
if limit['currency'] == 'USD':
|
|||
|
for id in id_chats:
|
|||
|
bot.send_message(id, f'{decoded["address"]} - Сумма: {limit["amount"]}$')
|
|||
|
history.append(f'{datetime.now()}: {decoded["address"]} - Сумма: {limit["amount"]}$')
|
|||
|
count += 1
|
|||
|
last_check = datetime.now()
|
|||
|
time.sleep(600)
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
while True:
|
|||
|
try:
|
|||
|
my_thread = threading.Thread(target=check)
|
|||
|
my_thread.start()
|
|||
|
bot.polling(none_stop=True)
|
|||
|
except Exception as E:
|
|||
|
for id in id_chats:
|
|||
|
bot.send_message(id, f'Ошибка: {E}')
|