• Почему бот не хочет реагировать в беседах?

    drygdryg
    @drygdryg
    Python-разработчик
    ...
            if event.from_user and not event.from_me and event.text.startswith('/mchatgpt'):
    ...

    Здесь вы проверяете, что сообщение пришло от пользователя. Если сообщение пришло из беседы, то event.from_user == False. Можно сделать так:

    ...
            if ((event.from_user or event.from_chat) and not event.from_me) and event.text.startswith('/mchatgpt'):
    ...


    Если вы создаёте чат-ботов для ВКонтакте, то советую обратить внимание на фреймворк vkbottle: https://github.com/vkbottle/vkbottle
    Ответ написан
    Комментировать
  • Можно ли отправить пост в предложку группы VK используя access token?

    drygdryg
    @drygdryg
    Python-разработчик
    Предложить запись на стене можно с использованием метода API wall.post. В документации указано, что этот метод можно вызвать с использованием с ключом доступа пользователя (access token), полученным в Standalone-приложении через Implicit Flow.
    Существует также неофициальный, на мой взгляд, более простой способ получения ключа доступа через известные приложения ВК (VK Admin, Kate Mobile и пр.), но используйте его на свой страх и риск: https://vkhost.github.io/
    Ответ написан
  • Может ли телеграм бот логировать факт выхода пользователя из чата?

    drygdryg
    @drygdryg
    Python-разработчик
    Может. Реагируйте на апдейты, содержащие сообщения, в которых есть поле left_chat_member. Поле содержит объект User, в котором есть информация о пользователе, покинувшем чат.
    Ответ написан
    Комментировать
  • Как добавить текст на картинку в тг боте?

    drygdryg
    @drygdryg
    Python-разработчик
    Для рисования текста на изображениях по заданным координатам можно использовать Pillow.
    https://pillow.readthedocs.io/en/stable/reference/...
    Ответ написан
    Комментировать
  • Как реализовать удаленный доступ к SSH, имея серый ip?

    drygdryg
    @drygdryg
    Python-разработчик
    Если имеется постоянно работающий компьютер с публичным IP-адресом (например, VPS), можно настроить на нём сервер Fast reverse proxy (frp), а на Raspberry pi — клиент frp. Клиент должен будет подключаться к серверу и пробрасывать туда свой порт SSH, отображая его на какой-либо порт сервера. После этого вы сможете подключиться к проброшенному SSH по публичному IP-адресу и указанному порту.
    Преимущество этого решения в том, что оно не требует VPN-канала и полностью прозрачно для SSH-клиентов, но при этом frp поддерживает аутентификацию и другие интересные инструменты вроде интерфейса со сводкой подключений.
    Пример такой настройки в официальной документации: https://github.com/fatedier/frp/blob/39941117b6f8c...
    Ответ написан
    Комментировать
  • Как отправлять рандомные сообщения через telethon?

    drygdryg
    @drygdryg
    Python-разработчик
    Вынесите вызовы random.choice из модуля text в отдельную функцию, и перед отправкой каждый раз вызывайте эту функцию. Например:
    def generate_random_sentence():
        """Создаёт случайное предложение"""
        ky = ['text', 'text2']
        k = random.choice(ky)
    
        zax = ['text', 'text2', 'text3']
        z = random.choice(zax)
    
        magz = ['text', 'text2', 'text3', 'text4']
        m = random.choice(magz)
    
        return f"{k}. {z} в {m}"
    Ответ написан
    Комментировать
  • Почему ошибка при импорте видео через tkvideo?

    drygdryg
    @drygdryg
    Python-разработчик
    ...
    RuntimeError: No ffmpeg exe could be found. Install ffmpeg on your system, or set the IMAGEIO_FFMPEG_EXE environment variable.

    Установите ffmpeg в ваше окружение (операционную систему) и добавьте путь к исполняемому файлу ffmpeg в переменную окружения PATH.
    Ответ написан
  • Почему запрос на сервер с использованием модели pydantic получает ошибку (FastAPI)?

    drygdryg
    @drygdryg
    Python-разработчик
    Здесь вы создали маршрут, который принимает GET-запрос с обязательным JSON-телом:
    @app.get('/user')
    def get_user(req: requests.IGetUser):
        return {}

    Но из axios вы отправляете GET-запрос с телом в формате формы (application/x-www-form-urlencoded), а не JSON, поэтому происходит ошибка валидации запроса и возвращается код ответа 422.
    Лучше принимайте "email" и "password" в параметрах запроса (query parameters), а не в теле, т.к., в общем, не рекомендуется отправлять GET-запросы с телом: для отправки полезной нагрузки (в формате JSON, формы и пр.) обычно используют другие типы запросов (POST, PUT, PATCH и пр.) Как принимать параметры запросов в FastAPI, описано в официальной документации.
    В вашем случае можно сделать так:
    @app.get('/user')
    def get_user(email: str, password: str):
        return {}

    Тогда запрос из axios можно отправлять так:
    axios.get('http://localhost:8000/user', {
            params: {
                email: 'user',
                password: 'user'
            }
        }).then(r =>
            console.log(r)
        )
    Ответ написан
    Комментировать
  • Как использовать aiogram + flask (or only aiogram) для обработок платежей в боте телеграм?

    drygdryg
    @drygdryg
    Python-разработчик
    Flask — синхронный WSGI-фреймворк: в нём используется блокирующий ввод-вывод (I/O). aiogram — асинхронный фреймворк: в нём используется asyncio для неблокирующего I/O. Когда вы запускаете Flask-приложение (например, с помощью сервера Werkzeug), вы, говоря простыми словами, блокируете ввод-вывод асинхронному веб-серверу aiohttp, который используется "под капотом" aiogram для обработки входящих webhook-запросов.
    Вы можете запускать Flask-приложение в отдельном процессе (это лучше, чем в отдельном потоке), либо использовать для своего веб-хука сервер aiohttp вместо Flask c тем же aiohttp-приложением, которое использует aiogram, просто добавив в него нужные маршруты и хэндлеры. Пример такого совмещения с aiogram v3: https://github.com/aiogram/aiogram/blob/dev-3.x/ex...
    Ответ написан
    2 комментария
  • Как запустить фоновую функцию в боте телеграм построенную на библиотеке aoigram?

    drygdryg
    @drygdryg
    Python-разработчик
    Во-первых, если вы хотите выполнять фоновую задачу в том же процессе, где работает aiogram, не используйте библиотеки с блокирующим вводом/выводом (каковой является Requests), иначе ваш бот будет блокироваться (не будет реагировать на события из Telegram) во время осуществления HTTP-запроса. Лучше использовать асинхронные aiohttp либо httpx.
    Если при выполнении вашей задачи больше всего времени занимает ввод-вывод (то есть она является I/O-bound), можно использовать AsyncIOScheduler из APScheduler и делать асинхронный HTTP-запрос через aiohttp либо httpx.
    В противном случае, если больше всего времени занимают вычисления (то есть задача является CPU-bound), можно использовать BackgroundScheduler из того же APScheduler и делать синхронный HTTP-запрос через Requests или httpx. В качестве executor'а используйте ProcessPoolExecutor, чтобы задача выполнялась в отдельном процессе и по возможности на отдельном ядре CPU.
    https://apscheduler.readthedocs.io/en/3.x/userguid...
    UPD: если не требуется столь мощный функционал планирования задач, который предоставляет APScheduler, и всего лишь нужно выполнить функцию прямо сейчас, просто создавайте задачу asyncio, как упомянул выше SHADRIN.
    Ответ написан
    Комментировать
  • Что такое типы данных и в каких случаях лучше использовать определённый тип данных?

    drygdryg
    @drygdryg
    Python-разработчик
    В Python все типы данных делятся на изменяемые (англ. mutable) и неизменяемые (англ. immutable). Неизменяемые типы данных (например, строка, кортеж, frozenset) имеют несколько особенностей:
    - занимают меньше места в памяти, чем их изменяемые аналоги;
    - являются хэшируемыми (англ. hashable).
    Хэшируемые типы данных в отличие от нехэшируемых можно использовать в качестве ключей словарей, а также они могут быть элементами множеств.
    >>> a_set = frozenset({1, 2, 3})
    >>> hash(a_set)
    -272375401224217160
    >>> a_list = [1, 2, 3]
    >>> hash(a_list)  # Ошибка: список - нехэшируемый тип данных
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    >>> a_dict = {[1, 2, 3]: 'example_value'}  # Ошибка: нельзя использовать нехэшируемые типы данных как ключи словаря
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    >>> a_dict = {(1, 2, 3): 'example_value'}  # но можно использовать хэшируемые
    >>> a_dict
    {(1, 2, 3): 'example_value'}

    Неизменяемые типы данных имеют меньший размер (объём занимаемой оперативной памяти):
    >>> import sys
    >>> sys.getsizeof([1, 2, 3])  # Изменяемый тип данных list
    88
    >>> sys.getsizeof((1, 2, 3))  # Неизменяемый тип данных tuple
    64


    Вывод: используйте неизменяемые аналоги изменяемых типов данных тогда, когда вы хотите оптимизировать быстродействие своей программы и точно знаете, что вам никогда не потребуется изменять значения внутри структуры данных (например, когда вы получаете данные из внешнего источника по протоколу HTTP и читаете их), либо когда данные нужно использовать в качестве ключа словаря или использовать внутри множества.
    Ответ написан
    Комментировать
  • Eсть функция которая извлечет нужные числа из текста?

    drygdryg
    @drygdryg
    Python-разработчик
    Используйте регулярные выражения.
    Ответ написан
    Комментировать
  • Работа скрипта по времени из БД?

    drygdryg
    @drygdryg
    Python-разработчик
    Используйте планировщик либо очередь задач, который(ая) поддерживает отложенное выполнение, например, APScheduler: создавайте задачу с выполнением в указанное время. Для планирования задачи можно периодически проверять (опрашивать) базу данных на наличие новых записей, и если таковые имеются, планировать для них задачи через планировщик, а записи удалять из базы.
    Но ещё лучше будет выяснить, откуда попадают time и chat_id в БД, и по возможности оттуда сразу же создавать задачу в планировщике, а не записывать в БД.
    Ответ написан
    1 комментарий
  • Как правильно держать переменную в файле в оперативной памяти linux?

    drygdryg
    @drygdryg
    Python-разработчик
    Используйте файловую систему tmpfs, она хранит данные в области ОЗУ.
    Можно хранить файл в директории /tmp: в большинстве дистрибутивов она смонтирована как tmpfs (но лучше сначала убедиться в этом командой mount). Либо же можно смонтировать любую другую директорию как tmpfs в оперативную память, например:
    sudo mount -t tmpfs -o size=10M tmpfs /mnt/mytmpfs
    Ответ написан
    3 комментария
  • Как из отформатированной строки преобразовать в словарь?

    drygdryg
    @drygdryg
    Python-разработчик
    Например, так:
    my_dict = {'example': [1, 2, 3]}
    lines = ['{}|{}'.format(k, '|'.join(map(str, v))) for k, v in my_dict.items()]
    print('\n'.join(lines))
    my_reconstructed_dict = {k: [int(i) for i in v.split('|')] for k, v in (i.split('|', maxsplit=1) for i in lines)}
    assert my_reconstructed_dict == my_dict
    Ответ написан
    Комментировать
  • Можно ли добавить бота telegram в чат между двумя пользователями?

    drygdryg
    @drygdryg
    Python-разработчик
    Добавлять ботов в диалоги на данный момент невозможно. Но можно в группы, как вы верно отметили, даже если в группе два пользователя.
    Новая функция, которую вы упомянули в вопросе, позволяет по нажатию инлайн-кнопки из сообщения от бота делиться пользователями (например, своими контактами) или группами с ботом, то есть отправлять их идентификаторы боту.
    Ответ написан
    3 комментария
  • Как отформатировать вывод value словаря в python?

    drygdryg
    @drygdryg
    Python-разработчик
    Вам нужно отдельно соединять списки v в строки, прежде чем передавать их в str.format():
    my_dict = {'example': [1, 2, 3]}
    lines = ['{}|{}'.format(k, '|'.join(map(str, v))) for k, v in my_dict.items()]
    print('\n'.join(lines))

    Результат:
    example|1|2|3
    Ответ написан
    1 комментарий
  • Как можно реализовать бан по устройству во flask?

    drygdryg
    @drygdryg
    Python-разработчик
    Если ваше приложение имеет фронтенд, который предназначен для запуска в веб-браузере, то лучше делайте отпечатки клиентов на стороне фронтенда средствами JavaScript, затем отправляйте их на бэкенд. Поищите информацию про способы снятия отпечатков браузера (browser fingerprinting) в сети. Обратите внимание на библиотеку FingerprintJS.

    Если нет возможности запускать JavaScript в браузере клиента либо вообще веб-сервис ориентирован не на браузер, то можно использовать различные техники снятия отпечатков на бэкенде. Для их реализации, скорее всего, потребуются техники низкоуровневого сетевого программирования (чтение необработанных заголовков HTTP-запроса и др.), возможно, выходящие за рамки стандартный возможностей Flask. Некоторые материалы по теме:
    https://lwthiker.com/networks/2022/06/17/http2-fin...
    https://github.com/CERT-Polska/hfinger

    Идентификация по IP-адресу — не очень надёжный способ, т.к. в сети может присутствовать множество клиентов с одним и тем же внешним IP-адресом (к примеру, если у интернет-провайдера используется NAT, либо в публичных сетях Wi-Fi).
    Ответ написан
  • Где искать документации(по пайтон)?

    drygdryg
    @drygdryg
    Python-разработчик
    Для работы с официальной документацией Python и поиска по ней можно использовать сервис DevDocs: https://devdocs.io/python/
    Он удобен тем, что позволяет искать по документации к различным версиям Python одновременно. Также он позволяет скачивать документацию и читать её без подключения к интернету, следить за своевременным обновлением скачанных документаций.
    Ответ написан
    Комментировать
  • Как вывести все качества видео одного видео pytube?

    drygdryg
    @drygdryg
    Python-разработчик
    Например, так:
    from pytube import YouTube
    
    yt = YouTube("https://youtu.be/uCNWuSbPnt4")
    resolutions = sorted(
        set(stream.resolution for stream in yt.streams.filter(type='video')),
        key=lambda s: int(s.split('p')[0])
    )
    print(*resolutions, sep='\n')

    Результат выполнения программы:
    144p
    240p
    360p
    480p
    720p
    1080p
    1440p
    2160p
    Ответ написан
    Комментировать