Задать вопрос
@amogusnikovv

Почему бот не выполняет команду повторно?

бот дает характеристики танков, бот при первом запросе делает все как надо.
Скриншот
62279a4f2b147978128326.jpeg

Но если я повторно введу название прошлого танка, то он будет почему то молчать. Помогите пожалуйста решить эту проблемку.
вот код
import telebot
import random
from telebot import types
import sqlite3
from sqlite3 import Error
from time import ctime
bot = telebot.TeleBot('')
t26 = open('C:\\Users\\User\\Desktop\\Bot_WotBlitz\\R09_T-26.png', 'rb')
bt2 = open('C:\\Users\\User\\Desktop\\Bot_WotBlitz\\r08_bt-2_image_resized.png', 'rb')
bt7 = open('C:\\Users\\User\\Desktop\\Bot_WotBlitz\\r03_bt-7_image_resized.png', 'rb')
a20 = open('C:\\Users\\User\\Desktop\\Bot_WotBlitz\\r12_a-20_image_resized.png', 'rb')
Sy85B = open('C:\\Users\\User\\Desktop\\Bot_WotBlitz\\GAZ-74b.png', 'rb')
def post_sql_query(sql_query):
    with sqlite3.connect('C:\\Users\\User\\Desktop\\Bot_WotBlitz\\bazaa.db') as connection:
        cursor = connection.cursor()
        try:
            cursor.execute(sql_query)
        except Error:
            pass
        result = cursor.fetchall()
        return result

def register_user(user_id, username, first_name, last_name):
    user_check_query = f'SELECT * FROM USERS WHERE user_id = {user_id};'
    user_check_data = post_sql_query(user_check_query)
    if not user_check_data:
        insert_to_db_query = f'INSERT INTO BAZA (user_id, username, first_name, last_name) VALUES ({user_id}, "{username}", "{first_name}", "{last_name}", "{ctime()}");'
        post_sql_query(insert_to_db_query)
def user_exists(self, user_id):
        if self.get_user_name(user_id) is None:
            return False
        return True
def start(m, res=False):
        register_user(m.from_user.id, m.from_user.username, m.from_user.first_name, m.from_user.last_name)
conn = sqlite3.connect('C:\\Users\\User\\Desktop\\Bot_WotBlitz\\bazaa.db', check_same_thread=False)
cursor = conn.cursor()
def get_user_name(self, user_id):
        result = self.cursor.execute('SELECT name FROM USERS WHERE id = ?', (user_id,)).fetchone()
        if result is None:
            return None
        return result[0]
def db_table_val(user_id: int, username: str, first_name: str, last_name: str):
    cursor.execute('INSERT INTO BAZA (user_id, username, first_name, last_name) VALUES (?,?,?,?)', (user_id, username, first_name, last_name))
    conn.commit()
def bd(m):
    us_id = m.from_user_id
    us_name = m.from_user.username
    firstname = m.from_user.first_name
    lastname = m.from_user.last_name
    db_table_val(user_id=us_id, username=us_name, first_name=firstname, last_name=lastname)
conn.commit()
@bot.message_handler(commands=['start'])
def get_text_messages(m, res=False):
    markup=types.ReplyKeyboardMarkup(resize_keyboard=False)
    item1=types.KeyboardButton('Найти танк')
    item2=types.KeyboardButton('Профиль')
    markup.add(item1, item2)
    bot.send_message(m.chat.id, f'Добро пожаловать {m.from_user.first_name}',  reply_markup=markup)
    bot.send_message(m.chat.id, 'Чтобы найти танк, нажми на кнопку ниже\n\nВажно чтобы название танка было точное!', reply_markup=markup)
@bot.message_handler(content_types=["text"])
def language (message, res=False):
        if message.text.strip() == 'Найти танк' :
            a = telebot.types.ReplyKeyboardRemove()
            bot.send_message(message.chat.id, 'Введите название танка:', reply_markup=a)
        if message.text.strip() == 'Т-26' :
            bot.send_photo(message.chat.id, (t26))
            bot.send_message(message.chat.id, '<======Т-26======>\n\nМасса (т) - 9.26\n\nПрочность - 270 ед.\n\nМощность двигателя (л.с.) - 130\n\nМаксимальная скорость (км/ч) - 36\n\nБронепробиваемость базовым снарядом (мм) - 37-51\n\nУрон базовым снарядом - 26-44\n\nСкорострельность орудия (выстр/мин) - 10.3')
            
        if message.text.strip() == 'БТ-2' :
            bot.send_photo(message.chat.id, (bt2))
            bot.send_message(message.chat.id, '<======БТ-2======>\n\nМасса (т) - 12.93\n\nПрочность - 380 ед.\n\nМощность двигателя (л.с.) - 350\n\nМаксимальная скорость (км/ч) - 44\n\nБронепробиваемость базовым снарядом (мм) - 37-51\n\nУрон базовым снарядом - 38-63\n\nСкорострельность орудия (выстр/мин) - 11.8')
 
        if message.text.strip() == 'БТ-7' :
            bot.send_photo(message.chat.id, (bt7))
            bot.send_message(message.chat.id, '<======БТ-7======>\n\nМасса (т) - 15.34\n\nПрочность - 470 ед.\n\nМощность двигателя (л.с.) - 375\n\nМаксимальная скорость (км/ч) - 45\n\nБронепробиваемость базовым снарядом (мм) - 48-64\n\nУрон базовым снарядом - 45-75\n\nСкорострельность орудия (выстр/мин) - 13.0')
                
        if message.text.strip() == 'А-20' :
            bot.send_photo(message.chat.id, (a20))
            bot.send_message(message.chat.id, '<======А-20======>\n\nМасса (т) - 18.57\n\nПрочность - 520 ед.\n\nМощность двигателя (л.с.) - 400\n\nМаксимальная скорость (км/ч) - 45\n\nБронепробиваемость базовым снарядом (мм) - 71-97\n\nУрон базовым снарядом - 90-150\n\nСкорострельность орудия (выстр/мин) - 7.8')

        if message.text.strip() == 'СУ-85Б' :
            bot.send_photo(message.chat.id, (Sy85B))
            bot.send_message(message.chat.id, '<======СУ-85Б======>\n\nМасса (т) - 12.58\n\nПрочность - 500 ед.\n\nМощность двигателя (л.с.) - 400\n\nМаксимальная скорость (км/ч) - 45\n\nБронепробиваемость базовым снарядом (мм) - 71-97\n\nУрон базовым снарядом - 90-150\n\nСкорострельность орудия (выстр/мин) - 7.8')
                    
        elif message.text.strip() == 'Профиль' :
            bot.send_message(message.chat.id, f'<======Ваш профиль======>\n\nИмя: {message.from_user.first_name}\nАйди: {message.from_user.id}')
bot.polling(none_stop=True, timeout=123)
  • Вопрос задан
  • 199 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 2
MuckRuno
@MuckRuno
Молодой начинающий разработчик, активно развиваю б
Возможно потому что вы не удаляете вебхуки попробуйте в конце написать это
bot.remove_webhook()
bot.polling(none_stop=True, timeout=123)
Ответ написан
shabelski89
@shabelski89
engineer
Код практически невозможно читать, куча копипастов даже из моих старых ответов :) ).

На вашем текущем уровне понимания ЯП я бы предложил почистить код.
выносим БД и все данные в отдельный модуль и наводим порядок.
tanks_db.py

import sqlite3
from sqlite3 import Error
from time import ctime


def post_sql_query(sql_query, database='bazaa.db'):
    with sqlite3.connect(database) as connection:
        cursor = connection.cursor()
        try:
            cursor.execute(sql_query)
        except Error as E:
            print(E)
        result = cursor.fetchall()
        return result


def register_user(user_id, username, first_name, last_name):
    user_check_query = f'SELECT * FROM USERS WHERE user_id = {user_id};'
    user_check_data = post_sql_query(user_check_query)
    if not user_check_data:
        insert_to_db_query = f'INSERT INTO USERS (user_id, username, first_name, last_name, reg_date) ' \
                             f'VALUES ({user_id}, "{username}", "{first_name}", "{last_name}", "{ctime()}");'
        post_sql_query(insert_to_db_query)


def user_exists(user_id):
    if get_user_name(user_id) is None:
        return False
    return True


def get_user_name(user_id):
    user_check_query = f'SELECT username FROM USERS WHERE user_id = {user_id};'
    result = post_sql_query(user_check_query)
    if result is None:
        return None
    return result[0]



users_tables = '''CREATE TABLE IF NOT EXISTS USERS 
                        (user_id INTEGER PRIMARY KEY NOT NULL,
                        username TEXT,
                        first_name TEXT,
                        last_name TEXT,
                        reg_date TEXT);'''

post_sql_query(users_tables)

tanks_tables = '''CREATE TABLE IF NOT EXISTS TANKS 
                        (name TEXT PRIMARY KEY, info TEXT, photo TEXT);'''

post_sql_query(tanks_tables)
tanks = [
    {'name': 'Т-26', 'info': '<======Т-26======>\n\nМасса (т) - 9.26\n\nПрочность - 270 ед.\n\nМощность двигателя (л.с.) - 130\n\nМаксимальная скорость (км/ч) - 36\n\nБронепробиваемость базовым снарядом (мм) - 37-51\n\nУрон базовым снарядом - 26-44\n\nСкорострельность орудия (выстр/мин) - 10.3', 'photo': r'C:\\Users\\User\\Desktop\\Bot_WotBlitz\\R09_T-26.png'},
    {'name': 'БТ-2', 'info': '<======БТ-2======>\n\nМасса (т) - 12.93\n\nПрочность - 380 ед.\n\nМощность двигателя (л.с.) - 350\n\nМаксимальная скорость (км/ч) - 44\n\nБронепробиваемость базовым снарядом (мм) - 37-51\n\nУрон базовым снарядом - 38-63\n\nСкорострельность орудия (выстр/мин) - 11.8', 'photo': r'C:\\Users\\User\\Desktop\\Bot_WotBlitz\\r08_bt-2_image_resized.png'},
    {'name': 'БТ-7', 'info': '<======БТ-7======>\n\nМасса (т) - 15.34\n\nПрочность - 470 ед.\n\nМощность двигателя (л.с.) - 375\n\nМаксимальная скорость (км/ч) - 45\n\nБронепробиваемость базовым снарядом (мм) - 48-64\n\nУрон базовым снарядом - 45-75\n\nСкорострельность орудия (выстр/мин) - 13.0', 'photo': r'C:\\Users\\User\\Desktop\\Bot_WotBlitz\\r03_bt-7_image_resized.png'},
    {'name': 'А-20', 'info': '<======А-20======>\n\nМасса (т) - 18.57\n\nПрочность - 520 ед.\n\nМощность двигателя (л.с.) - 400\n\nМаксимальная скорость (км/ч) - 45\n\nБронепробиваемость базовым снарядом (мм) - 71-97\n\nУрон базовым снарядом - 90-150\n\nСкорострельность орудия (выстр/мин) - 7.8', 'photo': r'C:\\Users\\User\\Desktop\\Bot_WotBlitz\\r12_a-20_image_resized.png'}
]

for tank in tanks:
    name = tank['name']
    info = tank['info']
    photo = tank['photo']
    post_sql_query(f'INSERT OR IGNORE INTO TANKS (name, info, photo) VALUES("{name}","{info}","{photo}")')



далее пишем основную логику, в целом там делов на 1 час, форматирование вывода и наполнение БД сделать.

tanks_bot.py

import os.path
import telebot
from telebot import types
from tanks_bd import *


API_TOKEN = ""
bot = telebot.TeleBot(API_TOKEN)


def get_photo(path):
    try:
        if os.path.exists(path):
            return open(path, 'rb')
    except Exception as E:
        print(E)
        return False


def get_main_keyboard():
    keyboard_main = types.InlineKeyboardMarkup()
    tanks_menu = types.InlineKeyboardButton('Танки', callback_data="Tanks")
    profile_button = types.InlineKeyboardButton('Профиль', callback_data="Profile")
    keyboard_main.add(profile_button, tanks_menu)
    return keyboard_main


@bot.message_handler(commands=['start'])
def get_text_messages(message):
    username = message.from_user.first_name
    register_user(message.from_user.id, message.from_user.username, username, message.from_user.last_name)
    keyboard = get_main_keyboard()
    bot.send_message(message.chat.id, f'Добро пожаловать {username}', reply_markup=keyboard)


@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.data == "MainMenu":
        keyboard = get_main_keyboard()
        username = call.message.chat.first_name
        bot.send_message(call.message.chat.id, f'Добро пожаловать {username}', reply_markup=keyboard)

    if call.data == "Profile":
        profile_query = f'SELECT * FROM USERS WHERE user_id = {call.message.chat.id};'
        profile = post_sql_query(profile_query)
        username, first_name, last_name = profile[0]
        keyboard = get_main_keyboard()
        bot.send_message(call.message.chat.id,
                         f'*username*\n{username}\n*first_name*\n{first_name}\n*last_name*\n{last_name}',
                         reply_markup=keyboard)

    if call.data == "Tanks":
        tanks_query = f'SELECT distinct(name) FROM TANKS;'
        tanks_result = post_sql_query(tanks_query)
        keyboard = types.InlineKeyboardMarkup()
        back_button = types.InlineKeyboardButton(text="Back", callback_data="MainMenu")
        button_list = [types.InlineKeyboardButton(text=elem[0], callback_data=elem[0]) for elem in tanks_result]
        keyboard.add(*button_list, back_button)
        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                              text=call.message.text, reply_markup=keyboard)

    if call.data:
        check_data = f'SELECT name, info, photo FROM TANKS WHERE name = "{call.data}";'
        check = post_sql_query(check_data)
        if check:
            name, info, photo = check[0]
            bot.send_message(call.message.chat.id, f'*Name*\n{name}\n*Info*\n{info}')
            if get_photo(photo):
                bot.send_photo(call.message.chat.id, get_photo(photo))
            keyboard = get_main_keyboard()
            username = call.message.chat.first_name
            bot.send_message(call.message.chat.id, f'Добро пожаловать {username}', reply_markup=keyboard)


if __name__ == "__main__":
    try:
        bot.polling(none_stop=True)
    except Exception as e:
        print(e)


622853c0baf07174276544.png
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы