Ошибка: "chat not found" в Телеграм-боте
Задача: Телеграм-бот должен проверять список открытых ордеров и при его изменении отправлять уведомление о новом ордере.
Проблема кроется вот в этом фрагменте:
@bot.message_handler(content_types=["text"])
def background_check():
while True:
check_for_new_orders()
time.sleep(SLEEP_TIME)
# Запуск фоновой проверки в отдельном потоке
threading.Thread(target=background_check, daemon=True).start()
Весь остальной функционал кода выполняется без ошибок, но отправлять уведомления без запроса к боту он не хочет:
A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: chat not found
Код:
import telebot
import time
import requests
import hmac
import hashlib
import json
import urllib.parse
from telebot import types
import threading
# Используем API ключи и токен бота
exmo_api_key = "???????" # Замените на ваш API ключ
exmo_api_secret = "?????".encode() # Замените на ваш API секрет
bot_token = "?????" # Замените на ваш токен
my_telegram_id = "?????" # Замените на ваш Telegram ID
SLEEP_TIME = 10 # Задержка между запросами
bot = telebot.TeleBot(bot_token)
# Хранение предыдущих ордеров
previous_orders = {}
# Функция для получения информации о пользователе
def get_user_info():
url = "https://api.exmo.me/v1.1/user_info"
payload = {'nonce': int(round(time.time() * 1000))}
# Генерация подписи
payload_str = urllib.parse.urlencode(payload)
sign = hmac.new(exmo_api_secret, payload_str.encode('utf-8'), hashlib.sha512).hexdigest()
headers = {
"Content-Type": "application/x-www-form-urlencoded",
"Key": exmo_api_key,
"Sign": sign
}
response = requests.post(url, data=payload_str, headers=headers)
if response.status_code != 200:
raise Exception(f"Ошибка API: {response.status_code} {response.text}")
return response.json()
# Функция для получения открытых ордеров
def get_open_orders():
url = "https://api.exmo.me/v1.1/user_open_orders"
payload = {'nonce': int(round(time.time() * 1000))}
# Генерация подписи
payload_str = urllib.parse.urlencode(payload)
sign = hmac.new(exmo_api_secret, payload_str.encode('utf-8'), hashlib.sha512).hexdigest()
headers = {
"Content-Type": "application/x-www-form-urlencoded",
"Key": exmo_api_key,
"Sign": sign
}
response = requests.post(url, data=payload_str, headers=headers)
if response.status_code != 200:
raise Exception(f"Ошибка API: {response.status_code} {response.text}")
return response.json()
# Функция для проверки новых ордеров
def check_for_new_orders():
global previous_orders
current_orders = get_open_orders()
if isinstance(current_orders, dict):
new_orders= {}
for pair, orders in current_orders.items():
if orders: # Проверка на наличие ордеров
for order in orders:
order_id = order['order_id']
if order_id not in previous_orders.get(pair, {}):
if pair not in new_orders:
new_orders[pair] = []
new_orders[pair].append(order)
# Обновляем предыдущие ордера
previous_orders = current_orders
# Отправляем уведомления о новых ордерах
for pair, orders in new_orders.items():
for order in orders:
notification_text = (f"Новый ордер {order['pair']}:\n"
f"Сумма сделки: {order['amount']}\n"
f"Количество: {order['quantity']}\n"
f"Цена: {order['price']}\n"
f"Тип: {order['type']}\n"
f"--------------------------\n")
bot.send_message(my_telegram_id, notification_text)
# Обработчик команды /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
# Создаем кнопки для получения балансов и открытых ордеров
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
button_balances = types.KeyboardButton("Показать балансы")
button_orders = types.KeyboardButton("Показать открытые ордера")
markup.add(button_balances, button_orders)
bot.send_message(message.chat.id, "Добро пожаловать! Нажмите кнопку ниже, чтобы получить информацию.", reply_markup=markup)
# Обработчик текстовых сообщений
@bot.message_handler(func=lambda message: True)
def handle_message(message):
if message.text == "Показать балансы":
try:
user_info = get_user_info()
print(user_info) # Выводим ответ от API для диагностики
if isinstance(user_info, dict):
text = "--=( БАЛАНС НА СЧЕТАХ )=--\n __________________________\n"
balances = user_info.get('balances', {})
reserved = user_info.get('reserved', {})
for currency, amount in balances.items():
if float(amount) > 0:
text += f"Баланс {currency}: {amount}\n"
for currency, amount in reserved.items():
if float(amount) > 0:
text += f"В ордерах {currency}: {amount}\n"
if text == "--=( БАЛАНС НА СЧЕТАХ )=--\n __________________________\n":
text += "Нет ненулевых балансов.\n"
print(text)
bot.send_message(message.chat.id, text)
else:
raise Exception(f"Неправильный формат ответа: {type(user_info)}")
except Exception as e:
print(f"Произошла ошибка: {e}")
bot.send_message(message.chat.id, f"Произошла ошибка: {e}")
elif message.text == "Показать открытые ордера":
try:
open_orders = get_open_orders()
print(open_orders) # Выводим ответ от API для диагностики
if isinstance(open_orders, dict):
text = "--=( ОТКРЫТЫЕ ОРДЕРА )=--\n __________________________\n"
for pair, orders in open_orders.items():
if orders: # Проверка на наличие ордеров
for order in orders:
# Форматируем вывод ордера в нужном формате
text += f"Ордер {order['pair']}:\n Сумма сделки: {order['amount']}\n Количество: {order['quantity']}\n Цена: {order['price']}\n Тип: {order['type']}\n--------------------------\n"
if text == "--=( ОТКРЫТЫЕ ОРДЕРА )=--\n __________________________\n":
text += "Нет открытых ордеров.\n"
bot.send_message(message.chat.id, text)
else:
raise Exception(f"Неправильный формат ответа: {type(open_orders)}")
except Exception as e:
print(f"Произошла ошибка: {e}")
bot.send_message(message.chat.id, f"Произошла ошибка: {e}")
```
#Фоновая проверка новых ордеров
@bot.message_handler(content_types=["text"])
def background_check():
while True:
check_for_new_orders()
time.sleep(SLEEP_TIME)
# Запуск фоновой проверки в отдельном потоке
threading.Thread(target=background_check, daemon=True).start()
```
# Запускаем бота
bot.polling(none_stop=True)