Ошибка: "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)

Ответы (0 шт):