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}')