Ошибка в телеграм боте на питоне

dima.manc

Новичок
Пользователь
Фев 22, 2022
3
0
1
Ребят, может кто подскажет в чем дело при работе кода в телеге

При первом выполнении любой команды все работает правильно, если же после нее запросить вторую команду, все равно работает условие первой и choice хранит значение первого запроса при переходе во второй def. При втором запросе не удается изменить значение choice во втором def с title на brand и наоборот

Python:
import telebot
import config
import requests
from bs4 import BeautifulSoup
import re

bot = telebot.TeleBot(config.token)  # Передаём токен из файла config.py


@bot.message_handler(commands=['start'])  # Запускаем бот
def welcome_start(message):
    bot.send_message(message.chat.id, 'Приветствую! Команда /help поможет вам ')


@bot.message_handler(commands=['help'])  # Выводим список команд
def help(message):
    bot.send_message(message.chat.id, 'Выберите один из двух вариантов: /get_brand(если вы хотите узнать брэнд товара), либо /get_title(если вы хотите узнать название товара')


@bot.message_handler(commands=['get_title', 'get_brand'])  # Запрашиваем артикул товара
def get_brand(message):
    choice = message.text
    print(choice)
    bot.send_message(message.chat.id, 'Введите артикул товара')
    @bot.message_handler(content_types='text')  # Выводим запрошенное
    def show_title(message):
        article = message.text
        print(choice)
        url = 'https://www.wildberries.ru/catalog/' + str(article) + '/detail.aspx?targetUrl=XS'
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'lxml')
        quotes = soup.find_all(itemprop="name")
        title = re.findall(r'"([^"]*)"', str(quotes))
        name = ''.join(title[0])
        span_list = []
        for quote in quotes:
            span_list.append(quote.text)
        brand = (span_list[-1])
        if choice == '/get_title':
            bot.send_message(message.chat.id, 'Название данного товара: ' + name)
        elif choice == '/get_brand':
            bot.send_message(message.chat.id, 'Бренд данного товара: ' + brand)






bot.polling()  # запускаем бота
 

Вложения

  • PYTHON.JPG
    PYTHON.JPG
    95,7 КБ · Просмотры: 1

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Ребят, может кто подскажет в чем дело при работе кода в телеге

При первом выполнении любой команды все работает правильно, если же после нее запросить вторую команду, все равно работает условие первой и choice хранит значение первого запроса при переходе во второй def. При втором запросе не удается изменить значение choice во втором def с title на brand и наоборот
Значение переменной запоминается из-за использования вложенной функции (создается замыкание).
Чтобы исправить можно сделать переменную choice глобальной:
Python:
import telebot
import config
import requests
from bs4 import BeautifulSoup
import re

bot = telebot.TeleBot(config.token)  # Передаём токен из файла config.py
choice = "" # инициализируем переменную вне функций
...

@bot.message_handler(commands=['get_title', 'get_brand'])  # Запрашиваем артикул товара
def get_brand(message):
    global choice # используем значение глобальной переменной в функции
    choice = message.text
    print(choice)
    bot.send_message(message.chat.id, 'Введите артикул товара')
    @bot.message_handler(content_types='text')  # Выводим запрошенное
    def show_title(message):
    ...
 

dima.manc

Новичок
Пользователь
Фев 22, 2022
3
0
1
Значение переменной запоминается из-за использования вложенной функции (создается замыкание).
Чтобы исправить можно сделать переменную choice глобальной:
Python:
import telebot
import config
import requests
from bs4 import BeautifulSoup
import re

bot = telebot.TeleBot(config.token)  # Передаём токен из файла config.py
choice = "" # инициализируем переменную вне функций
...

@bot.message_handler(commands=['get_title', 'get_brand'])  # Запрашиваем артикул товара
def get_brand(message):
    global choice # используем значение глобальной переменной в функции
    choice = message.text
    print(choice)
    bot.send_message(message.chat.id, 'Введите артикул товара')
    @bot.message_handler(content_types='text')  # Выводим запрошенное
    def show_title(message):
    ...
К сожалению ошибка остается и при таком коде

Python:
import telebot
import config
import requests
from bs4 import BeautifulSoup
import re

bot = telebot.TeleBot(config.token)  # Передаём токен из файла config.py
choice = ''

@bot.message_handler(commands=['start'])  # Запускаем бот
def welcome_start(message):
    bot.send_message(message.chat.id, 'Приветствую! Команда /help поможет вам ')


@bot.message_handler(commands=['help'])  # Выводим список команд
def help(message):
    bot.send_message(message.chat.id, 'Выберите один из двух вариантов: /get_brand(если вы хотите узнать брэнд товара),\n либо /get_title(если вы хотите узнать название товара)')


@bot.message_handler(commands=['get_title', 'get_brand'])  # Запрашиваем артикул товара
def get_brand(message):
    choice = message.text
    print(choice)
    bot.send_message(message.chat.id, 'Введите артикул товара')
    @bot.message_handler(content_types='text')  # Выводим запрошенное
    def show_title(message):
        article = message.text
        print(choice)
        url = 'https://www.wildberries.ru/catalog/' + str(article) + '/detail.aspx?targetUrl=XS'
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'lxml')
        quotes = soup.find_all(itemprop="name")
        title = re.findall(r'"([^"]*)"', str(quotes))
        name = ''.join(title[0])
        span_list = []
        for quote in quotes:
            span_list.append(quote.text)
        brand = (span_list[-1])
        if choice == '/get_title':
            bot.send_message(message.chat.id, 'Название данного товара: ' + name + '\nвы можете выбрать артикул другого товара, спасибо')
        elif choice == '/get_brand':
            bot.send_message(message.chat.id, 'Бренд данного товара: ' + brand)






bot.polling()  # запускаем бота
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
К сожалению ошибка остается и при таком коде
Использование глобальной переменной исправляет ошибку (я проверял).
Вы забыли добавить строку global choice в код поэтому ошибка осталась.
 

dima.manc

Новичок
Пользователь
Фев 22, 2022
3
0
1
Использование глобальной переменной исправляет ошибку (я проверял).
Вы забыли добавить строку global choice в код поэтому ошибка осталась.
Большое спасибо!
 

Форум IT Специалистов