Задать вопрос
  • Как исправить ошибку AttributeError: module 'telebot.types' has no attribute 'User'?

    Vindicar
    @Vindicar
    RTFM!
    > C:\Users\HOME\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\telebot\types.py

    Ставил через pip install telebot? Поздравляю, ты поставил не тот пакет. Тебе вместо него нужен пакет pyTelegramBotAPI. Да, их два. Да, оба импортируются как telebot. Да, это тупо. Просто надо быть внимательнее, когда ставишь зависимости.
    Ответ написан
  • Как интерпретировать JavaScript при запросе requests?

    Vindicar
    @Vindicar
    RTFM!
    Никак. requests не для этого предназначен. Тебе нужен полноценный браузер, и код для управления им.
    Т.е. пакет selenium.

    EDIT: AlexBoss ниже правильно заметил - если сайт не слишком старается отсеивать ботов, то можно попробовать идентифицировать запросы, через которые выполняется подгрузка интересующих частей страницы, и выполнить их самому. Это позволит обойтись силами только requests, но это не всегда легко сделать.
    Ответ написан
    Комментировать
  • Какая-то проблема с кодом, поможете?

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

    Т.е. он всегда будет реагировать на не-личные сообщения по else. Не нравится? Убери этот else вместе со всем содержимым.
    Ну и да, основные алгоритмические конструкции.
    Ответ написан
    Комментировать
  • Парсинг стоимости инвентаря Steam CS:GO?

    Vindicar
    @Vindicar
    RTFM!
    Очень странный код. А зачем ты вообще используешь create_task() и gather()?
    create_task() имеет смысл, если хочешь вызвать корутину так, чтобы она выполнялась независимо от вызывающей.
    gather() имеет смысл, если у тебя НЕСКОЛЬКО корутин, и ты хочешь выполнить их параллельно, а потом дождаться, когда все выполнятся.

    А в твоём случае должно быть достаточно
    xxx = await get_inventory(steam_id)

    Далее, зачем у тебя get_quantity() вызывается асинхронно, да еще и опять через create_task()?
    Она не выполняет никакого ввода-вывода, да и ЦПУ не особо загрузит, оставь её синхронной и вызывай как обычно.

    Далее, ты используешь в куче синхроную requests и асинхронную aiohttp. Выбери что-нибудь одно? Я бы остановился на aiohttp, раз уж аснихронный код пишешь.

    В общем, проще переписать, чем исправить...
    Ответ написан
    Комментировать
  • Как такое реализовать?

    Vindicar
    @Vindicar
    RTFM!
    Записываешь в хранилище (можно базу, можно файл) время, когда ожидание должно закончиться.
    При загрузке проверяешь наличие этой записи. Если есть, вычисляешь, сколько ждать до целевого момента (если он ещё не наступил).
    Если он уже прошел - сам решай, выполнять команду немедленно, или ждать до следующего момента.
    Так или иначе, после выполнения команды удаляешь запись из базы.
    Ответ написан
  • Мой exe файл некорректно передаётся, что делать?

    Vindicar
    @Vindicar
    RTFM!
    что значит "текстовый файл передаётся нормально"? Ты первые 2048 байт при приёме выбрасываешь же.
    Ответ написан
    2 комментария
  • Библиотека threading - обратная совместимость?

    Vindicar
    @Vindicar
    RTFM!
    Как будешь параллелить выполнение CPU-bound задач?
    Ответ написан
  • Как создать базу данных sqlite3 для всех серверов на которые есть бот discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Не проще ли включить id сервера в соответствующие таблицы?
    Т.е. у каждого пользователя будет составной id: свой id + id сервера. Аналогично с ссылками на этого пользователя.
    Потому что создавать отдельную БД на каждый сервер довольно муторно - и не очень ясно, какая от этого выгода.
    Ответ написан
    1 комментарий
  • Вопросы про нейронную сеть?

    Vindicar
    @Vindicar
    RTFM!
    Отвечу на что смогу.
    > Как посчитать нейросеть для тупого запоминания выборки?
    > Почему обучая нейросеть она может менять свой процент правильности?
    > Почему при увеличении слоев сеть порой тупеет.
    Это называется переобучение. Если очень наглядно, то это можно представить так:
    underfitting_and_overfitting_in_machine_learning_image.png
    Слева - недостаточно сложная сеть. Она не может приспособиться к сложности данных, и даёт только грубое подобие той закономерности, которую мы моделируем.
    Справа - чрезмерно сложная сеть. Она очень хорошо вписывается в обучающую выборку (точки на графики), но если ей дать промежуточные точки (т.е. те. которых не было в обучаяющей выборке), она будет давать сильно отличающиеся от реальных ответы. Это и есть "сеть зазубрила выборку" (подразумевается "вместо того, чтобы понять её закономерности").
    Твоя задача как архитектора сети - выбрать такие гиперпараметры (это то, что ты выбираешь до обучения - число слоёв, размер слоёв, скорость обучения, функция активации и т.д.), чтобы сеть не переобучалась.
    Собственно, на графике ошибки сети это как раз выглядит так:
    overfitting-and-underfitting-wrt-model-error-vs-complexity.png
    Синяя кривая - ошибка на обучающей выборке. Желтая - на контрольной. По оси X - сложность сети.
    Тогда твоё поведение объясняется так. Сложная сеть сначала быстро приспосабливается к выборке (быстро падает ошибка на обоих выборках), а потом начинает зазубривать обучающую выборку (и набирать ошибку на контрольной, так как перестаёт понимать закономерности). Если ты это наблюдаешь - сеть слишком сложная.
    Ответ написан
    Комментировать
  • Можете помочь с пониманием кода?

    Vindicar
    @Vindicar
    RTFM!
    > Я так понимаю, что должно работать как-то так:
    > @vcl.on('привет', "здравствуй")
    > def hello(text):

    Неправильно понимаешь. Это могло бы сработать, если бы ты передал
    @vcl.on(['привет', "здравствуй"]) #обрати внимание на список!
    Тогда, совместно с твоим предложением по изменению on(), сработало бы. Это один способ.

    Однако ты не обратил внимание вот на какой вариант:
    @vcl.on('привет')
    @vcl.on("здравствуй")
    def hello(text):

    Это тоже должно сработать! Список имеет смысл, если ты загружаешь этот список откуда-то, а не записываешь его как константу в коде скрипта.

    А вообще я бы посоветовал использовать регулярные выражения. Примерно так:
    import re
    #.............................................
        def on(self, condition):
            if isinstance(condition, re.Pattern):
                predicate = lambda text: condition.match(text)
            elif isinstance(condition, str):
                condition = condition.lower()
                predicate = lambda text: condition in text
            elif callable(condition):
                predicate = condition
            else:
                raise TypeError('Condition must be either string or function!')
    
            def decorator(command_func):
                self.actions.append((predicate, command_func))
                return command_func
    
            return decorator

    Для пущего удобства можно исправить метод run_command(), чтобы обработчику команды был доступен результат сопоставления.
    def run_command(self, text):
            text = text.lower()
            for predicate, command in self.actions:
                res = predicate(text) #сохраняем результат
                if res:
                    try:
                        response = command(text, res) #теперь обработчик принимает два аргумента!
                        if response is None:
                            response = "Команда выполнена"
                        else:
                            response = str(response)
                    except Exception as err:
                        response = "Ошибка при выполнении команды"
                        print(err)
                    if response:
                        m.say_message(response)
                    break
            else:
                m.say_message("Неизвестная команда")


    И пример использования будет примерно таким:
    #нужно знать синтаксис регулярных выражений
    #совпадёт с любой строкой, начинающейся строго со слов "скажи" или "произнеси"
    #всё что после этих слов попадёт в отдельную группу 1.
    @vcl.on(re.compile('^(?:скажи|произнеси) (.+)$', re.I)) 
    def hello(text, match): #все обработчики будут принимать два аргумента!
        #match будет содержать результат сопоставления входной строки с регуляркой
        #group(1) будет содержать то, что оказалось на месте (.+)
        return match.group(1) #пусть бот повторит то, что мы попросили его сказать
    Ответ написан
    Комментировать
  • Как можно ускорить код?

    Vindicar
    @Vindicar
    RTFM!
    Лобовой ответ - фоновый шум есть? Может, Recognizer его принимает за речь, и думает что ты все эти несколько минут говоришь.
    В параметрах метода listen() есть кое-что интересное, почитай.
    Ответ написан
  • Как считывать данные из базы данных в sqlite с помощью python?

    Vindicar
    @Vindicar
    RTFM!
    Потому что нужно читать документацию, там на первой же паре страниц есть примеры кода, в том числе запрос SELECT.

    Что ты вообще ожидаешь получить вызовом str(cursor.execute), если ты знаешь, что cursor.execute() - это метод?
    И почему ты игнорируешь возвращаемое им значение, когда выполняешь запрос?

    Короче, ещё раз - читай доки. Они полезные.
    for row in cursor.execute('SELECT bdname FROM user_city'):
            print(row)
    Ответ написан
    Комментировать
  • Каким модулем распознавать речь на python?

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

    Vindicar
    @Vindicar
    RTFM!
    Невнимательность - мать маразма. =) Ты оба файла обозвал как f.

    f = open("skinsinfo.txt", "w")
    count = 0
    i = 0
    try:
    with open('skins.txt', 'r') as f:
    Ответ написан
  • Как сравнивать две строки, имеющий разные "шрифты"?

    Vindicar
    @Vindicar
    RTFM!
    Нормализация юникода - вещь малоприятная.
    Первый термин для гугла - гомоглиф (homoglyph), т.е. символы, которые выглядят очень похоже (типа русской и латинской о). Для питона вроде есть одноименная библиотека, но я сам с ней не работал.
    Ответ написан
    Комментировать
  • Как сделать uptime, чтобы типа таймер шёл после запуска скрипта бота и показывал сколько времени работал бот discord py?

    Vindicar
    @Vindicar
    RTFM!
    Делать постоянно тикающий счётчик неэффективно и неудобно.
    Лучше просто при запуске бота сохрани текущее время в переменную.
    Когда у тебя запрашивают аптайм (т.е. в обработчике команды !uptime), вычти из текущего времени сохраненное в переменной - получишь интервал времени между ними. Это и будет аптайм. Останется только его отформатировать красиво.
    За подробностями смотри модуль datetime, типы данных datetime и timedelta.
    Ответ написан
    Комментировать
  • Aiogram - как отправить аудио файл gTTS без сохранения на диск?

    Vindicar
    @Vindicar
    RTFM!
    Ты спрашиваешь как сохранить выхлоп gTTS в объект BytesIO, или как отправить содержимое BytesIO через телегу?
    Потому что если первое, это есть в документации на gTTS.
    Ответ написан
    1 комментарий
  • Как правильно список загрузить в базу данных MySQL через Python?

    Vindicar
    @Vindicar
    RTFM!
    Код в примере ожидает список из кортежей по два элемента.
    Список на скриншоте состоит из одиночных строк. Так что либо данные кривые, либо вы не в тот запрос их подаёте.
    Ответ написан
  • Как реализовать отправку уведомлений ботом при соблюдении условий?

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

    Если очень коротко: пока твой код делает что угодно кроме await-вызова, остальной бот стоит.
    То есть:
    time.sleep(10) - весь бот стоит и спит 10 секунд
    await asyncio.sleep(10) - текущая корутина стоит и спит 10 секунд, но в это время могут выполняться другие корутины. Например, реакция на внешние события.

    Что это тут у нас?
    while True:
                schedule.run_pending()
                time.sleep(1)

    Мало того, что бесконечный цикл, так ещё и ожидание делаешь через time.sleep(), который про асинхронность не знает.

    И далее. А на кой овощ тебе вообще использовать schedule, если тебе требуется простое периодическое действие? Особенно с учётом того, что schedule - это тоже синхронная библиотека. Т.е. ты из асихронного бота вызывает синхронный код schedule, а потом оттуда будешь вызывать асинхронные методы отправки сообщений? Хороший способ усложнить себе жизнь!

    async def check_if_notifications_are_needed(self):
        pass
    #а ниже будет что-то типа
    async def run_check(self):
        while True:
            await self.check_if_notifications_are_needed()
            await asyncio.sleep(3600) #серьезно, зачем проверять каждые 5 секунд если достаточно раз в час?
    Ответ написан
  • Как тут сделать insert?

    Vindicar
    @Vindicar
    RTFM!
    Akina, Глеб Лукашонок, пожалуйста, не собирайте SQL запросы с помощью форматирования строк без крайней на то необходимости.

    Используйте placeholders, и да пребудет с вами Бобби Тейблз.
    cur.execute("insert into d_commands (executor, text, phis_addr) values (?, ?, ?)", (1, str(action), -1062731554))

    В этом случае экранирование будет выполнено автоматически, без риска что вы забудете это сделать.
    Ответ написан