Ответы пользователя по тегу Python
  • Проблема с машиной состояний в aiogram. Как это можно исправить?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Чтобы избежать этой проблемы, вы можете пометить каждую команду, которая вызывает машину состояний, с помощью @dp.message_handler(state=None). Таким образом, если пользователь вызывает эту команду, машина состояний будет начинаться сначала, а не продолжать с текущего состояния.
    Ответ написан
    Комментировать
  • [aiogram] Как получить упомянутого пользователя?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Да, это возможно. В объекте Message есть атрибут entities, который содержит список сущностей, найденных в тексте сообщения. Сущности могут быть разных типов, например, хештеги, ссылки и имена пользователей. Чтобы получить упомянутого пользователя, нужно обработать список сущностей, найти там сущность типа MessageEntityMentionName и взять из нее user_id.
    Ответ написан
  • Как сделать несколько каналов python pyrogram?

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

    Вот пример кода, который подписывается на сообщения из каналов с идентификаторами 'test' и 'test2':

    import pyrogram
    
    app = pyrogram.Client("my_account")
    
    def channel_handler(client, message):
        print(f"New message from channel {message.chat.title}: {message.text}")
    
    app.add_channel_handler(channel_handler, "test", "test2")
    
    app.run()


    Калбек-функция channel_handler будет вызываться каждый раз, когда появляется новое сообщение в одном из указанных каналов. В функции можно обрабатывать сообщения и выполнять нужные действия.
    Ответ написан
    Комментировать
  • При отправке неправильного значения он пишет "Что введите корректные данные" Вводишь данные и не чего не происходит в чем проблема?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Ваш вопрос не корректен, но я постараюсь ответить на него:

    Возможно, проблема заключается в том, что в функции currency вы не указываете, что нужно делать, если полученное сообщение не равно 'Калькулятор цен'. В этом случае функция вызывает саму себя снова, но уже с новым сообщением, которое, вероятно, также не равно 'Калькулятор цен'. И так происходит бесконечное количество раз.
    Ответ написан
    Комментировать
  • Как правильно проверить на Null\NaT поле фраймворка pandas и записать его в базу postgres?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    В pandas можно использовать функцию isnull для проверки поля на наличие значения NaN (Not a Number) или NaT (Not a Time). Например, чтобы проверить поле update_dt на наличие значения NaT, можно использовать следующий код:
    df['update_dt'].isnull()
    Этот код вернет булевый сериес, где True указывает на то, что в соответствующей ячейке поля update_dt стоит значение NaT, а False - значение присутствует.

    Чтобы записать эти данные в базу данных, можно использовать конструкцию INSERT INTO ... SELECT ... FROM с вложенным запросом. Вот пример такого запроса, который записывает в таблицу table_name все записи из df, где поле update_dt не равно NaT:
    INSERT INTO table_name (column1, column2, ..., update_dt)
    SELECT column1, column2, ..., update_dt
    FROM df
    WHERE df['update_dt'].isnull() = False
    Ответ написан
    Комментировать
  • Как написать бот для Одноклассников на Python?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Чтобы написать бота для Одноклассников на Python, вам понадобится использовать библиотеку okpy, которая является официальным API для разработки ботов в Одноклассниках.

    Для того чтобы установить библиотеку okpy, выполните следующую команду:

    pip install okpy

    После установки библиотеки вы можете начать работу с ней, импортировав ее в свой скрипт:

    import okpy

    Далее, чтобы авторизоваться в Одноклассниках, вам нужно будет создать экземпляр класса Client и вызвать метод auth(), передав в него логин и пароль:

    client = okpy.Client()
    client.auth('login', 'password')


    После успешной авторизации вы сможете вызывать различные методы API Одноклассников, чтобы отправлять сообщения, получать информацию о пользователях и т. д.

    Вот пример простого бота на Python, который использует библиотеку okpy для авторизации в Одноклассниках и отправки сообщений:

    import okpy
    
    # авторизуемся в Одноклассниках
    client = okpy.Client()
    client.auth('login', 'password')
    
    # отправляем сообщение в чат
    client.messages.send('chat_id', 'Привет, я бот!')
    Ответ написан
    1 комментарий
  • Как сложить все значения массивов с другими значениями массивов в двухмерном массиве?

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

    Например, чтобы сложить все элементы массива array, можно использовать следующий код:
    total = 0
    for row in array:
        for element in row:
            total += element


    В данном случае, total будет содержать сумму всех элементов массива.

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

    Для решения задачи можно использовать следующий код:
    triangle = [
        [75],
        [95, 64],
        [17, 47, 82],
        [18, 35, 87, 10],
        [20, 4, 82, 47, 65],
        [19, 1, 23, 75, 3, 34]
    ]
    
    # создаем новый массив, который будет содержать максимальную сумму пути до каждой вершины
    max_sums = triangle[-1]
    
    # начинаем обработку с нижнего ряда треугольника
    for i in range(len(triangle) - 2, -1, -1):
        # для каждой вершины в ряду выбираем максимальную сумму из соседних вершин в предыдущем ряду
        for j in range(len(triangle[i])):
            max_sums[j] = max(max_sums[j], max_sums[j + 1]) + triangle[i][j]
    
    # максимальная сумма пути будет содержаться в первой вершине массива max_sums
    print(max_sums[0])
    Ответ написан
    Комментировать
  • Как в selenium запустить несколько профилей Chrome одновременно?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Для запуска двух профилей Chrome нужно использовать опцию --user-data-dir.
    • Установите библиотеку selenium с помощью команды pip install selenium
    • Импортируйте необходимые модули:


    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options

    • Создайте экземпляр класса Options и установите опцию --user-data-dir:

    chrome_options = Options()
    chrome_options.add_argument("--user-data-dir=path/to/user/data/dir")

    • Инициализируйте драйвер Chrome с использованием экземпляра chrome_options:


    driver = webdriver.Chrome(chrome_options=chrome_options)

    • Используйте драйвер для выполнения нужных действий.


    Чтобы запустить два профиля Chrome, вы можете повторить эти шаги для каждого из них, указав разные пути к папкам с пользовательскими данными.

    Например, код для запуска двух профилей Chrome может выглядеть так:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    # Настройка первого профиля Chrome
    chrome_options_1 = Options()
    chrome_options_1.add_argument("--user-data-dir=path/to/user/data/dir/1")
    driver_1 = webdriver.Chrome(chrome_options=chrome_options_1)
    
    # Настройка второго профиля Chrome
    chrome_options_2 = Options()
    chrome_options_2.add_argument("--user-data-dir=path/to/user/data/dir/2")
    driver_2 = webdriver.Chrome(chrome_options=chrome_options_2)
    
    # Использование первого профиля Chrome
    driver_1.get("http://www.example.com")
    # Использование второго профиля Chrome
    driver_2.get("http://www.example.com")
    
    # Закрытие браузера первого профиля
    driver_1.quit()
    # Закрытие браузера второго профиля
    driver_2.quit()
    Ответ написан
    Комментировать
  • Как получить список пользователей канала Telegram используя Telethon?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Вот пример кода, который позволит вам получить полный список пользователей канала Telegram с помощью python и библиотеки Telethon:
    # Импортируйте необходимые модули:
    from telethon import TelegramClient
    from telethon.tl.functions.channels import GetParticipantsRequest
    
    # Получите ключи API и секретный ключ для работы с API Telegram. 
    # Для этого нужно зарегистрировать свое приложение на сайте https://my.telegram.org/auth.
    api_id = 123456
    api_hash = 'your_api_hash'
    
    # Создайте экземпляр клиента Telethon:
    client = TelegramClient('session_name', api_id, api_hash)
    
    # Подключитесь к API:
    client.start()
    
    # 6. Получите информацию о канале, в котором вы хотите получить список пользователей. 
    # Для этого можно использовать метод `get_entity`:
    channel = client.get_entity('channel_name')
    
    # Определите функцию для получения списка пользователей:
    def get_channel_users(channel):
        offset = 0
        limit = 100
        all_users = []
    
        while True:
            result = client(GetParticipantsRequest(
                channel=channel,
                filter=ChannelParticipantsSearch(''),
                offset=offset,
                limit=limit,
                hash=0
            ))
            users = result.users
            all_users.extend(users)
            if len(users) < limit:
                break
            offset += limit
        return all_users
    
    # Получите список пользователей канала:
    users = get_channel_users(channel)
    
    # Выведите их на экран:
    for user in users:
        print(user.first_name, user.last_name, user.username)
    Ответ написан
    Комментировать
  • Как установить ImageMagick в Docker?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Чтобы установить ImageMagick в Docker-контейнере и использовать его с помощью библиотеки Wand в Python, вы можете следовать этим шагам:

    • Создайте файл Dockerfile со следующим содержимым:


    FROM python:3.8
    
    # Устанавливаем ImageMagick
    RUN apt-get update && apt-get install -y imagemagick
    
    # Копируем ваш проект в контейнер
    COPY . /app
    
    # Устанавливаем зависимости из requirements.txt
    RUN pip install -r /app/requirements.txt
    
    # Устанавливаем рабочую директорию
    WORKDIR /app
    
    # Запускаем ваш код
    CMD ["python", "main.py"]

    • Добавьте в файл requirements.txt зависимость от библиотеки Wand.

    • Соберите образ Docker, выполнив следующую команду в терминале:

    docker build -t imagemagick .
    Это создаст Docker-образ с именем "imagemagick", содержащий Python и ImageMagick.

    • Запустите контейнер, выполнив следующую команду:

    docker run -it imagemagick
    Теперь вы можете использовать библиотеку Wand в вашем Python-коде
    Ответ написан
    Комментировать
  • Как выполнить звонок через sip с помощью python?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Для выполнения звонка через SIP с помощью Python вы можете использовать библиотеку PySIP.

    Сначала установите библиотеку с помощью pip:

    pip install PySIP
    Затем импортируйте необходимые модули и создайте экземпляр класса SIPCall:
    from pysip import SIPCall
    
    call = SIPCall(
        username='user',
        password='password',
        host='sip.example.com',
        from_header='sip:user@example.com',
        to_header='sip:1234567890@example.com'
    )


    Теперь вы можете вызвать метод call.call(), чтобы совершить звонок:

    call.call()
    Чтобы произнести сообщение во время звонка, вы можете использовать метод call.speak():
    call.speak("Привет, как дела?")
    По окончании разговора вы можете завершить звонок с помощью метода call.hangup():
    call.hangup()
    Пожалуйста, обратите внимание, что для работы этого кода вам может понадобиться настроить SIP-аккаунт и подключить аудиоустройства (например, микрофон)
    Ответ написан
  • Disnake Как воспроизвести файл в голосовом канале?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Для воспроизведения аудио файла в голосовом канале с помощью библиотеки Discord.py вам нужно сначала импортировать необходимые модули:
    import discord
    from discord.ext import commands
    import os

    Затем, создайте экземпляр бота и добавьте команду для воспроизведения аудио:

    bot = commands.Bot(command_prefix='!')
    
    @bot.command()
    async def play(ctx, *, file_name: str):
        voice_channel = ctx.message.author.voice.channel
        if not voice_channel:
            await ctx.send("Вы не находитесь в голосовом канале!")
            return
    
        # Подключаемся к голосовому каналу
        vc = await voice_channel.connect()
    
        # Получаем аудиофайл из папки 'audio_files'
        audio_file = f'audio_files/{file_name}.mp3'
        if not os.path.isfile(audio_file):
            await ctx.send(f"Файл {file_name}.mp3 не найден.")
            return
    
        # Создаем поток аудио
        source = discord.FFmpegPCMAudio(audio_file)
        # Начинаем воспроизведение аудио
        vc.play(source)

    Теперь, когда вы находитесь в голосовом канале, вы можете воспроизвести аудиофайл, отправив команду !play file_name, где file_name - название файла без расширения .mp3.
    Ответ написан
    Комментировать
  • Как правильно передать большое байтовое значение через socket?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Чтобы передать байтовое значение через сокет в Python, вы можете использовать метод send() у объекта сокета. Например:
    import socket
    
    # Создаем сокет
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # Соединяемся с удаленным хостом
    sock.connect(('remote_host', 80))
    
    # Передаем байтовое значение
    data = b'Some binary data'
    sock.send(data)
    
    # Закрываем сокет
    sock.close()

    Обратите внимание, что send() может передать только ограниченное количество данных за раз, поэтому если вы хотите передать большое байтовое значение, вам может понадобиться использовать несколько вызовов send(), чтобы передать все данные. Например:

    import socket
    
    # Создаем сокет
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # Соединяемся с удаленным хостом
    sock.connect(('remote_host', 80))
    
    # Передаем байтовое значение по частям
    data = b'Some very large binary data'
    chunk_size = 1024
    for i in range(0, len(data), chunk_size):
        chunk = data[i:i+chunk_size]
        sock.send(chunk)
    
    # Закрываем сокет
    Ответ написан
  • Возможно ли сделать весь этот код в одной строчке в виде list comprehension?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    import random
    
    field = [[0 if random.randint(0, 2) == a else 1 for a in range(3)] for _ in range(5)]
    
    print(field)
    Ответ написан
    Комментировать
  • Как прочитать HEX файл в список Python?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Чтобы прочитать HEX файл в список Python, вы можете воспользоваться следующим кодом:
    # Открываем файл в режиме "rb" (бинарный режим чтения)
    with open('file.hex', 'rb') as f:
        # Читаем содержимое файла в виде байтов
        data = f.read()
    
    # Преобразуем байты в список шестнадцатеричных чисел
    hex_list = [hex(b)[2:] for b in data]
    
    # Выведем список на экран
    print(hex_list)
    Ответ написан
    Комментировать
  • Как получить все кнопки с div и прогнать из через for?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Чтобы нажать все кнопки внутри div с помощью Selenium, вы можете воспользоваться следующим кодом:

    from selenium import webdriver
    
    # Инициализируем веб-драйвер
    driver = webdriver.Firefox()
    
    # Открываем нужную страницу
    driver.get('https://example.com')
    
    # Находим все кнопки внутри div
    buttons = driver.find_elements_by_css_selector('div.js-tpl-tasks-list button')
    
    # Перебираем все кнопки и нажимаем на каждую
    for button in buttons:
        button.click()
    
    # Закрываем веб-драйвер
    driver.quit()
    Ответ написан
    Комментировать
  • Как вставить текст в html тег textarea Selenium?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Вы можете использовать метод send_keys для элемента textarea в Selenium для вставки текста. Например:
    from selenium import webdriver
    
    # Инициализируем браузер
    driver = webdriver.Chrome()
    
    # Переходим на нужную страницу
    driver.get('https://example.com')
    
    # Находим элемент textarea на странице
    textarea = driver.find_element_by_css_selector('textarea')
    
    # Вставляем текст в textarea
    textarea.send_keys('Ваш текст')
    
    # Можете также использовать метод clear, чтобы удалить все содержимое textarea перед вставкой текста
    textarea.clear()
    textarea.send_keys('Новый текст')

    Обратите внимание, что вам нужно будет импортировать модуль webdriver из библиотеки Selenium и указать путь к драйверу браузера (например, ChromeDriver или GeckoDriver). Также убедитесь, что у вас установлен необходимый браузер (например, Google Chrome).
    Ответ написан
    2 комментария
  • Disnake.py, как сделать передачу денег другому участнику?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Вот примерный код команды для Discord бота на Python с использованием Disnake:

    import sqlite3
    
    from disnake import Command, Member
    
    # Определяем команду для перевода суммы другому участнику
    @Command("transfer", description="Перевод суммы другому участнику")
    async def transfer(member: Member, target: Member, amount: int):
        # Подключаемся к локальной базе данных sqlite
        conn = sqlite3.connect("database.db")
        cursor = conn.cursor()
    
        # Проверяем, хватает ли у текущего пользователя суммы для перевода
        cursor.execute(f"SELECT balance FROM users WHERE id = {member.id}")
        balance = cursor.fetchone()[0]
        if balance < amount:
            await member.send("У вас недостаточно средств для перевода")
            return
    
        # Снимаем сумму с аккаунта текущего пользователя
        cursor.execute(f"UPDATE users SET balance = balance - {amount} WHERE id = {member.id}")
        conn.commit()
    
        # Начисляем указанную сумму на аккаунт другого пользователя
        cursor.execute(f"UPDATE users SET balance = balance + {amount} WHERE id = {target.id}")
        conn.commit()
    
        await member.send(f"Сумма {amount} была переведена на аккаунт {target.name}")
    Ответ написан
    2 комментария
  • Как добавить Dockerfile в существующий .tar архив с помощью python tarfile?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Для добавления файла Dockerfile в существующий .tar архив с помощью модуля tarfile в Python можно использовать следующий код:

    import tarfile
    
    # Открываем существующий .tar архив в режиме добавления файлов
    with tarfile.open('existing_archive.tar', mode='a') as tar:
      # Добавляем файл Dockerfile в архив
      tar.add('Dockerfile')

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

    import tarfile
    
    with tarfile.open('existing_archive.tar', mode='a') as tar:
      tar.add('Dockerfile', arcname='custom_name.txt')

    Обратите внимание, что указанный код открывает архив в режиме добавления файлов (mode='a'). Если вы хотите открыть архив в режиме чтения (mode='r'), то не сможете добавить файлы в него. Также существует режим создания нового архива (mode='w'), который перезапишет существующий файл, если такой будет существовать.
    Ответ написан
    Комментировать
  • Как отправить переменную вместе с сообщением?

    gnifajio
    @gnifajio
    Совершенствуюсь каждый день
    Я советую вам сначала выучить python, а потом уже делать ботов.
    В ответ на ваш вопрос я могу дать вам это (машины состояний).
    Советую к прочтению.
    Ответ написан
    Комментировать