Задать вопрос
  • Как обойти запрет на отправку Embed сообщения?

    Vindicar
    @Vindicar
    RTFM!
    1. Какие интенты (intents) запрашиваешь?
    2. Выданы ли соответствующие права роли бота в настройках сервера?
    Ответ написан
  • Бот не пишет сообщение при входи участника (дискорд бот). В чём проблема?

    Vindicar
    @Vindicar
    RTFM!
    1. Права у бота точно есть? Участник может запретить приваты не от контактов, например.
    2. Проверь интенты, запрашиваемые ботом, и разрешённые в настройках учетки бота. Бот вообще получает событие on_member_join?
    Ответ написан
    Комментировать
  • Как сдетектировать последовательность сигнала с амплитудной модуляцией?

    Vindicar
    @Vindicar
    RTFM!
    Можно взять пакет numpy, загрузить в массив результат развёртки сигнала, прогнать преобразование Фурье (numpy.fft.fft() и numpy.fft.fftfreq() в помощь).
    Если сигнал именно с амплитудной модуляцией, то на полученном спектре амплитуд должен выделяться пик несущей частоты и её гармоники. Его можно определить либо поиском максимума, либо поиском такой частоты, сумма гармоник (т.е. x2, x3, x4 и т.д.) которой максимальна.
    Затем сглаживаешь эти гармоники (например, заменяешь на среднее), и в идеале получаешь форму огибающей, т.е. самого сигнала (+ шум).
    Я делал нечто похожее, когда нужно было убрать из сигнала тензодатчика 50Гц наводки от осветительной сети.
    Вот сигнал (серый - до частотного фильтра, черный - после, синий - после доп. сглаживания).
    614a4ecbc2152580856422.png
    Вот спектр (серый - до, черный - после), на нём видны "убранные" пики.
    614a4eec01b14169796442.png
    Реализация у меня была колхозная, но свою задачу выполнила.
    Ответ написан
    1 комментарий
  • Как с помощью Selenium получить нужные ссылки?

    Vindicar
    @Vindicar
    RTFM!
    > find_element_by_partial_link_text
    Я подозреваю, это проверяет innerText ссылки, а не её href. Ищи по атрибуту.
    Ответ написан
  • Как в регулярке задать диапазон и символы?

    Vindicar
    @Vindicar
    RTFM!
    во-первых, \что-то - это способ задания символа в строке.
    В регулярках этот синтаксис имеет своё значение.
    Как следствие этого конфликта, нужно делать одно из двух.
    re.search("\\d[0-9A-Za-z]{1,5}", data) #удваиваем \
    re.search(r"\d[0-9A-Za-z]{1,5}", data) #используем r-строку, чтобы отключить обычную обработку \

    Ну и да, в "{1,5}" не должно быть пробела.
    Ответ написан
  • Как принять аргумент в команду после её использования в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Это непрактично.

    Тебе нужно для каждого пользователя хранить команду, которую он сейчас выполняет, хранить шаг (номер аргумента), на котором он сейчас находится, и хранить ранее введённые данные.

    И тогда при получении сообщения:
    1. проверять, не является ли сообщение командой, если является - обрабатывать отдельно.
    2. определить, какой шаг обработки какой команды сейчас активен для этого пользователя
    3. интерпретировать введённое сообщение соответственно.
    Ответ написан
  • Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.user_id, что делать?

    Vindicar
    @Vindicar
    RTFM!
    message.from_user.id in cursor.execute('SELECT user_id FROM users')
    На кой нужно делать выборку всех пользователей, чтобы потом питоном искать в ней данные? Используй ключевое слово WHERE, и используй prepared statement для подстановки значения из переменной, а не форматирование строк.

    f'UPDATE users SET user_id = {message.from_user.id} WHERE user_id = {message.from_user.id}'
    "Если id = 1, то сделай id равным 1". На кой?!
    И да, не используй форматирование строк для формирования строки запроса. Используй prepared statements.

    Например так:
    ids = cursor.execute('SELECT user_id FROM users WHERE user_id = ?', (message.from_user.id,))


    > не понимаю в чем проблема
    В недостатке знаний по основам SQL, и в попытке писать ботов, не разобравшись в основах.
    Ответ написан
    2 комментария
  • Как интегрировать сайт на WordPress с телеграмм ботом на Pyhton?

    Vindicar
    @Vindicar
    RTFM!
    Ну встречный вопрос: а нужно ли? Не будет ли проще оставить рассылку отдельным ботом, а новый функционал, не связанный с сайтом, реализовать отдельно?

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

    Vindicar
    @Vindicar
    RTFM!
    Опиши в дочерней форме кастомные события, соответствующее нажатию на эти кнопки.
    В главной форме сразу после создания дочерней формы подпишись на эти события и добавь обработчики с нужной тебе логикой реагирования. Если нужно пробросить данные из дочерней формы, это уже второй вопрос, но можно пробросить их как параметры обработчика события.

    А вообще, если у тебя дочерняя форма рулит главной, то что-то пошло не так.

    EDIT: Всё проще. Используй ShowDialog().
    Ответ написан
    3 комментария
  • Ошибка декодирования строки в base64, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Invalid base64-encoded string: number of data characters (1097) cannot be 1 more than a multiple of 4

    У тебя левые данные в декодируемой строке. Какой-нибудь перевод строки (\n) или подобное не затесался в начало/конец?
    Ответ написан
    Комментировать
  • Как найти одно изображение на другом изображении?

    Vindicar
    @Vindicar
    RTFM!
    Терминология для гуглинга: "Локализация объекта методами компьтерного зрения".
    В качестве инструментария можешь использовать opencv. Для питона это pip пакет python-opencv (импортируется под именем cv2).

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

    Подходы существуют разные. Если не требуется дикоре быстродействие, то можно использовать детектор SIFT.
    Тогда у тебя будет алгоритм вида:
    0. Создаёшь детектор (функция cv2.SIFT.create()) и матчер (можно cv2.BFMatcher(), он тормознутый но простой в использовании).
    1. Грузишь образец искомого объекта и преобразуешь изображения (палитра серого, и т.п.)
    2. Вызываешь метод детектора .detectAndCompute(), чтобы получить найденные особые точки (углы и т.п.) и их описание.
    3. Повторяешь шаги 1,2 для анализируемого изображения (сцены).
    4. У матчера вызываешь метод .knnMatch() c n=2. Это даст тебе 2 лучших совпадения между образцом и сценой по каждой особой точке.
    5. Можно просто брать лучшее совпадение, а можно отсеять те особые точки, у которых два ближайших совпадения слишком похожи - они отсеялись.
    Так или иначе, у тебя должен получиться список пар точек вида "точка на образце - найденная похожая точка на сцене".
    6. Используешь функцию cv2.findHomography() или одну из родственных ей, чтобы найти матрицу преобразования. Грубо говоря, она позволит пересчитать позицию пикселя на изображении образца в позицию пикселя на изображении сцены.
    Примерно так, если представить это наглядно (чтобы получить такую картинку, нужно еще несколько шагов, но она передаёт идею).
    homography_findobj.jpg
    7. Дальше ты можешь использовать эту матрицу как хочешь. Например, возьми координаты центра объекта на изображении-образце, и используй её вместе с cv2.perspectiveTransform(), чтобы найти, где на сцене координаты точки центра объекта. Взяв ещё точку (в углу или на краю), сможешь найти ориентацию.

    Проблема в том, что этот подход работает ТОЛЬКО если в сцене не более одного похожего объекта.

    Код не привожу, набросай черновик сам, тогда можно будет его обсудить и подкорректировать. Если что, в сети можно много найти инфы по использованию opencv для решения этой задачи.
    Ответ написан
    4 комментария
  • Остановить поток. Прекратить выполнять задачу?

    Vindicar
    @Vindicar
    RTFM!
    Используй threading.Event.
    import threading
    
    def run(stop: threading.Event):
      while not stop.wait(timeout=1.0): # ожидание и проверка сигнала о завершении
        schedule.run_pending()
    
    stop_event = threading.Event()
    worker = threading.Thread(target=run, args=(stop_event,))
    worker.start()
    #когда надо остановить поток worker
    stop_event.set()

    Прелесть такого подхода в том, что цикл прервётся немедленно по сигналу stop_event, а не тогда, когда закончится очередное ожидание. Также можно заставить несколько потоков использовать один и тот же объект Event.
    Ответ написан
  • Как использовать кастомные эмодзи в кнопках в discord-components discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Где описаны переменные left, right, trash?

    Ну и да, сделайте setlocale() один раз в начале программы, а не десять раз посередине.
    Ответ написан
  • Как на питоне создать функцию по типу "значимый_тип.функция(аргументы)"?

    Vindicar
    @Vindicar
    RTFM!
    Ты просишь что-то типа extension methods из C#?
    Вообще-то это совершенно не питонично и такие хаки лучше не использовать.
    Для обычных классов можно было бы попробовать модифицировать __dict__ класса, или задать атрибут. Атрибут может быть методом, т.е. функцией.
    Но для встроенных классов такой номер не пройдёт, скорее всего, так как их __dict__ доступен только для чтения.
    Ответ написан
  • Как сделать кик участника из войса discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Почему может не работать оператор write при записи в текстовый файл на Python?

    Vindicar
    @Vindicar
    RTFM!
    Как запускали программу?
    Судя по описанию вы смотрите на окно интерактивного интерпретатора питона.
    Он не должен запускаться при запуске .py файла, так что либо вы как-то не так запускаете, либо питон у вас криво установлен.
    Ответ написан
    Комментировать
  • Не работает код(бот дискорда)?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, ты подставляешь prefix только в последний элемент списка hello_words.
    Во-вторых, ты делаешь client.remove_command('help') и жалуешься, что не работает команда help. Твой собственный метод help() не декорирован как команда или событие.
    В-третьих, почему не использовать существующий фреймворк для команд?

    from discord.ext import commands
    hello_words = ['привет', 'hello', 'прив']
    
    @commands.command(name=hello_words[0], aliases=hello_words[1:])
    async def hello_command(ctx):
        pass #делаешь что хочешь
    Ответ написан
  • Как превратить строку в многомерный массив?

    Vindicar
    @Vindicar
    RTFM!
    Разбить сначала по символу перевода строки (\n), потом каждый кусок разбить по пробелу.
    Гугли методы строки .split() и .splitlines(). Ну и преобразовать в int или float в конце.
    Ответ написан
    Комментировать
  • Как взаимодействовать с сайтом программно?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужно чётче сформулировать задачу.
    Если ты хочешь отправить запрос на простой сайт (имитировать открытие ссылки), то это одна задача. Достаточно будет использовать библиотеку типа requests.
    Если ты хочешь работать с сайтом, который обвешан javascript (как ВК), то это уже другое дело. Тут requests будет недостаточно, или его использование будет затруднительно из-за необходимости расковыривать устройство сайта. Нужно использовать безголовый браузер типа selenium. Но результаты работы с сайтом будут "заперты" в скрипте, т.е. вещи типа прослушивания музыки с сайта уже будут проблематичны.
    Впрочем, селениум вроде умеет работать с обычным окном браузера, почитай доки по нему. Если это так, то под твою задачу должно подойти.
    Наконец, если ничто другое не помогает, pywinauto или pyautogui позволяют имитировать клики мышью и нажатия клавиш в окнах других приложений. pywinauto менее популярен, но pyautogui требует, чтобы приложение находилось на переднем плане.
    Ответ написан
  • Как писать комментарии на ютуб с помощью python?

    Vindicar
    @Vindicar
    RTFM!
    Ютуб очень заскриптован, простой либой типа requests ты не отделаешься. Нужно использовать selenium, и постараться притвориться обычным пользователем.
    Ответ написан
    2 комментария