Ошибка Telegram-бота: «403: Forbidden: bots can’t send message to bots»

При попытке пополнения баланса через бота выбивает ошибку 403 Forbidden: bots can't send messages to bots.

    @bot.message_handler(commands=["dep"])
    def dep(mess):
        id=mess.from_user.id
        sum,name,log=checkReg(mess)
        if log:
            clava=types.InlineKeyboardMarkup()
            crypt=types.InlineKeyboardButton("Криптовалюта",callback_data="crypt")
            rubles=types.InlineKeyboardButton("Рубли",callback_data="rub")
            clava.add(crypt,rubles)
            bot.send_message(id,"Выберите способ пополнения",reply_markup=clava)
            @bot.callback_query_handler(func=lambda call:True)
            def opl(des):
                if des.data=="crypt":
                    clava1=types.InlineKeyboardMarkup()
                    ton=types.InlineKeyboardButton("TON",callback_data="TON")
                    usdt=types.InlineKeyboardButton("USDT",callback_data="usdt")
                    clava1.add(ton,usdt)
                    bot.send_message(des.from_user.id,"Выберите валюту(сеть-TON)",reply_markup=clava1)
                    @bot.callback_query_handler(func=lambda call:True)
                    def oplCr(crypt1):
                        id=crypt1.from_user.id
                        if crypt1.data=="TON":
                            bot.send_message(id,"Введите сумму, на которую хотите пополнить(1 TON=480):")
                            bot.register_next_step_handler(crypt1.message,ton1)
                        else:
                            bot.send_message(id,"Введите сумму, на которую хотите пополнить(1 USDT=180):")
                            bot.register_next_step_handler(crypt1.message,usdt1)
                    def ton1(mess):
                        with open('fDeps.txt','a+t') as fDep:
                            sum1,name,log=checkReg(mess)
                            id=mess.from_user.id
                            sum=int(mess.text)
                            bot.send_message(id,f"UQCxvHZCH6PFCfUF5wQ0CP45eH0qYt9r7MdVqRtmzSdYjmw8\nВы должны перевести{sum/480}TON на указанный адрес\nВ комментарии укажите свое имя\nПосле этого отправьте @dictatorgroup10 скриншот перевода и свое имя в боте")
                            fDep.write(name+" "+str(sum)+" "+str(sum/480)+" "+"TON")
                    def usdt1(mess):
                        with open('fDeps.txt','a+t') as fDep:
                            sum1,name,log=checkReg(mess)
                            id=mess.from_user.id
                            sum=int(mess.text)
                            bot.send_message(id,f"UQCxvHZCH6PFCfUF5wQ0CP45eH0qYt9r7MdVqRtmzSdYjmw8\nВы должны перевести{sum/180}USDT на указанный адрес\В комментарии укажите свое имя\nПосле этого отправьте @dictatorgroup10 скриншот перевода и свое имя в боте")
                            fDep.write(name+" "+str(sum)+" "+str(sum/180)+" "+"USDT"+"\n")
                else:
                    with open('fDeps.txt','a+t') as fDep:
                        sum1,name1,log1=checkReg(des.message)
                        bot.send_message(des.from_user.id,"Введите сумму, на которую хотите пополнить баланс")
                        bot.register_next_step_handler(des.message,rub)
                        def rub(mess):
                            sum=int(mess.text)
                            bot.send_message(des.from_user.id,f"https://vtb.paymo.ru/collect-money/qr/?transaction=1b01d439-c410-421d-a74c-9b8cf4067fff\nСовершите перевод на сумму{sum/2}\nВ сообщении получателю укажите имя в боте, иначе средства не поступят")
                            fDep.write(name+" "+str(sum)+" "+str(sum/2)+"RUB"+"\n")

Вопрос:
Почему возникает ошибка 403, и как правильно отправить пользователю сообщение?


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

Автор решения: Amgarak
«403: Forbidden: bots can’t send message to bots»

Ваш бот пытается отправить сообщение другому боту. Это невозможно, боты могут отправлять сообщения только пользователям.

bot.send_message(call.message.from_user.id, "Валюта...")

Меняем на:

bot.send_message(call.message.chat.id, "Валюта...")

Используйте chat.id, а не from_user.id.

chat.id будет == id пользователя с которым работает бот если общение идёт напрямую, или будет == id группы.

А вот from_user.id может содержать ID другого бота. Так как from_user.id — это ID отправитель сообщения. Если отправитель сообщения бот, то попытка отправки ему сообщения приведёт к ошибке 403.

В общем, безопаснее отправлять сообщения в чат из которого он был отправлен или проверять не бот ли это пишет?‍♀️

Проверить отправителя можно через from_user.is_bot - если отправитель бот, как вариант, такие сообщения можно игнорировать:

if call.message.from_user.is_bot:
    print("Игнорируем сообщение от бота")
    return
→ Ссылка