• Почему pony обращается не к той таблице в базе данных?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Судя по вашему коду и SQL-запросу, ваш запрос возвращает записи только из таблицы "all_categories_recommendations", а не из таблицы "Games". Это может быть связано с тем, что вы не определили связь между таблицами "Games" и "All_categories_recommendations" в вашей модели.

    Если вы хотите выполнить запрос, который возвращает записи из таблицы "Games", вам нужно изменить ваш запрос на что-то вроде:

    with db_session:
        db.generate_mapping(create_tables=False)
        print(select(g for g in Games)[:10])

    Если вы все еще получаете данные только из таблицы "all_categories_recommendations", пожалуйста, убедитесь, что в вашей базе данных существует таблица "Games" и что в вашей модели определена правильная схема и связь между таблицами "Games" и "All_categories_recommendations".
    Ответ написан
    Комментировать
  • Как сделать выравнивание в inline-кнопках telegram-бота?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Нет, нельзя. TG сам ровняет текст в кнопках, беспокоится об этом не нужно.
    Ответ написан
    Комментировать
  • Как получить и скачать .gif в Telebot Python, отправленное пользователем?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Для того чтобы получить и скачать файл .gif, отправленный пользователем в Telegram, вы можете использовать метод bot.download_file(file_path), где file_path - это путь к файлу, который вы получили из объекта сообщения.

    В вашем коде, вместо message.animation[len(message.animation) - 1].file_id нужно использовать message.animation.file_id (или message.animation[-1].file_id, чтобы получить идентификатор файла .gif). Затем, вы можете использовать метод bot.download_file(file_path) для загрузки файла по его пути. Далее, вы можете сохранить его локально и обработать с помощью библиотеки MyQR.

    Примерно такой код может получить и сохранить файл .gif, отправленный пользователем:

    @bot.message_handler(content_types=['animation'])
    def get_gif2(message):
        file_id = message.animation.file_id
        file_info = bot.get_file(file_id)
        downloaded_file = bot.download_file(file_info.file_path)
        src = str(message.from_user.id) + '.gif'
        with open(src, 'wb') as new_file:
            new_file.write(downloaded_file)
        bot.reply_to(message, "Фото добавлено")
        myqr.run(src)
        with open(src, 'rb') as photo:
            bot.send_animation(message.chat.id, photo)
        get_menu(message)
    Ответ написан
  • Как записать токены в бд через Middleware в fastapi?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Да, можно записать токены в базу данных через middleware в FastAPI. Можно использовать middleware, чтобы выполнить какой-то код перед выполнением основного обработчика запроса, а также после выполнения основного обработчика.

    Например, можно создать middleware, который будет вызываться после аутентификации пользователя и сохранять токен в базу данных. Для этого нужно создать функцию middleware, которая будет принимать объект запроса и функцию, обрабатывающую запрос, и внутри этой функции сохранять токен в базу данных.

    Вот пример кода, который показывает, как можно сделать это:

    from fastapi import FastAPI, Request
    from fastapi.responses import JSONResponse
    from fastapi.routing import APIRoute
    from datetime import datetime, timedelta
    
    def save_token_middleware(request: Request, call_next):
        # Выполнение кода перед обработкой запроса
        response = call_next(request)
        # Выполнение кода после обработки запроса
        if "access_token" in response.body:
            access_token = response.json().get("access_token")
            username = response.json().get("sub")
            expiration_time = datetime.now() + timedelta(minutes=15)
            # Здесь можно сохранить токен в базу данных
            # используя модуль для работы с БД
            # например, SQLAlchemy или Tortoise ORM
        return response
    
    # Создаем экземпляр приложения
    app = FastAPI()
    
    # Регистрируем middleware
    app.router.route_class = APIRoute
    app.middleware("http")(save_token_middleware)
    
    # Обработчик запроса
    @app.post("/users/auth", response_model=schemas.Token, tags=["users"])
    def authenticate_user(user: schemas.UserAuthenticate, db: Session = Depends(get_db)):
        db_user = crud.get_user_username(db, username=user.username)
        if db_user is None:
            raise HTTPException(status_code=403, detail="Username or password is incorrect")
        else:
            is_password_correct = authenti.username_password(db, user)
            if is_password_correct is False:
                raise HTTPException(status_code=403, detail="Username or password is incorrect")
            else:
                access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
                access_token = authenti.encode_jwt(
                    data={"sub": user.username}, expires_delta=access_token_expires)
                return {"access_token": access_token, "token_type": "Bearer"}
    Ответ написан
    Комментировать
  • Не получается подключиться к OpenOPC серверу на python 3.10, почему?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Ошибка "invalid data or unsupported protocol version" может быть вызвана различными причинами, но, как правило, она связана с проблемами в настройке сетевого соединения.

    Возможно, сервер OpenOPC не работает или не настроен должным образом, или возможны проблемы с настройками сетевого протокола или настройками брандмауэра.

    Попробуйте следующее:

    1. Проверьте, работает ли сервер OpenOPC и что он настроен правильно.
    2. Убедитесь, что ваша сеть настроена правильно и что вы можете подключаться к другим устройствам на этой сети.
    3. Проверьте настройки брандмауэра и убедитесь, что они не блокируют соединение.


    Если ни одно из этих решений не помогло, попробуйте связаться с командой поддержки OpenOPC, чтобы получить дополнительную помощь.
    Ответ написан
    Комментировать
  • Как сделать выбор пункта меню через selenium python?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Чтобы выбрать второй пункт меню, можно использовать метод find_elements для поиска всех элементов с классом rowmenu, затем обратиться к нужному элементу по индексу и кликнуть на него. Например, таким образом можно выбрать второй пункт меню:

    # Найти все элементы с классом 'rowmenu'
    menu_items = browser.find_elements(By.CLASS_NAME, 'rowmenu')
    
    # Кликнуть на второй элемент
    menu_items[1].click()


    В этом примере мы находим все элементы с классом rowmenu с помощью метода find_elements, затем обращаемся ко второму элементу списка (menu_items[1]) и кликаем на него с помощью метода click().
    Ответ написан
    Комментировать
  • Как решить ошибку при подключение хром аккаунта?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    К сожалению, без более подробной информации о том, что происходит после входа в аккаунт, сложно точно определить, что вызывает ошибку. Однако, возможно, это связано с тем, что вы пытаетесь использовать уже существующий профиль браузера, который может содержать старые данные, настройки и файлы cookie, которые могут помешать выполнению вашего скрипта.

    Рекомендуется использовать новый профиль для автоматизации действий в браузере, для этого можно воспользоваться опцией --user-data-dir. В вашем коде она уже есть, но укажите путь к пустой директории, которую вы создадите специально для скрипта.

    Например:

    options.add_argument(r"user-data-dir=C:\Users\HOME\AppData\Local\Google\Chrome\New User Data")

    Кроме того, обратите внимание на версии chromedriver и Google Chrome. Убедитесь, что они совместимы между собой. Если версии не совпадают, это может привести к ошибкам.
    Ответ написан
    Комментировать
  • Почему прерывается соеденение mysql посреди скрипта?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Ошибка "MySQL Connection not available" может возникать по нескольким причинам:
    1. Сервер базы данных MySQL не работает или недоступен.
    2. Сервер базы данных MySQL не настроен на принятие соединений.
    3. Превышено максимальное количество соединений к серверу базы данных MySQL.
    4. Сервер базы данных MySQL был неправильно настроен.
    5. Ошибка в коде скрипта Python, вызванная, например, слишком многими одновременными запросами к базе данных.


    Для дальнейшего диагностирования проблемы рекомендуется проверить настройки базы данных MySQL и количество соединений, которые вы используете в своем скрипте. Также можно проверить журналы ошибок MySQL для получения дополнительной информации о возможных причинах проблемы.
    Ответ написан
    Комментировать
  • Как скриптом JS пройти проверку кладуфлейра, зная, что нужно сделать?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    По вашему описанию, скрипт отправляет запросы и возвращает captcha_required через каждые 10 запросов. Если вы знаете, как выполнить это действие вручную, то вы можете попробовать автоматизировать его через Python с помощью библиотеки Selenium.

    Selenium позволяет управлять веб-браузером с помощью Python, воспроизводить взаимодействие пользователя с веб-сайтом, включая заполнение форм, нажатие кнопок и т.д.

    Для начала вам нужно будет установить библиотеку Selenium и веб-драйвер для выбранного вами браузера (например, Chrome). Затем вы можете написать скрипт на Python, который будет запускать браузер, загружать нужный сайт, автоматически заполнять формы и отправлять запросы.

    Чтобы передать параметры, которые нужно указать на сайте, вы можете использовать функции Selenium для поиска и взаимодействия с элементами страницы (например, метод find_element_by_name() для поиска элемента по имени).

    Если вы хотите воспроизводить взаимодействие пользователя с задержкой между запросами, вы можете использовать функцию time.sleep() для задержки выполнения скрипта на определенное количество секунд.

    Например, примерно так может выглядеть скрипт на Python, использующий Selenium:

    from selenium import webdriver
    import time
    
    # Запускаем Chrome в автоматическом режиме
    driver = webdriver.Chrome()
    
    # Загружаем нужный сайт
    driver.get("https://example.com")
    
    # Находим элементы, которые нужно заполнить, и заполняем их
    input1 = driver.find_element_by_name("input1")
    input1.send_keys("значение1")
    
    input2 = driver.find_element_by_name("input2")
    input2.send_keys("значение2")
    
    # Отправляем запрос
    submit_button = driver.find_element_by_name("submit")
    submit_button.click()
    
    # Ждем 10 секунд
    time.sleep(10)
    
    # Закрываем браузер
    driver.quit()


    Но помните, что автоматизация действий на сайте может нарушать правила использования сайта, поэтому перед использованием автоматизации убедитесь, что вы имеете на это право и не нарушаете условия использования сайта.
    Ответ написан
    2 комментария
  • Keras Shapes (None, 3) and (None, 4, 3) are incompatible изза чего?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Ошибка возникает, потому что форма выходных данных (y) не совпадает с формой выходного слоя модели. Выходной слой содержит 3 нейрона, что означает, что форма выходных данных должна быть (None, 3), где None означает, что это количество образцов данных может быть произвольным.

    В данном случае, вы используете функцию to_categorical для преобразования y в категориальный формат, то есть каждое значение y преобразуется в вектор, в котором только один элемент равен 1, а все остальные равны 0. Это приводит к форме выходных данных (None, 3).

    Чтобы решить эту проблему, вам нужно изменить форму y, чтобы она соответствовала форме выходного слоя модели. В данном случае, вам нужно изменить код следующим образом:
    y = np.array(y)
    В этом случае форма y будет (3,), что соответствует форме выходного слоя модели, и ошибка должна исчезнуть.
    Ответ написан
  • Как использовать версию php с сервера?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Да, вы правильно понимаете, что нужно установить PHP версии 8.1 на вашу основную операционную систему, чтобы использовать его в PHPStorm.

    Однако, если вы работаете с проектом на удаленном сервере, то вы можете настроить PHPStorm для работы с версией PHP на этом удаленном сервере.

    Для этого вам нужно:

    1. Установить PHP на вашей локальной машине, если вы еще этого не сделали.
    2. Указать PHPStorm, что нужно использовать PHP на удаленном сервере. Для этого:
      • Откройте настройки PHPStorm (File -> Settings -> Languages & Frameworks -> PHP).
      • Нажмите на кнопку "..." напротив "Interpreter".
      • В открывшемся окне нажмите на "+" и выберите "Remote".
      • Укажите параметры для подключения к удаленному серверу (хост, порт, имя пользователя, пароль).
      • Выберите путь к исполняемому файлу PHP на удаленном сервере.


    3. Настройте PHPStorm для использования данного интерпретатора PHP в вашем проекте. Для этого:
      • Откройте настройки проекта (File -> Settings -> PHP -> CLI Interpreter).
      • Выберите ранее созданный интерпретатор PHP.
      • Убедитесь, что настройки корректны, нажмите "Apply" и "OK".




    Теперь PHPStorm будет использовать PHP версии на удаленном сервере для запуска и отладки вашего проекта.
    Ответ написан
    Комментировать
  • В чем ошибка Python - aiogram?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Ошибка указывает, что в коде происходит попытка вызвать функцию logging.INFO с аргументами {user_id=} {user_full_name=}, однако logging.INFO является числовым значением уровня логгирования, а не функцией. Вместо этого нужно использовать функцию logging.info, чтобы вывести сообщение в лог:
    logging.info(f'{user_id=} {user_full_name=} {time.asctime()}')
    Ответ написан
    2 комментария
  • Как запустить асинхронную функцию aiogram?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Вы можете запустить ваши функции в отдельных потоках с помощью модуля threading.

    Пример:

    import threading
    import file1
    import file2
    
    def run_in_thread(func):
        def wrapper(*args, **kwargs):
            thread = threading.Thread(target=func, args=args, kwargs=kwargs)
            thread.start()
        return wrapper
    
    @run_in_thread
    def run_function_1():
        file1.test()
    
    @run_in_thread
    def run_function_2():
        file2.test()
    
    def on_startup():
        run_function_1()
        run_function_2()
    
    executor.start_polling(dp, skip_updates=True, on_startup=on_startup)


    Таким образом, вы можете запустить ваши функции из двух разных файлов в отдельных потоках, а телеграм бот продолжит работу нормально.

    Обратите внимание, что этот код также требует обертку run_in_thread, чтобы запускать функции в отдельных потоках.
    Ответ написан
    Комментировать
  • Возможно ли узнать свои права?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Да, возможно. Для этого можно использовать метод getChatMember из библиотеки telebot. Этот метод возвращает объект типа ChatMember, содержащий информацию о статусе и правах члена беседы.

    Пример использования:

    import telebot
    
    bot = telebot.TeleBot(TOKEN)
    
    chat_id = 12345
    user_id = 67890
    
    chat_member = bot.get_chat_member(chat_id, user_id)
    print(chat_member.status)  # статус члена беседы (например, "creator" или "member")
    print(chat_member.can_send_messages)  # True/False - может ли член беседы отправлять сообщения
    print(chat_member.can_change_info)  # True/False - может ли член беседы изменять информацию о беседе

    Обратите внимание, что для вызова этого метода вам нужно будет указать chat_id - идентификатор беседы, в которой вы хотите узнать права, и user_id - идентификатор пользователя (в этом случае это идентификатор бота.
    Ответ написан
    Комментировать
  • EOF error при работе с input ()?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Ошибка EOFError обычно возникает, когда программа ожидает ввода с консоли, но не получает его. Возможно, на другом компьютере вы запускаете программу не через консоль, а через файл. В этом случае стандартный ввод не будет работать.

    Чтобы исправить эту ошибку, попробуйте запускать программу через консоль. Если это не помогает, то возможно, что в коде программы есть какая-то ошибка, из-за которой она не может получить данные с консоли. В этом случае нужно искать ошибку в коде и исправлять ее.

    Если у вас есть возможность, советую перейти с Python 3.8 на более новую версию. Это может избавить вас от различных проблем, связанных с несовместимостью кода и библиотек.
    Ответ написан
    Комментировать
  • Как одним запросом обновить несколько строк одним запросом с формулами SQL?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Да, это можно сделать через один запрос с использованием транзакций. Для этого можно использовать оператор UPDATE с формулами в качестве новых значений для столбцов.

    Примерно так:

    BEGIN;
    UPDATE table1
    SET stock2 = array.st,
        sumStock = stock + stock2,
        price = array.pr
    FROM (VALUES ('art1', 'st1', 'pr1'), ('art2', 'st2', 'pr2'), ...) AS array(art, st, pr)
    WHERE table1.article = array.art;
    COMMIT;


    В этом запросе сначала начинается транзакция с командой BEGIN. Затем обновляется таблица table1 с использованием оператора UPDATE. В качестве новых значений указываются формулы, которые берут значения из массива с помощью FROM и VALUES. С помощью условия WHERE задается, что строки в таблице table1 должны быть обновлены только для тех строк, у которых article совпадает с art из массива. В конце транзакция завершается командой COMMIT.
    Ответ написан
    Комментировать
  • Как решить проблему NameError: name is not defined?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Ошибка NameError: name is not defined означает, что в коде используется имя (переменная, функция, класс и т.д.), которое не было определено. В данном случае это имя treasure_x.

    Чтобы решить эту проблему, нужно определить treasure_x переменную, например, так:

    treasure_x = 0

    Или же убедиться, что treasure_x уже была определена ранее в коде.
    Ответ написан
    Комментировать
  • Как решить ошибку python. RuntimeWarning: coroutine 'some_name' was never awaited?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Данная ошибка возникает, когда вызывается корутина (асинхронная функция), но не ждется ее завершение. В вашем случае это функция main.

    Чтобы решить эту проблему, нужно дождаться завершения функции main. Для этого вы можете использовать конструкцию await main() или asyncio.run(main()).

    После этого запустите бота снова и проверьте, что ошибка больше не возникает.
    Ответ написан
    Комментировать
  • Как правильно отредактировать исходный код готового телеграмм бота на php?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Для того, чтобы бот ответил "Есть ответ" в любом случае, если в тексте сообщения содержится слово "нет", нужно использовать функцию stripos вместо оператора ==. Функция stripos ищет первое вхождение подстроки в строку без учета регистра.

    Пример:

    if (stripos($text, "нет") !== false) {
        bot('sendMessage',[
            'chat_id'=>$update->message->from->id,
            'text'=>"Есть ответ",
        ]);
    }


    В этом случае бот отправит сообщение "Есть ответ", если в тексте сообщения содержится слово "нет", независимо от того, где оно расположено в тексте.
    Ответ написан
    Комментировать
  • Как из одного класса добраться в другой?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Чтобы из одного экземпляра класса добраться в другой, вам нужно в первом экземпляре класса хранить ссылку на второй экземпляр. Для этого вы можете в конструкторе класса User добавить аргумент api, который будет ссылкой на экземпляр класса MyApi, и сохранить его в свойстве экземпляра self.api. Затем в методе save вы сможете обратиться к этому свойству и вызвать нужные методы.
    Ответ написан
    Комментировать