TypeError: 'NoneType' object is not subscriptable Телеграмм бот
Не могу понять причину выхода ошибки в консоль после любого нажатия в боте, нажимаю статистика выходит ошибка и бот выключается. Вот сама ошибка
\main.py", line 176, in messages
if str(chat_id) in row[3] or str(chat_id) in row[4]:
TypeError: 'NoneType' object is not subscriptable
Я перешел в файл на и нашел строку 176 вот она.
if str(chat_id) in row[3] or str(chat_id) in row[4]:
Давайте я Вам скину часть кода от которая идет над ошибкой и под ошибкой.
@bot.message_handler(content_types=['text'])
def messages(message):
chat_id = message.chat.id
global kk
if kk == 0:
start_bot()
msg = message.text
if message.chat.type == 'private':
conn = sqlite3.connect('main.db')
cursor = conn.cursor()
row = cursor.execute(f'SELECT * FROM users WHERE user_id = "{chat_id}"').fetchall()
if len(row) == 0:
username = message.chat.username
try:
cursor.execute(f'INSERT INTO users VALUES ("{chat_id}", "{username.lower()}", "User", "0", "0", "0", "0", "0")')
except:
cursor.execute(f'INSERT INTO users VALUES ("{chat_id}", "{username}", "User", "0", "0", "0", "0", "0")')
conn.commit()
row = cursor.execute(f'SELECT * FROM settings WHERE id = 1').fetchone()
if message.chat.type == 'private':
if str(chat_id) in row[3] or str(chat_id) in row[4]:
if msg == 'Статистика':
bot.send_message(chat_id, 'Собираю информацию...')
rows = cursor.execute(f'SELECT * FROM users').fetchall()
bal1 = 0
bal2 = 0
bal3 = 0
end_sale = 0
sum_sale = 0
open_sale = 0
disput_sale = 0
for row in rows:
bal1 += row[3]
end_sale += row[4] + row[6]
sum_sale += row[5] + row[7]
rows = cursor.execute(f'SELECT * FROM sale').fetchall()
for row in rows:
bal2 += int(row[5])
open_sale += 1
rows = cursor.execute(f'SELECT * FROM dispute').fetchall()
for row in rows:
bal3 += row[5]
disput_sale += 1
open_sale -= 1
rows = cursor.execute(f'SELECT * FROM donate').fetchall()
count_donate = 0
sum_donate = 0
for row in rows:
sum_donate += row[2]
count_donate += 1
users = cursor.execute(f'SELECT * FROM users').fetchall()
bot.send_message(chat_id, f"Общее количество пользователей: {len(users)}\n\nБаланс пользователей: {bal1}\nСумма открытых сделок: {bal2}\nБаланс диспутов: {bal3}\n<b>Общий баланс бота: {bal1+bal2+bal3}</b>\n\nЗавершенных сделок: {end_sale}\nНа сумму: {sum_sale}\nОткрытых споров: {disput_sale}\n\nКол-во донатеров: {count_donate}\nСумма донатов: {sum_donate}")
elif msg == 'Админы':
if str(chat_id) in row[3] :
bot.clear_step_handler_by_chat_id(chat_id)
send = bot.send_message(chat_id, f"Первый админ: {row[3]}\nВторой админ: {row[4]}\nВыберите какого админа вы хотите поменять", reply_markup=menu.one_two)
bot.register_next_step_handler(send, edit_admins)
else:
bot.send_message(chat_id, "Извините, но эта функция доступна только главному админу")
elif msg == 'Рассылка':
send = bot.send_message(chat_id, 'Введите текст рассылки', reply_markup=menu.back)
bot.clear_step_handler_by_chat_id(chat_id)
bot.register_next_step_handler(send, mail)
elif msg == 'Изменить баланс':
send = bot.send_message(chat_id, "Введите id юзера которому надо изменить баланс", reply_markup=menu.back)
bot.clear_step_handler_by_chat_id(chat_id)
bot.register_next_step_handler(send, edit_balance)
elif msg == 'Токен':
send = bot.send_message(chat_id, f"Токен: <b>{row[2]}</b>\nЕсли хотите сменить, то оправьте новый токен", parse_mode="HTML", reply_markup=menu.back)
bot.clear_step_handler_by_chat_id(chat_id)
bot.register_next_step_handler(send, edit_qiwi, 'qiwi_api')
elif msg == 'Номер':
send = bot.send_message(chat_id, f"Номер: <b>{row[1]}</b>\nЕсли хотите сменить, то оправьте новый номер", parse_mode="HTML", reply_markup=menu.back)
bot.clear_step_handler_by_chat_id(chat_id)
bot.register_next_step_handler(send, edit_qiwi, 'qiwi_num')
elif msg == 'Токен p2p':
send = bot.send_message(chat_id, f"Токен p2p: <b>{row[8]}</b>\nЕсли хотите сменить, то оправьте новый токен", parse_mode="HTML", reply_markup=menu.back)
bot.clear_step_handler_by_chat_id(chat_id)
bot.register_next_step_handler(send, edit_qiwi, 'qiwi_p2p')
elif msg == 'Api btc':
send = bot.send_message(chat_id, f"Api btc: <b>{row[9]}</b>\nЕсли хотите сменить, то оправьте новый токен", parse_mode="HTML", reply_markup=menu.back)
bot.clear_step_handler_by_chat_id(chat_id)
bot.register_next_step_handler(send, edit_qiwi, 'api_key')
elif msg == 'Api secret btc':
bot.clear_step_handler_by_chat_id(chat_id)
send = bot.send_message(chat_id, f"Api secret btc: <b>{row[10]}</b>\nЕсли хотите сменить, то оправьте новый токен", parse_mode="HTML", reply_markup=menu.back)
bot.register_next_step_handler(send, edit_qiwi, 'api_secret')
elif msg == 'Оплата':
bot.send_message(chat_id, "<b>Настройки оплаты</b>", parse_mode="HTML", reply_markup=menu.qiwi_menu)
elif msg == 'Назад':
bot.send_message(chat_id, "<b>Меню админа</b>", parse_mode="HTML", reply_markup=menu.admin_menu)
elif msg == 'Баланс':
try:
mylogin = row[1]
api_access_token = row[2]
balances = balance(mylogin,api_access_token)['accounts']
rubAlias = [x for x in balances if x['alias'] == 'qw_wallet_rub']
rubBalance = rubAlias[0]['balance']['amount']
bot.send_message(chat_id, f'Баланс qiwi: {str(rubBalance)}р')
except:
bot.send_message(chat_id, f'Ошибка')
elif msg == 'Канал':
bot.clear_step_handler_by_chat_id(chat_id)
send = bot.send_message(chat_id, f"Текущий канал: <b>{row[5]}</b>\nЕсли хотите сменить, то оправьте новую ссылку на канал в формате <b>@name</b>, либо в виде ссылки <b>https://t.me/joinchat/ABCDEabcde</b>", parse_mode="HTML", reply_markup=menu.back)
bot.register_next_step_handler(send, edit_channal)
elif msg == 'Описание':
bot.clear_step_handler_by_chat_id(chat_id)
send = bot.send_message(chat_id, f"Текущее описание: <b>{row[7]}</b>\nЕсли хотите сменить, то оправьте новый текст", parse_mode="HTML", reply_markup=menu.back)
bot.register_next_step_handler(send, edit_help)
elif msg == 'Комиссия':
bot.clear_step_handler_by_chat_id(chat_id)
send = bot.send_message(chat_id, f"Текущая комиссия: <b>{row[6]}</b>\nЕсли хотите сменить, то оправьте новое число от 0 до 50", parse_mode="HTML", reply_markup=menu.back)
bot.register_next_step_handler(send, edit_commission)
elif msg == 'Статус':
bot.clear_step_handler_by_chat_id(chat_id)
send = bot.send_message(chat_id, f"Если вы хотите сменить статус какого-либо юзера, то отправьте мне его ник в формате @name", reply_markup=menu.back)
bot.register_next_step_handler(send, edit_stat)
elif msg == 'Автопостинг':
bot.clear_step_handler_by_chat_id(chat_id)
send = bot.send_message(chat_id, f"Если хотите сменить, то создайте пост заного, сперва отправьте текст", reply_markup=menu.back)
bot.register_next_step_handler(send, auto_post1)
elif msg[:3] == '/id':
try:
id = msg[4:]
row = cursor.execute(f'SELECT * FROM users WHERE user_id = "{id}"').fetchone()
bot.send_message(chat_id, f"?{id}\n? Профиль: @{row[1]}\n\n➖Статус: {row[2]}\n\n?Ваш баланс: {row[3]}₽\n?Покупки - шт | ₽ : {row[4]} | {row[5]}\n?Продажи - шт | ₽ : {row[6]} | {row[7]}")
except:
bot.send_message(chat_id, 'Юзер не найден')
if msg == '? Помощь':
bot.send_message(chat_id, row[7], reply_markup=menu.update_name)
elif msg == '?Мой профиль':
row = cursor.execute(f'SELECT * FROM users WHERE user_id = "{chat_id}"').fetchone()
feedback = cursor.execute(f'SELECT * FROM feedback WHERE user_id = {row[0]}').fetchall()
text = f"<b>? Профиль:</b> @{message.chat.username}\n<b>? Статус:</b> {row[2]}\n<b>?Ваш баланс:</b> {row[3]}₽\n<b>?Кол-во Отзывов:</b> {len(feedback)}\n\n<b>? Продаж:</b> {row[4]} шт.\n<b>? Покупок:</b> {row[6]} шт.\n<b>? Сумма покупок:</b> {row[5]} руб.\n<b>? Сумма продаж:</b> {row[7]} руб."
bot.send_message(chat_id, text, reply_markup=menu.profile_menu)
elif msg == '? Мои сделки':
rows = cursor.execute(f'SELECT * FROM sale WHERE user_id = "{chat_id}"').fetchall()
a = 0
if rows != []:
for row in rows:
text = f'Сделка №{row[0]}\nОт @{row[2]}\nДля @{row[4]}\nСумма: {row[5]}₽'
sales = types.InlineKeyboardMarkup(row_width=1)
sales.add(
types.InlineKeyboardButton(text='Завершить сделку', callback_data='sale_end '+str(row[0])),
types.InlineKeyboardButton(text='Открыть спор', callback_data='dispute '+str(row[0])),
)
bot.send_message(chat_id, text, reply_markup=sales)
else:
a += 1
rows = cursor.execute(f'SELECT * FROM sale WHERE user_id2 = "{chat_id}"').fetchall()
if rows != []:
for row in rows:
sales = types.InlineKeyboardMarkup(row_width=1)
text = f'Сделка №{row[0]}\nОт @{row[2]}\nДля @{row[4]}\nСумма: {row[5]}₽'
sales.add(
types.InlineKeyboardButton(text='Отменить сделку', callback_data='sale_back '+str(row[0])),
types.InlineKeyboardButton(text='Открыть спор', callback_data='dispute '+str(row[0])),
)
bot.send_message(chat_id, text, reply_markup=sales)
else:
a += 1
if a == 2:
bot.send_message(chat_id, 'У вас нет открытых сделок', reply_markup=menu.main_menu)
elif msg == '? Найти user':
bot.send_message(chat_id, "Введите никнейм в формате @username")
elif msg[:1] == "@":
name = msg[1:]
row = cursor.execute(f'SELECT * FROM users WHERE name = "{name.lower()}"').fetchone()
try:
garant_user = types.InlineKeyboardMarkup(row_width=3)
garant_user.add(
types.InlineKeyboardButton(text='Оформить сделку', callback_data='oplata '+row[0]),
types.InlineKeyboardButton(text='Отзывы', callback_data='feed '+row[0])
)
feedback = cursor.execute(f'SELECT * FROM feedback WHERE user_id = {row[0]}').fetchall()
text = f"<b>? Статус:</b> {row[2]}\n<b>?Юзер </b>{msg}\n<b>?Кол-во Отзывов:</b> {len(feedback)}\n\n<b>? Продаж:</b> {row[4]} шт.\n<b>? Покупок:</b> {row[6]} шт.\n<b>? Сумма покупок:</b> {row[5]} руб.\n<b>? Сумма продаж:</b> {row[7]} руб."
if row[0] != str(chat_id):
bot.send_message(chat_id, text, reply_markup=garant_user)
else:
bot.send_message(chat_id, text)
except:
bot.send_message(chat_id, "Пользователь не найден")
elif msg == 'Отмена' or msg == 'Вернуться в главное меню':
bot.send_message(chat_id, "<b>Главное меню</b>", parse_mode="HTML", reply_markup=menu.main_menu)
elif msg == '? Пожертвовать':
text = '<b>?Накинь монетку в сокровищницу Скруджа, не скупись</b>\n\n'
text += '?<b>Все</b> пожертвования пойдут на Развитие Проекта, закуп рекламы и т.п.\n\n'
text += '?В дальнейшем будут определенные привилегии для <b>Топ-5</b>\n\n'
text += '?Благодарим за любую помощь проекту. Спасибо, что вы с нами!'
bot.send_message(chat_id, text, reply_markup=menu.donate_menu)
conn.close()