Задать вопрос
  • DigitalOcean или РФ хостинг с серверами в европе?

    shurshur
    @shurshur
    CityCat4, это не крипта, а биржа, которой люди отнесли свои кровные. Кто ж заставлял их туда относить?
  • Как парсить карточку товара Wildberries на python?

    shurshur
    @shurshur
    Михаил, вообще-то нет, он запускает браузер при инициализации веб-драйвера. Но, конечно, держать запущенным целый браузер неприятно.

    Копать в сторону анализа запросов, которые делает браузер на этой странице, к чтению js-кода на ней... В зависимости от хитровывернутости программеров этого сайта всё может быть от "данные лежат в json прям в тексте страницы" до "данные получаются из вебсокетов, зашифрованные каким-нибудь криптографическим алгоритмом с необычными параметрами"..
  • Telegram bot для вырезки отчетов из Excel на Python?

    shurshur
    @shurshur
    За готовыми решениями полагается обращаться на фриланс, например https://freelance.habr.com/
  • Как получить локализованные новости игры?

    shurshur
    @shurshur
    AHTUxPK, можно попытаться проксировать клиента и просматривать его запросы.
  • Как обойти блокировку инсты в скрипте импорта фото по API?

    shurshur
    @shurshur
    alexeimene, в такой форме это задание, а не вопрос, и нарушает правила сайта. За выполнением заданий - на фриланс. Например, прям на хабровый https://freelance.habr.com/
  • Роли в боте вк sql?

    shurshur
    @shurshur
    Артём Смирнов,
    UC_PROGRAMMER int, user_class dick если не ошибаюсь


    Именно так. Причём как сравить словарь с числом - непонятно. Причём непонятно и как вообще сравнивать, и зачем вообще сравнивать. Кстати, если уж копируешь мой пример, зачем явно определённое название user_class_names изменил на user_class?

    get_user_class(user.id) за что отвечает


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

    Я же говорил, что привёл пример для описания принципа, а не законченное решение задачи.
  • Роли в боте вк sql?

    shurshur
    @shurshur
    Артём Смирнов, зачем user.id сравнивать с user_class? И предлагаю угадать, кто из них int, а кто dict...
  • Роли в боте вк sql?

    shurshur
    @shurshur
    Артём Смирнов, искать ошибку и исправлять её.
  • Роли в боте вк sql?

    shurshur
    @shurshur
    Артём Смирнов, очевидно, что в сравнении используются dict и int. Например, вместо user.id передаётся какой-нить декодированный json.
  • Как получить локализованные новости игры?

    shurshur
    @shurshur
    AHTUxPK, если этот API-метод используется на сайте, то посмотреть, что браузер отправляет на сайт, и пытаться воспроизвести. Возможно, там банально заголовок Accept-Languages поможет.
  • Discord.py Хочу сделать команду autoclear и присвоить ее каналу, но не пойму как это реализовать?

    shurshur
    @shurshur
    y0uSh4, уже лучше и даже наверное как-то будет работать. Но есть замечания.

    Не надо в on_ready делать бесконечный цикл. Лучше сделать отдельный таск, в котором в начале сделать bot.wait_until_ready() (это замена запуска из on_ready), и запустить его до запуска бота. А ещё удобнее использовать discord.ext.tasks безо всяких циклов - discord.py сам будет вызывать функцию с указанным интервалом:

    from discord.ext import tasks
    
    @tasks.loop(seconds=5)
    async def timer_task():
        await bot.wait_until_ready()
        ...
    
    timer_task.start()
    bot.run(TOKEN)


    Код станет гораздо компактнее и нагляднее.

    Но даже так, флудить в API дискорда каждые 5 секунд запросами purge может быть не очень разумно. Правильнее идти "от события": удалять сообщения по мере их появления (они ещё и исчезать будут быстрее, не через 5 секунд), и только при старте бота делать purge (удалять то, что бот не словил в момент его оффлайна), примерно так:

    @bot.event
    async def on_message(message):
        await bot.process_commands(message) # чтобы команды работали
        if message.channel.id == 972431181624791060:
            await message.delete()
    
    @bot.event
    async def on_ready():
        channel = bot.get_channel(972431181624791060)
        await channel.purge(limit=0)


    Всё это, конечно, ещё далеко от "команды autoclear", для которой надо будет при вызове на нужном канале проверять, что её использовал пользователь с админскими правами (есть декоратор для команд) и затем добавлять в какой-то список каналов (сохраняемый куда-нибудь в базу или на диск). Вместо проверки одного канала, соответственно, проверять наличие channel.id в списке наших id. И для вызовов purge не забывать сначала проверять, что get_channel вернул не None. Потому что если хоть на одном из серверов, где есть бот, удалят хотя бы один из этих каналов, то бот сломается и остальные каналы не почистит.

    И да, конечно, нужно будет предусмотреть команду "выключения autoclear".

    В целом мне непонятно, зачем это нужно. Проще просто закрыть возможность писать пользователям в соответствующие каналы, и даже бот не потребуется. Разве что как учебно-тренировочная задача...
  • Discord.py Хочу сделать команду autoclear и присвоить ее каналу, но не пойму как это реализовать?

    shurshur
    @shurshur
    y0uSh4, если у тебя уже 500 строк кода, то ты бы уже должен был запомнить, что on_message - это не обработчик команд, а обработчик сообщений. Судя по при приведённому фрагменту, ты ничего внятного не написал и ничего у тебя не работает. Потому что у тебя сейчас мешанина случайно взятых слов из словаря.

    Я приведу просто пример. У меня тут лежит вордлист на 1488218 слов (не помню, где брал). Я взял из него 8 случайных слов и получилось следующее:

    нежелательной гемотрансфузию прикипание водокачкам тонкошёрстому транссибирской выгребем окошечек


    Что-нибудь понятно? Есть какой-то глубокий смысл в этом предложении? Вот ты примерно так же пишешь скрипты.
  • Что делать выдает ошибку в TeleBot при регистрации шага?

    shurshur
    @shurshur
    TemaGerb27, подсказка: bot.register_next_step_handler позволяет передавать в следующий обработчик дополнительные параметры. Пример есть в официальной доке.
  • Что делать выдает ошибку в TeleBot при регистрации шага?

    shurshur
    @shurshur
    Давай подскажу. Пусть Вася и Петя почти одновременно нажали ball. Затем один ввёл 100 рублей, а другой через секунду ввёл 500 рублей. Что будет в глобальной переменной symma?

    Кстати, не symma, а summa (слово латинского происхождения).
  • Собрать библиотеку буста для питона, как правильно?

    shurshur
    @shurshur
    Скорее всего, python находится по дефолтному имени python, а надо его уговорить на вызов интерпретатора по имени python3. Я бы посоветовал ./b2 --help почитать, возможно там есть что-то на эту тему.
  • Куда переехать с Google IMAP/CalDav/CardDav/LDAP со своими доменами?

    shurshur
    @shurshur
    Александр Фалалеев, по сравнению со SquirrelMail - это прям web 6.0! Что сейчас модно для веб-почты использовать я не интересовался, я со SquirrelMail так и поленился слезать на личной почте, которую я читаю раз в месяц.
  • Недостатки и альтернативы PyQt?

    shurshur
    @shurshur
    mkone112, конечно, типичная веб-архитектура, с бэкджеком и фронтлюхами.
  • Роли в боте вк sql?

    shurshur
    @shurshur
    Артём Смирнов, потому что это в принципе неправильно, не так это делается. Не нужно программировать в режиме "а давай-ка я это тут вставлю", из этого ничего хорошего не получится.

    Первая ошибка - использовать колонку с именем adm не для признака администратора, а для названия класса пользователя. Это же уже прям с самого начала не признак администратора.

    Вторая ошибка - в качестве класса использовать его текстовое название.

    Третья ошибка - текстовые названия потом не получается как-то нормально сравнивать.

    Правильно было бы завести в базе поле типа integer с названием вроде user_class (а может и user_level, или как-то ещё), которое бы принимало числовое значение. В коде завести эти классы и массив отображения их числовых значений в названия. Примерно так (я не призываю прям повторять, просто демонстрация идеи):

    UC_GUEST = 0
    UC_USER = 1
    UC_FLOODER = 2
    UC_CHUDO_UDO = 3
    UC_DONAT = 4
    UC_MODERATOR = 10
    UC_ADMIN = 11
    UC_GOD = 20
    
    user_class_names = {
        UC_GUEST: "Гость",
        UC_USER: "Пользователь",
        UC_FLOODER: "Очень Активный",
        UC_CHUDO_UDO: "Монстр Активности",
        UC_DONAT: "Хорошо помог :)",
        UC_MODERATOR: "Модератор",
        UC_ADMIN: "Администратор",
        UC_GOD: "Самый главный",
    }


    Префиксы UC_ будут признаками того, что это user class. При этом, хотя в python нет констант, существует соглашение, что набранные КАПСОМ переменные представляют из себя неизменяемые значения. Я оставил дырки в последовательности классов, что позволит в случае чего добавлять некоторые классы без перенумерации всей базы. Ну, скажем, потребуется ввести суперадмина - вон там для него есть пространство.

    При выполнении тех или иных действий можно проверять класс пользователя. Например, пользователь может выдать предупреждение, если его класс не ниже модератора:

    if user_class >= UC_MODERATOR:

    Но заодно хорошо бы, чтобы модератор не мог предупредить админа и вообще любого пользователя равного себе уровнем или выше:

    if user_class >= UC_MODERATOR:
        if user_class > get_user_class(member_id):
            # выдаём предупреждение
        else:
            # этот модератор не может выдать этому пользователю предупреждение


    Можно ещё больше усложнять логику. Например, пусть пользователям уровня UC_DONAT предупреждения могут выдавать только админы, обычные модераторы не могут (такая вот привилегия).

    Использовать числовые величины для понятия с простым отсортированным набором значений удобно тем, что их можно сразу же и сравнивать. А вот когда нам потребуется не просто класс пользователя, а его название, мы можем сделать user_class_names[user_level] и получить нужное имя.
  • Не сломается БД Mariadb, если в её дампе.sql с помощью vim заменить массово кодировку?

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