• Как получить и обработать событие с помощью Observer и встроить эту функцию в поток?

    Vindicar
    @Vindicar
    RTFM!
    Документация советует run_coroutine_threadsafe(). Эта функция позволяет запланировать вызов корутины с параметрами (читай, эквивалент await вызова) в рамках рабочего цикла (loop) asyncio, который крутится в другом потоке. С полученным future можно что-то сделать, например, подождать, пока оно реализуется. Пример по ссылке.
    Ответ написан
    Комментировать
  • Как запустить скрипт на Python с использованием сторонних библиотек?

    Vindicar
    @Vindicar
    RTFM!
    Запускай, используя python.exe из виртуального окружения.
    Ответ написан
  • Как заставить питон преобразовать значения столбца к формату?

    Vindicar
    @Vindicar
    RTFM!
    Ну т.е. у тебя два формата, по сути. Первый A-B/C/DE, где A - одна цифра, B - 4 цифры, C - 2 или 3 цифры, D - от 0 до 2 цифр, E - 2 цифры. Тебе нужно извлечь две части: A-B/C и E, и использовать их как ключ. В виде регулярки это будет что-то типа (\d-\d{4}/\d{2,3}/)\d{0,2}(\d{2}). Пример:
    import re
    r = re.compile(r'(\d-\d{4}/\d{2,3}/)\d{0,2}(\d{2})')
    m = r.match("1-2345/678/0099")
    print(m.groups())  # выведет ('1-2345/678/', '99')

    Для второго формата всё ещё проще, там будет 9 цифр подряд: (\d{9})
    import re
    r = re.compile(r'(\d{9})')
    m = r.match("123456789")
    print(m.groups())  # выведет ('123456789', )

    Как применить это к своим данным, разбирайся - я не знаю, как они представлены.
    И да, код от чатгпт лучше не брать. Он обычно не работает, и его проще переписать, чем поправить.
    Ответ написан
    2 комментария
  • Что посоветуете по GUI для питона?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону kivy.
    wxWidgets и tkinter лучше подходят для мелких программ, имхо.
    Ответ написан
    Комментировать
  • Как удалить уникальные дубли?

    Vindicar
    @Vindicar
    RTFM!
    Ну слушай, если пишут совсем кто как, то ничего не поделаешь. Как ты определишь, вариантом названия какой компании является текущее?

    Да, можно использовать расстояние Левенштейна для поиска наиболее похожих строк, но и тогда нет гарантий, что пользователь не извратит название достаточно сильно.
    Можно использовать регулярки из модуля re, но их придётся для каждой компании составлять вручную.

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

    Vindicar
    @Vindicar
    RTFM!
    Ну если не ограничивать себя видеоуроками, а узнать, как именно работает Web, то можно догадаться до первого шага по отладке такой ситуации:
    Сохрани ответ сайта в файл и посмотри, что тебе пришло на самом деле.

    Во-первых, сайт может отдавать разные страницы боту и браузеру, особенно если запросы от них не идентичны. Более того, владелец сайта нередко заинтересован в том, чтобы обнаруживать ботов и слать им не запрашиваемую страницу, а что-то другое - чтоб неповадно парсить было.

    Во-вторых, современные сайты - это не статические странички аля 1991й год. Они зачастую битком набиты JS-скриптами, которые исполняются в среде браузера. Поэтому нередко сайт отдаёт страницу-заглушку, на которую средствами скрипта уже подгружается контент. BeautifulSoup не исполняет JS, это не его задача, а потому ты увидишь только заглушку, и больше ничего.
    Ответ написан
    3 комментария
  • Как рисовать блок схемы для функциональных программ?

    Vindicar
    @Vindicar
    RTFM!
    Я бы посмотрел в сторону диаграмм потоков данных (DFD). В них процесс - это преобразователь входных данных в выходные, т.е. практически эквивалент чистой функции, а хранимое состояние отмечается отдельно.
    Ответ написан
    Комментировать
  • Как создать математического бота в телеграмм на питоне?

    Vindicar
    @Vindicar
    RTFM!
    Зависит от текущего уровня знаний.
    1. Убедись, что знаешь хотя бы основы языка Python и умеешь искать недостающую информацию.
    2. Освой хотя бы фреймворк для работы с телегой, типа pyTelegramBotAPI или Aiogram.
    Напиши пару простых ботов, для начала - эхобот.
    3. Продумай сценарий взаимодействия пользователя с ботом. Какие инструменты потребуются? Будет ли взаимодействие на уровне "команда - ответ", или же понадобятся сценарии (FSM)?
    4. Посмотри, есть ли в выбранном фрейсмворке нужные инструменты, попробуй их освоить на примере простых ботов.
    5. Приступай к своему боту.
    Ответ написан
    Комментировать
  • Как вызвать одну функцию из другой в discord боте?

    Vindicar
    @Vindicar
    RTFM!
    Советую не пытаться удалять гланды через противоположный конец тела. А именно:
    Вместо того, чтобы пытаться вызвать обработчик команды, и биться об стенку, пытаясь имитировать всё необходимое окружение, следует просто вынести непосредственно операцию поиска в ОТДЕЛЬНУЮ функцию.
    Собственно, в твоём случае было бы норм и просто вызвать
    search_results = googlesearch.search(query, num_results=3)
    внутри ask(), и обработать полученные результаты - невелико повторение. Я бы сделал именно так.

    Если прям очень хочется сделать общий код для двух команд, вынеси в отдельную функцию и вывод:
    # Messageable - это что-то, чему можно послать текстовое сообщение. Это может быть канал, пользователь, контекст команды...
    async def search_and_reply(query: str, ctx: discord.abc.Messageable) -> None:
        try:
            search_results = googlesearch.search(query, num_results=3) 
            if search_results:
                await ctx.send("Результаты поиска в Google:")
                for result in search_results:
                    await ctx.send(result)
            else:
                await ctx.send("Ничего не найдено.")
        except Exception as e:
            await ctx.send(f"Произошла ошибка при выполнении поиска: {str(e)}")

    И тогда у тебя будет всё проще: search() будет состоять из одного вызова await search_and_reply(query, ctx), но будет брать на себя регистрацию как обработчика команды, проверку ролей и кулдаунов, и прочую мишуру, которой не место внутри search_and_reply(). Тогда ask() может просто сделать аналогичный вызов await search_and_reply(query, channel) в нужный момент, не беспокоясь о специфике дискорд-обработчика, так как search_and_reply() таковым не является.
    Ответ написан
    Комментировать
  • WebSocket connection to 'wss://localhost:12345/' failed в чем ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Коннектится надо не на localhost, а на тот домен, для которого выпущен твой сертификат. Иначе обломаешься на уровне TLS-соединения (сертификат не для того домена).
    Ответ написан
  • Я пишу музыкального бота для Discorda, но выводит ошибки. Не могу понять в чем именно проблема?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же прямым английским текстом написано: ты обращаешься к объекту, описывающему сервер(гильду), и пытаешься у него добыть свойство voice, а такого свойства нет.
    server.voice.channels - получить у объекта сервер свойство voice, а у объекта в этом свойстве - свойство channels.
    И в документации свойства voice у объектов класса Guild тоже нет. Зато есть voice_channels.
    Ответ написан
    Комментировать
  • Как из цикла for получить последовательный ответ в одну строку?

    Vindicar
    @Vindicar
    RTFM!
    Советую поучить стандартную библиотеку языка, а потом уже браться за такие вещи.
    У тебя в коде уже есть пример, как список строк превратить в одну строку, соединив их разделителем.
    spisok = "".join(llavw)
    В чём проблема адаптировать этот же метод к твоей задаче? Сформируй список из отдельных строк, потом объедини их. Единственно, стоит убедиться, что ты подаёшь на вход именно список строк, а не каких-то других объектов.
    Ответ написан
    8 комментариев
  • Как исправить ошибку tkinter Python?

    Vindicar
    @Vindicar
    RTFM!
    Значит, ты в какой-то момент делаешь в глобальной области видимости присваивание вида execute = tkinter.Button(...)
    Ответ написан
    1 комментарий
  • Как распознать тип движения с помощью opencv?

    Vindicar
    @Vindicar
    RTFM!
    Можешь познакомиться с этой лекцией, там есть интересные идеи.
    Ответ написан
    Комментировать
  • Ког не загрузился, как решить?

    Vindicar
    @Vindicar
    RTFM!
    Читаем документацию на класс disnake.Client, видим, что никакого атрибута cluster там нет.
    Почему ког обращается к этому атрибуту - спрашивай того, кто этот код написал.
    Ответ написан
    Комментировать
  • Ошибка при скачивании pdf-файлов, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Легко проверить. Ты делаешь:
    url = "https://file.11klasov.net/index.php?do=download&id=16985" # замените на URL файла, который вы хотите скачать
    response = requests.get(url)

    Затем посмотри атрибут response.history, и ты увидишь там два ответа: [<Response [302]>, <Response [301]>]. Все коды 3XX - это перенаправления, т.е. сайт тебя перенаправляет на другую страницу, вместо того, чтобы отдать контент.
    Итог этих перенаправлений можно узнать из response.url, который будет равен
    'https://file.11klasov.net/13938-russkij-jazyk-7-klass-razumovskaja-mm-lvova-si-kapinos-vi-i-dr.html'

    Т.е. сайт задетектил бота, и отправил тебя на страницу учебника. Так обычно борятся с хотлинкингом, когда кто-то ставит прямую ссылку на файл на твоём сайте.
    Также можно проверить response.headers['content-type']. Он будет 'text/html; charset=utf-8', т.е. это HTML страница а не PDF файл. Разумеется, если ты HTML страницу запишешь в файл с расширением .pdf, она от этого не станет валидным PDF.

    Обычно проверяются две вещи: User-Agent и Referer. Первый описывает браузер пользователя, второй - с какой страницы был переход по этой ссылке. Но для данного сайта, похоже, достаточно добавить только Referer вот так:
    response2 = requests.get(url, headers={
        'referer': response.url,  # ну или 'https://file.11klasov.net/13938-russkij-jazyk-7-klass-razumovskaja-mm-lvova-si-kapinos-vi-i-dr.html'
    })

    То получишь желаемое - response2.history будет пустой, а response2.headers['content-type'] будет равен 'application/pdf'.

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

    Vindicar
    @Vindicar
    RTFM!
    Я обычно использую запрос вида
    inurl:qna.habr.com/q/ "@Username" Ключевые слова для поиска

    К сожалению, по URL qna.habr.com/user/Username/answers гугл не ищет, хотя в robots.txt он не запрещён.
    Ответ написан
    Комментировать
  • Как убрать символы [] () '', при выводе информации из списка?

    Vindicar
    @Vindicar
    RTFM!
    Перебирай элементы циклом for и выводи по одному, или используй str.join().
    print(', '.join(a))
    Ответ написан
  • Что делать при данной ошибке?

    Vindicar
    @Vindicar
    RTFM!
    Вместо
    member_full = bot.get_user(id=id)
    banned_users = await ctx.guild.bans()
    for ban in banned_users: ...

    Нужно
    member_full = bot.get_user(id=id)
    async for ban in ctx.guild.bans(): ...

    async for x in y - это не то же самое, что и for x in await y. Асинхронный генератор (первый случай) каждый элемент запрашивает асинхронно, а во втором случае - асинхронно запрашивается вся коллекция, которая потом синхронно итерируется. Разные подходы, разные методы, так что объект вполне может поддерживать только один из них.
    Ответ написан
    Комментировать