Задать вопрос
  • Как вызывать сторонние функции бота на aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию.
    У start_polling() есть параметр on_startup, который принимает корутину (async-функцию). Эта корутина будет выполнена при старте бота.
    Внутри корутины просто через asyncio.create_task() запускаешь другую корутину, которая уже и будет выполнять периодические обновления.
    И да, вместо велосипеда с datetime посмотри в сторону пакета aioschedule.
    Ответ написан
  • Хочу разместить телеграм бота с бд SQLite3 на selectel, но не могу понять где создать бд и как подключить к боту. Может кто-то знает?

    Vindicar
    @Vindicar
    RTFM!
    sqlite3 сам создаст файл БД, если он не существует. Но вот отсутствующие таблицы в БД должен создать бот, при своём запуске.
    Запрос CREATE TABLE IF NOT EXISTS ... в помощь.
    Ответ написан
    6 комментариев
  • Голосовой ассистент на c#. С чего начать? Что надо изучить? Как реализовать(это мой первый проект)?

    Vindicar
    @Vindicar
    RTFM!
    1. Поищи библиотеки, пригодные для распознавания русской речи и имеющие привязку к C#.
    2. Найди их документацию, там наверняка есть простые примеры работы.
    3. Выбери ту, которая кажется наиболее простой и удобной.
    4. Разбери пример, как обнаружить, записать и распознать фразу.
    5. Продумай, как ты будешь по тексту фразы определять команду. Вопросы, на которые придётся найти ответ:
    - Как отличить разговор от обращения к помощнику (подсказка: "окей, гугл", "алиса", и т.п.)?
    - Как описывать отдельные команды помощника? Как классы, как методы...
    - Как определять, какая команда была произнесена?
    - Как извлекать параметры команды (в простых случаях хватит регулярных выражений, в сложных придётся ещё тащить библиотеки обработки естественных языков типа Natasha)?
    - Могут ли команды перекрываться? Например, если мы сделали команду "таймер", можем ли мы пользоваться ботом, пока таймер не закончится?
    - Как команда будет возвращать результат? Будет ли ей предоставлен какой-то класс/метод от бота, чтобы она могла "сказать" что требуется?
    6. Аналогично разбери библиотеки для синтеза речи.
    Ответ написан
    Комментировать
  • Как перенести данные с Python в Excel?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, python create excel document. Находим xlsxwriter. Эту часть ты сделал.

    Дальше придётся прочитать (а не просто скопипастить) пример и чутка включить голову.
    import xlsxwriter
    
    # Create a workbook and add a worksheet.
    workbook = xlsxwriter.Workbook('Expenses01.xlsx')
    worksheet = workbook.add_worksheet()
    
    # Some data we want to write to the worksheet.
    expenses = (
        ['Rent', 1000],
        ['Gas',   100],
        ['Food',  300],
        ['Gym',    50],
    )
    
    # Start from the first cell. Rows and columns are zero indexed.
    row = 0
    col = 0
    
    # Iterate over the data and write it out row by row.
    for item, cost in (expenses):
        worksheet.write(row, col,     item)
        worksheet.write(row, col + 1, cost)
        row += 1
    
    # Write a total using a formula.
    worksheet.write(row, 0, 'Total')
    worksheet.write(row, 1, '=SUM(B1:B4)')
    
    workbook.close()

    Что мы видим в этом коде? Что метод worksheet.write() принимает в качестве параметров строку и столбец, куда нужно записать значения. Т.е. нам нет необходимости писать их в определённом порядке, мы можем их писать как нам удобнее.
    А чего мы НЕ видим? А мы не видим какого-либо задания лимитов по количеству строк/столбцов. Значит, мы не обязаны знать заранее, сколько строк/столбцов у нас будет в данных, а можем писать по мере поступления новых данных.

    Отсюда вывод: данная библиотека подходит нам до тех пор, пока мы для каждой порции данных можем сказать, в какую ячейку эта порция должна попасть, т.е. можем определить значения row и col. Обрати внимание, что в примере позиция (номер строки) просто хранится переменной и меняется по мере чтения данных, а номер столбца определяется в зависимости от записываемого элемента данных. Этот подход прекрасно подойдёт к описанной задаче, единственная разница - у тебя строки будут зависеть от элемента данных, а столбцы будут наращиваться по мере чтения входных данных.

    В чём сложность адаптировать этот пример к твоей задаче?
    Ответ написан
  • Парсинг сайта Яндекс.Музыка на Python, как?

    Vindicar
    @Vindicar
    RTFM!
    Если сайт не слишком защищается от парсеров и не требует JS для работы:
    requests для скачивания страницы, beautiful soup для разбора html документа и поиска элементов в нём.

    Если сайт требует JS для работы, можно пошариться в консоли разработчика в браузере и найти, какие запросы страница-фронт делает, чтобы подгрузить данные. Тогда ты можешь научиться делать точно такие-же запросы, и получать данные сразу в машинночитаемом виде (часто в JSON).

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

    Если сайт детектит selenium, нужно искать сборки селениума, которые труднее обнаружить. Тут я навскидку не подскажу.
    Ответ написан
    Комментировать
  • Ошибка: 'NoneType' object has no attribute 'name'?

    Vindicar
    @Vindicar
    RTFM!
    Нужно включить голову и подумать.
    activity у пользователя есть не всегда. Если её нет, поле activity вернёт значение None.
    Перед тем, как обращаться к свойствам activity (например, name), нужно проверить, что оно не None.
    Ответ написан
    Комментировать
  • Почему PyCharm и VS code по-разному реагируют на одинаковые файлы?

    Vindicar
    @Vindicar
    RTFM!
    Почитай, что такое относительный путь, и что такое рабочий каталог.
    Это, на минуточку, школьный курс информатики.

    Ты указываешь относительный путь к файлу при открытии, поэтому путь разрешается относительно текущего рабочего каталога. Разные IDE могут указывать разные каталоги как рабочие при запуске скрипта, не говоря уже о том, что при запуске скрипта из терминала рабочим может быть любой каталог.
    А ещё рабочий каталог может меняться во время работы скрипта.

    Так что если тебе нужен путь к файлу именно рядом со скриптом, строй этот путь сам, используя модули sys и pathlib (ну или os.path, если по-старинке).
    import sys
    import pathlib
    # каталог, в котором лежит скрипт
    APP_DIR = pathlib.Path(sys.argv[0]).parent.resolve()
    # файл в этом каталоге
    my_file_path = APP_DIR / 'Token.txt'  
    
    with my_file_path.open('rt') as f:  # получаем файловый объект, как обычно
        data = f.read()
    Ответ написан
    Комментировать
  • Как проверить полученную случайную выборку в Python по ряду условий?

    Vindicar
    @Vindicar
    RTFM!
    Опиши правила генерации как конечный автомат. Например, так:
    rules = {
        # id_состояния: переходы
        # каждый переход - пара (набор_символов, следующее состояние)
        # будет выбран случайный переход, потом случайный символ из его набора символов
        # это начальное состояние. Можно генерировать любые символы.
        'default': [ (A, '1_vowel'), (B, '1_consonant') ], 
        # последний символ был гласной - следующая гласная будет последней
        '1_vowel': [ (A, '2_vowels'), (B, '1_consonant') ],
        # два последних символа были гласными - можем добавлять только согласные
        '2_vowels': [ (B, '1_consonant') ],
        # с согласными по аналогии
        '1_consonant': [ (A, '1_vowel'), (B, '2_consonants') ],
        '2_consonants': [ (A, '1_vowel') ],
    }

    Очевидно, правила могут быть и более сложными, такая схема это позволяет. Более того, можно описывать допустимые слоги и их сочетания вместо допустимых букв.
    А использовать их можно примерно так:
    from random import choice
    
    def generate(rules: dict[str, list[tuple[list, str]]], min_length: int) -> str:
        output = ''
        state = 'default'  # начальное состояние
        while len(output) < min_length:
            if not rules[state]:  # если нет переходов
                break  # прерываем цикл, так как уйти из этого состояния нельзя
            transition = choice(rules[state])  # случайно выбираем один из переходов
            output += choice(transition[0])  # случайно выбираем очередной символ согласно переходу
            state = transition[1]  # переходим в следующее состояние
        return output  # возвращаем то, что нагенерировали

    Тогда гарантируется, что сгенерированная строка будет соответствовать условиям.
    Ответ написан
    1 комментарий
  • Как человекообразно отсортировать json в python?

    Vindicar
    @Vindicar
    RTFM!
    Пересоздать ключи в словаре в правильном порядке и отключить дефолтную сортировку.
    Ответ написан
    1 комментарий
  • Как посчитать количество одинаковых цифр в 4-х значном числе?

    Vindicar
    @Vindicar
    RTFM!
    Составь коллекцию, в которой будет храниться набор пар: цифра и сколько раз она встретилась. Лучше всего подойдёт словарь.
    Дальше просто перебери элементы словаря, если есть элемент, у которого значение равно 3, значит, число подходит.

    Совет: посмотри в сторону collections.Counter.
    Ответ написан
    Комментировать
  • Как найти COM порт оптимально?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, ардуино (ну как минимум китайские клоны) отдают определённый VID/PID USB устройства. Этим можно пользоваться для сужения диапазона поиска. Эту инфу можно узнать из реестра Windows.
    Во-вторых, если ты контролируешь прошивку ардуинки, можешь заставить её отправлять какой-то хэндшейк (заранее известный пакет) при подключении к порту (обычно арудино перезагружается при коннекте к порту). Тогда достаточно подождать совсем чуть-чуть, отправка данных не потребуется. Также меньше шансов что-то поломать, отправив левые данные в неизвестное устройство.
    В-третьих, просто сделай два последовательных цикла - один создаёт и запускает потоки, а второй их дожидается. Тогда ожидание будет параллельным.
    Ответ написан
    2 комментария
  • Как сделать выбор папки в скрипте?

    Vindicar
    @Vindicar
    RTFM!
    import tkinter as tk
    from tkinter import filedialog as fd
    
    root = tk.Tk()  # пустое родительское окно
    root.withdraw()  # прячем его
    result = fd.askdirectory(
        master=root,   # диалогу нужно родительское окно, путь даже невидимое.
        mustexist=True)  # только существующие каталоги
    root.destroy()  # уничтожаем родительское окно
    print(type(result), repr(result))  # result будет содержать путь или пустую строку при отмене
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку No module named 'javascript'?

    Vindicar
    @Vindicar
    RTFM!
    Если речь идёт о модуле javascript, то он сторонний, его нужно ставить через утилиту pip на каждой машине, где твой скрипт будет выполняться.
    pip install javascript
    Как пользоваться утилитой pip, смотри в гугле.
    Ответ написан
  • Как запоминать значение в переменную?

    Vindicar
    @Vindicar
    RTFM!
    1. Включи логику.
    2. Рукалицо.
    3. Поменяй эти две строки местами.

    Рукалицо, потому что достаточно немного подумать, чтобы понять в чём дело.
    Ты сначала присваиваешь значение в w3x3, а потом это уже изменённое значение присваиваешь в temp.
    Потому у тебя все три переменные и имеют одно и то же значение.
    Если сначала присвоить temp = w3x3, а потом уже обновлять w3x3, то тогда в temp будет лежать значение до изменения... но только при условии что это какой-то из неизменяемых типов, вроде чисел, строк или кортежей из них. Если это изменяемый объект, вроде списка, словаря или обычного класса, то не прокатит.
    Ответ написан
    Комментировать
  • Как сделать SQL запрос из двух таблиц?

    Vindicar
    @Vindicar
    RTFM!
    Чем не устраивает
    SELECT * FROM Categories LEFT JOIN Posts ON Posts.category_id = Categories.id ORDER BY Categories.id ASC

    ?
    Тогда посты из одной категории будут идти последовательно. Запоминаешь категорию предыдущего поста, при обработке следующего поста сравниваешь. Если не совпадает - закрываешь теги для предыдущей категории, открываешь теги для новой категории.
    Ответ написан
    3 комментария
  • Как выделить значение?

    Vindicar
    @Vindicar
    RTFM!
    Я тебе вроде уже кидал один вариант.
    По ссылке приведён пример использования, он показывает, как превратить "пять минут" в "5 минут".

    А дальше уже черёд регулярных выражений. Что-то в духе ([0-9.,]+)\s*(секунд\w*|минут\w*|час\w*) позволит выбрать набор частей интервала времени.
    import re
    text = 'поставь таймер на 6 часов 12 минут 5 секунд'
    regexp = re.compile(r"([0-9.,]+)\s*(секунд\w*|минут\w*|час\w*)", re.I)
    parts = list(regexp.findall(text))
    print(parts)  # [('6', 'часов'), ('12', 'минут'), ('5', 'секунд')]

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

    Vindicar
    @Vindicar
    RTFM!
    result = f'Уложите плазму в шокерную'
    Во-первых, от того, что ты присвоил переменной строку, в окне программы ничего не изменится.
    Во-вторых, у тебя этот result инициализируется только внутри этого if. Если условие if не выполнено, result не будет существовать, на что тебе питон и указывает.
    Ответ написан
    Комментировать
  • Жалуется .format(message.from_user) как пофиксить?

    Vindicar
    @Vindicar
    RTFM!
    BALANCE}", .format

    Зачем тут запятая.
    Ответ написан
    4 комментария
  • Как просто сделать неблокируемое взаимодействие с питоновским процессом?

    Vindicar
    @Vindicar
    RTFM!
    Пусть программа пишет в stdout или в stderr текущее положение дел.
    Ну или в отдельный временный файл. OpenVPN так делает, например.

    Особенность такого подхода в том, что программа сама решает, когда обновить эту инфу.
    Ответ написан
    Комментировать
  • Python discord как удалить сообщение?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать