Task exception was never retrieved, KeyError: 'activationCost' как исправить
Если вкратце, по нажатию кнопки "Пополнить баланс" ничего не происходит, кнопка просто не реагирует на нажатие и выдаёт ошибку:
Traceback (most recent call last):
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/dispatcher.py", line 415, in _process_polling
_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/dispatcher.py", line 283, in process_update
return await self.callback_query_handlers.notify(update.callback_query)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
File "main.py", line 115, in pay
await callback.message.edit_text('� Выберите метод оплаты:', reply_markup=ikb_payment)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/types/message.py", line 2919, in edit_text
return await self.bot.edit_message_text(
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/bot/bot.py", line 3122, in edit_message_text
result = await self.request(api.Methods.EDIT_MESSAGE_TEXT, payload)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/bot/base.py", line 236, in request
return await api.make_request(await self.get_session(), self.server, self.__token, method, data, files,
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/bot/api.py", line 140, in make_request
return check_result(method, response.content_type, response.status, await response.text())
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/bot/api.py", line 115, in check_result
exceptions.BadRequest.detect(description)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/utils/exceptions.py", line 141, in detect
raise cls(description)
aiogram.utils.exceptions.BadRequest: There is no text in the message to edit
Ну а при нажатии кнопки выбора сервиса(любой страны) тоже ничего не происходит и появляется ошибка:
Traceback (most recent call last):
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/dispatcher.py", line 415, in _process_polling
_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/dispatcher.py", line 283, in process_update
return await self.callback_query_handlers.notify(update.callback_query)
File "/home/BOT/venv/lib/python3.8/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
File "main.py", line 275, in set_coontri
pricec = phone_number['activationCost']
KeyError: 'activationCost'
Вот код:
from aiogram import Bot, Dispatcher, types, executor
from aiogram.dispatcher.handler import CancelHandler
from aiogram.dispatcher.middlewares import BaseMiddleware
from config import *
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.dispatcher import FSMContext
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from database import *
from keybord import *
from smsactivate.api import SMSActivateAPI
from country import *
import requests
from aiocryptopay import AioCryptoPay, Networks
cryptopay = AioCryptoPay(token=api_cryptobot, network=Networks.MAIN_NET)
sms = SMSActivateAPI(api_sms)
storage = MemoryStorage()
bot = Bot(token, parse_mode='HTML')
dp = Dispatcher(bot, storage=storage)
async def set_default_commands(dp):
await dp.bot.set_my_commands([
types.BotCommand("start", "Запустить бота")
])
async def RUB():
data = requests.get('https://www.cbr-xml-daily.ru/daily_json.js').json()
return round(float(data['Valute']['USD']['Value']), 2)
class CheksSub(BaseMiddleware):
async def on_process_callback_query(self, callback: types.CallbackQuery, data: dict):
db_start()
if not user_exists(callback.from_user.id):
add_users(callback.from_user.id)
if await chec_shanel(channels=chanals, user=callback.from_user.id):
pass
else:
await bot.delete_message(callback.from_user.id, callback.message.message_id)
await callback.message.answer('<b>Для того, чтобы получить полный доступ , необходимо подписаться на канал ?</b>', reply_markup=show_canals())
raise CancelHandler
async def on_process_message(self, message: types.Message, data: dict):
db_start()
if not user_exists(message.from_user.id):
add_users(message.from_user.id)
if await chec_shanel(channels=chanals, user=message.from_user.id):
pass
else:
await message.answer('<b>Для того чтобы пользоваться нашим ботом, подпишитесь на каналы</b>',
reply_markup=show_canals())
raise CancelHandler
#Проверка подписки
async def chec_shanel(channels, user):
for channal in channels:
chat_member = await bot.get_chat_member(chat_id=channal[1], user_id=user)
if chat_member['status'] == 'left':
return False
return True
@dp.callback_query_handler(text='stop_input', state='*')
async def stop_input(callback: types.CallbackQuery, state: FSMContext):
if state is None:
return
await state.finish()
await callback.message.answer('Вы вышли из режима ввода данных')
@dp.message_handler(commands=['Start'], state='*')
async def cmd_start(message: types.Message, state: FSMContext):
await state.finish()
if message.chat.type == 'private':
db_start()
await bot.send_message(chat_id=message.from_user.id,
text='?<b>Добро пожаловать в R.T.D SMS!</b>\n'
'?<b>Арендуйте анонимный или виртуальный номер в Telegram</b>\n'
'❓<b>Есть вопросы? Свяжитесь с нашей поддержкой!</b>\n', reply_markup=kb, parse_mode='HTML')
if not user_exists(message.from_user.id):
add_users(message.from_user.id)
@dp.message_handler(text='? Мой профиль')
async def profile(message: types.Message):
with open('/home/BOT/photo/profile.jpeg', 'rb') as photo:
balance = chek_balance(message.from_user.id)
await message.answer_photo(photo=types.InputFile(photo), caption=f'? <b>Личный кабинет {message.from_user.first_name}</b>\n\n'
f'? <b>ID:</b> <code>{message.from_user.id}</code>\n'
f'? <b>Баланс:</b> <code>{float(balance[0])}</code> Руб', parse_mode='HTML', reply_markup=ikb_money)
@dp.callback_query_handler(text='back')
async def pay(callback: types.CallbackQuery):
await callback.message.edit_text(
text='? <b>Добро пожаловать в R.T.D SMS!</b>\n' '? <b>Арендуйте анонимный или виртуальный номер в Telegram с максимальным удобством.</b>\n' '❓ <b>Есть вопросы? Свяжитесь с нашей поддержкой!</b>\n', parse_mode='HTML')
@dp.callback_query_handler(text='go_pay')
async def pay(callback: types.CallbackQuery):
await callback.message.edit_text('? Выберите метод оплаты:', reply_markup=ikb_payment)
class User_pay(StatesGroup):
amount = State()
@dp.callback_query_handler(text='go_crypto')
async def pay(callback: types.CallbackQuery):
await callback.message.edit_text('? Укажите сумму пополнения.\n'
'? Минимальная сумма пополнения: 0.1$.')
await User_pay.amount.set()
@dp.message_handler(state=User_pay.amount)
async def fsm(message:types.Message, state:FSMContext):
async with state.proxy() as data:
data['amount'] = message.text
invoce = await cryptopay.create_invoice(asset='USDT',
amount=float(data['amount']),
description='Пополнение баланса')
await message.answer(f'? Сумма к оплате: {data["amount"]}$\n'
f'? Пополнять в USDT (TRC-20).', reply_markup=oplata_kb(id=invoce.invoice_id, url=invoce.bot_invoice_url, price=invoce.amount))
await state.finish()
@dp.callback_query_handler(text_startswith='check')
async def cheks(callback: types.CallbackQuery):
id_pay = callback.data.split('|')[1]
amount = callback.data.split('|')[2]
kurs = await RUB()
res = int(kurs) * int(amount)
invoce = await cryptopay.get_invoices('USDT', int(id_pay))
if invoce.status != 'paid':
await callback.answer('❌ Счет не оплачен!', show_alert=True)
else:
add_balances(callback.from_user.id, res)
await callback.message.edit_text(f'Счет успешно оплачен, на баланс зачислено {res} Руб')
await bot.send_message(ADMIN, f'Пользователь @{callback.from_user.username} успешно пополнил баланс на сумму {res}р')
@dp.callback_query_handler(text='done')
async def chek_subs(callback:types.CallbackQuery):
await callback.message.delete()
if await chec_shanel(channels=chanals, user=callback.from_user.id):
await callback.message.answer('<b>Добро пожаловать ❗️</b>', reply_markup=kb)
@dp.callback_query_handler(text_contains ='next_c', state='*')
async def next_country(call: types.CallbackQuery):
i = call.data.split('|')[1]
await call.message.edit_text(text= '<b>? Выберите страну:</b>', reply_markup=countryes(int(i)), parse_mode='HTML')
@dp.message_handler(text='?☠️Анонимные номера')
async def anonymous_numbers(message: types.Message):
# Открываем файл с изображением
with open('/home/BOT/photo/anon.jpeg', 'rb') as photo:
# Отправляем сообщение с прикрепленным изображением и моноширинным текстом
await message.answer_photo(
photo=types.InputFile(photo),
caption=(
"<b>Здравствуйте! Спасибо за ваш запрос.</b>\n\n"
"<b>На данный момент автоматическая выдача анонимных номеров недоступна.</b>"
"<b>Тем не менее, вы можете приобрести их вручную через помощника.</b>\n\n"
"<b>Не волнуйтесь, мы уже работаем над тем, чтобы сделать анонимные номера доступными автоматически как можно скорее.</b>\n\n"
"<b>Спасибо за ваше понимание!</b> ?"
),
reply_markup=types.InlineKeyboardMarkup().add(
types.InlineKeyboardButton("Арендовать вручную", url="YOUR_USER_URL")
),
parse_mode=types.ParseMode.HTML
)
@dp.message_handler(text="Поддержка")
async def support_command(message: types.Message):
# Отправка фото с кнопкой
with open('/home/BOT/photo/support.jpeg', 'rb') as photo:
await message.answer_photo(
photo=types.InputFile(photo),
reply_markup=InlineKeyboardMarkup().add(
InlineKeyboardButton(
'Написать поддержке',
url='YOUR_USER_URL'
)
)
)
@dp.message_handler(text='? Виртуальные номера', state='*')
async def sms_go(message: types.Message):
await message.answer(f'<b>? Выберите страну:</b>', reply_markup=countryes(0), parse_mode='HTML')
# @dp.message_handler(text='? Наши проекты', state='*')
# async def sms_go(message: types.Message):
# await message.answer('')
@dp.callback_query_handler(text_startswith='set_c|')
async def set_coontri(callback: types.CallbackQuery, state:FSMContext):
strana = callback.data.split("|")[2]
await callback.message.edit_text(f'? <b>Страна:</b>{strana}\n'
f'? <b>Выберите сервис:</b>', reply_markup=service(0, strana=strana), parse_mode='HTML')
@dp.callback_query_handler(text_contains ='next_s', state='*')
async def next_country(call: types.CallbackQuery):
text = call['message']['text']
text = ''.join(text)
text = text.split('\n')[0]
i = call.data.split('|')[1]
text = text.split(':')[1]
await call.message.edit_text(text=f'? <b>Страна:</b>{text}\n? Выберите сервис', reply_markup=service(int(i), strana=text), parse_mode='HTML')
@dp.callback_query_handler(text_startswith='set_s_|')
async def set_coontri(callback: types.CallbackQuery, state:FSMContext):
strana = callback.data.split('|')[3]
kod_service = callback.data.split('|')[1]
servise_kod = []
for u, p in name_service.items():
if p == int(kod_service):
servise_kod.append(u)
name = []
for n, z in full_name.items():
if n == int(kod_service):
name.append(z)
name = ''.join(name)
kod_strana = []
for m, s in COUNRTY.items():
if s == strana:
kod_strana.append(m)
info = sms.getPrices(servise_kod[0], kod_strana[0])
for q, r in info.items():
cost = f'{q}:{r[servise_kod[0]]["cost"]}'
counter = f'{q}:{r[servise_kod[0]]["count"]}'
price = cost.split(':')[1]
count = counter.split(":")[1]
phone_number = sms.getNumberV2(service=servise_kod[0], country=kod_strana[0])
pricec = phone_number['activationCost']
number_phone = phone_number['phoneNumber']
result = float(pricec) + float(PRICE)
if count == '0':
await callback.answer('Номера закончились', show_alert=True)
else:
await callback.message.edit_text(f'? <b>Страна:</b> {strana}\n'
f'? <b>Сервис:</b> {name}\n\n'
f'☎ <b>Номер телефона:</b> <code>{number_phone}</code>\n'
f'<b>? Стоимость активации:</b> {float(result)} Руб.\n'
f'<b>? Доступное количество:</b> {count} шт\n'
f'<b>⌛ Время активации:</b> 20 минут.\n\n'
f'<b>Скопируйте номер телефона, вставьте его в ваш сервис для регистрации и нажмите ? Получить код</b>' , parse_mode='HTML', reply_markup= await service_number(number_phone, phone_number['activationId'], int(result)))
# await callback.answer('Номера закончились', show_alert=True)
@dp.callback_query_handler(text_startswith='phone')
async def phone_go(callback:types.CallbackQuery):
price = callback.data.split('|')[3]
id = callback.data.split('|')[2]
number = callback.data.split('|')[1]
phone_number = sms.getActiveActivations()
print(phone_number['activeActivations'])
for i in range(len(phone_number)):
if phone_number['activeActivations'][i]['phoneNumber'] == number:
sms_code = phone_number['activeActivations'][i]['smsCode']
await callback.message.edit_text(f'Ваш смс код: <code>{sms_code}</code>\n'
f'Номер телефона: <code>{number}</code>', parse_mode='HTML', reply_markup=sms_replay(number, id, price))
@dp.callback_query_handler(text_startswith='go_sms')
async def phone_go(callback:types.CallbackQuery):
try:
await callback.message.delete()
price = callback.data.split('|')[3]
id = callback.data.split('|')[2]
number = callback.data.split('|')[1]
phone_number = sms.getActiveActivations()
for i in range(len(phone_number)):
if phone_number['activeActivations'][i]['phoneNumber'] == number:
sms_code = phone_number['activeActivations'][i]['smsCode']
if sms_code == None:
await callback.message.answer(f'Ваш смс код: <code>{sms_code}</code>\n\n'
f'Номер телефона: <code>{number}</code>', parse_mode='HTML', reply_markup=sms_replay(number, id, price))
else:
await callback.message.answer(f'Ваш смс код: <code>{sms_code[0]}</code>', parse_mode='HTML', reply_markup=sms_replay(number, id, price))
except Exception:
await callback.message.delete()
price = callback.data.split('|')[3]
number = callback.data.split('|')[1]
id = callback.data.split('|')[2]
phone_number = sms.getActiveActivations()
for i in range(len(phone_number)):
if phone_number['activeActivations'][0]['phoneNumber'] == number:
sms_code = phone_number['activeActivations'][0]['smsCode']
if sms_code == None:
await callback.message.answer(f'Ваш смс код: <code>{sms_code}</code>\n\n'
f'Номер телефона: <code>{number}</code>', parse_mode='HTML',
reply_markup=sms_replay(number, id))
else:
await callback.message.answer(f'Ваш смс код: <code>{sms_code[0]}</code>', parse_mode='HTML', reply_markup=sms_replay(number, id, price))
@dp.callback_query_handler(text_startswith='okay')
async def phone_go(callback:types.CallbackQuery):
price = callback.data.split('|')[3]
number = callback.data.split('|')[1]
id = callback.data.split('|')[2]
status = sms.setStatus(id=id, forward=number, status=8)
if status == 'EARLY_CANCEL_DENIED':
await callback.answer('Нельзя отменить номер в первые 2 минуты', show_alert=True)
else:
await callback.message.edit_text('Активации успешно отменена')
@dp.callback_query_handler(text_startswith='nkay')
async def phone_go(callback:types.CallbackQuery):
price = callback.data.split('|')[3]
number = callback.data.split('|')[1]
id = callback.data.split('|')[2]
status = sms.setStatus(id=id, forward=number, status=6)
if status == 'ACCESS_ACTIVATION':
await callback.message.edit_text('Сервис успешно активирован')
minus_balance(callback.from_user.id, int(price))
@dp.callback_query_handler(text_startswith='not')
async def phone_go(callback:types.CallbackQuery):
price = callback.data.split('|')[3]
number = callback.data.split('|')[1]
id = callback.data.split('|')[2]
status = sms.setStatus(id=id, forward=number, status=8)
if status == 'ACCESS_CANCEL':
await callback.message.edit_text('Активации успешно отменена')
async def on_startup(_):
await set_default_commands(dp)
print('Bot started')
if __name__ == '__main__':
dp.middleware.setup(CheksSub())
executor.start_polling(dp, skip_updates=True, on_startup=on_startup)```