• Почему Выдает ошибку, Python?

    @codingoleg
    Потому что неправильный синтаксис. Не class ManageApp(), а class ManageApp должно быть.
    Ответ написан
  • Как обернуть в цикл консольную программу на Python?

    @codingoleg
    Оборачивать весь код в бесконечный цикл не надо. Нужно обернуть лишь ту часть/функцию, которую вы хотите повторить. Пример кода с отображением номера стороны и треугольника и без повторов (заменить в вашем коде, начиная с try):
    # Функция для подставления номера стороны и номера треугольника для отображения
    def enter_length(side_num: str, triangle_num: str):
        return f'Enter the length of {side_num} side of triangle {triangle_num} (cm): '
    
    
    error_msg = 'Error! Please enter an integer or fractional number for the program to work correctly.'
    repeat_msg = "Enter 'Y' for one more triangle or any key to exit: "
    # Номер треугольника
    triangle_num = 1
    while True:
        try:
            sides = []
            # Номер стороны из 3
            for side_num in range(1, 4):
                sides.append(
                    float(input(enter_length(str(side_num), str(triangle_num)))))
            area_of_triangle(*sides)
        except ValueError:
            print(error_msg)
        else:
            response = input(repeat_msg)
            if response == 'Y':
                triangle_num += 1
            else:
                break
    Ответ написан
    Комментировать
  • Как отправить стикер в телеграм с компьютера?

    @codingoleg
    Отправка файлов и стикеров есть в документации https://core.telegram.org/bots/api#inputfile и https://core.telegram.org/bots/api#sendsticker. Если вы собираетесь больше 1 раза отправлять отдельный стикер, я бы добавил этот стикер в стикерпак и отправлял бы пользователю по ID стикера. Помимо BufferedInputFile можете глянуть соседние FSInputFile и URLInputFile. Вот вам 2 варианта на выбор:
    from aiogram import Bot, Dispatcher, F
    from aiogram import types
    from aiogram.types.input_file import BufferedInputFile
    import asyncio
    
    token = 'ВАШ_ТОКЕН'
    bot = Bot(token=token)
    dp = Dispatcher()
    
    # Открываем файл с компьютера
    with open('photos/photo.webp', 'rb') as file:
        input_file = BufferedInputFile(file.read(), 'any_filename')
    # Или устанавливаем ID стикера
    sticker_id = 'CAACAgIAAxkBAAEKdDVlHm_tbwKnOGandpJwjTBEUXy2zAAC3ggAAgi3GQLYQTVG1h5WQDAE'
    
    @dp.message(F.text == '/start')
    async def send_file(message: types.Message):
        # Загрузка файла с комьютера
        await bot.send_sticker(message.chat.id, input_file)
        # Или отправляем по ID стикера
        await bot.send_sticker(message.chat.id, sticker_id)
    
    asyncio.run(dp.start_polling(bot))
    Ответ написан
    Комментировать
  • Как сделать нормальные глобальные переменные?

    @codingoleg
    Если вас не пугает потеря этих данных, например, из-за перезагрузки бота и прочего, то можно сделать глобальную переменную - словарь. Ключом будет id пользователя или чата, а значением - то, что вы хотите сохранить для него.
    users = {
        12398767: {'name': 'Vasya'},
        98765467: {'name': 'Lena'}
    }
    
    def edit(user_id: int):
        global users
        users[user_id]['name'] = 'Petya'
    
    def read(user_id: int):
        print(users[user_id]['name'])
    
    edit(12398767)
    read(12398767)  # Petya
    print(users)  # {12398767: {'name': 'Petya'}, 98765467: {'name': 'Lena'}}
    Ответ написан
    1 комментарий
  • Как сделать словарь?

    @codingoleg
    Не совсем понятно, какой именно словарь нужен. Вот вам 3 варианта на выбор.
    with open('text_file', encoding='utf-8') as file:
        sorted_list = sorted(word.rstrip() for word in file.readlines())
    
    with open('text_file', encoding='utf-8') as file:
        sorted_dict = {i: word.rstrip() for i, word in enumerate(file.readlines())}
    
    with open('text_file', encoding='utf-8') as file:
        sorted_list_with_index = sorted(
            {i: word.rstrip() for i, word in enumerate(file.readlines())}.items(),
            key=lambda x: x[1]
        )
    Ответ написан
    Комментировать
  • Функция с двумя ифами как реализовать PyTelegramBotAPI 4.14.0?

    @codingoleg
    Команду из 2 слов Telebot через commands не поймет. Нужны будут регулярные выражения, но, кажется, это вам еще рано. Вот рабочий вариант:
    @bot.message_handler(commands=['грустно', 'весело'])
    def pomosh(message):
        if message.text == '/грустно':
            bot.reply_to(message, 'не грусти( я с тобой)!')
        elif message.text == '/весело':
            bot.reply_to(message, 'мне тоже!)')
    
    bot.infinity_polling()

    Вызов команды через /грустно или /весело. Но лучше разносить их по разным хендлерам:
    @bot.message_handler(commands=['грустно'])
    def sad(message):
        bot.reply_to(message, 'не грусти( я с тобой)!')
    
    @bot.message_handler(commands=['весело'])
    def fun(message):
        bot.reply_to(message, 'мне тоже!)')
    
    bot.infinity_polling()
    Ответ написан
    Комментировать
  • Ошибка доступа 403, Ошибка проверки CSRF. Запрос отклонён. Как её избежать при заполнении и отправлении формы?

    @codingoleg
    Проблема не в Selenium. Через обычный браузер такая же ошибка. Видимо, сайт на Django у них, и забыли кое-какие настройки поправить. Это ж госуха.
    Ответ написан
  • Как выключить цикл в тг боте?

    @codingoleg
    Для aiogram 2.25.1 я решил этот вопрос через добавление и удаление задач и глобальные переменные. Возможно, костыли, но работает. В данном случае будет запускаться только одна задача, которая проверяется флагом is_running.
    task = Future()
    is_running = False
    
    async def infinite_loop():
        counter = 0
        while True:
            await asyncio.sleep(1)
            print(counter)
            counter += 1
    
    @dp.message_handler(text='вкл/выкл код')
    async def all_message(message: types.Message):
        global task, is_running
        if message.from_user.id == int(ADMIN_ID):
            if is_running:
                await bot.send_message(message.from_user.id, "Код уже запущен")
            else:
                await bot.send_message(message.from_user.id,
                                       "Код запущен, если вы хотите отключить код, то нажмите /off")
                # Создаем задачу
                is_running = True
                task = asyncio.create_task(infinite_loop())
                # Добавляем в пул для выполнения
                await asyncio.gather(task)
    
    @dp.message_handler(commands=['off'])
    async def off_command(message: types.Message):
        global is_running
        if message.from_user.id == int(ADMIN_ID):
            if is_running:
                await bot.send_message(message.chat.id, "Код был остановлен")
                # Отменяем задачу
                task.cancel()
                is_running = False
                # Убираем из пула выполнения
                await asyncio.gather(task)
            else:
                await bot.send_message(message.chat.id, "Код еще не запущен")
    
    executor.start_polling(dp, skip_updates=True)

    Если вам нужно запустить несколько задач (одинаковых или нет) через команду вкл/выкл, просто удалите этот флаг и все проверки, связанные с ним. В этом случае проблема будет только с завершением более 1 задачи. Если нужно будете, напишите сюда.
    Ответ написан
    Комментировать
  • Почему не могу указать элемент из списка как аргумент?

    @codingoleg
    Не могу конкретно по aiogram сказать, но ваши 2 кода различны. Не совсем понятно, что вы хотите сделать. Несколько предположений:
    1. caption=post_data['text'] и caption='text' не эквивалентны. Первое - это значение по ключу 'text', а второе, видимо, сам ключ 'text' (вы не написали, что в словаре). Ошибка может быть из-за того, ему не нравится то, что по ключу 'text' в словаре.
    2. Условие if post_data.get('text') выполнится сразу же, если в словаре в принципе есть ключ 'text' и только 1 раз (или ни разу, если 'text' не в словаре), потому что ключ 'text' будет заменен на None этой строкой post_data['text'] = None. Словарь теперь содержит {..., 'text': None}. Если вы хотите другое поведение, вам нужно другое условие.
    3. Используйте key, value - так понятнее будет. Пример:
    post_data = {'photo': 'some_photo', 'video': 'some_video', 'text': 'some_text'}
    for key, value in post_data.items():
        if post_data.get('text'):
            album.add(type=key, media=value, caption=post_data['text'])
            post_data['text'] = None
        else:
            album.add(type=key, media=value)
    Ответ написан
    Комментировать
  • Как удалить inline keyboard?

    @codingoleg
    Эта ошибка возможна, если вы вызвали функции без аргументов chat_id и/или message_id. Бот не понимает, какое сообщение удалять.
    https://docs.aiogram.dev/en/stable/api/types/messa...

    Попробуйте вместо этого функцию для удаления только клавиатуры (aiogram 2.25.1):
    await callback.message.delete_reply_markup()
    или функцию для удаления и клавиатуры, и сопутствующего ей сообщения
    await callback.message.delete()

    Удалять можно не все сообщения:
    https://core.telegram.org/bots/api#deletemessage
    Ответ написан
    Комментировать