Задать вопрос
  • Как добавить несколько ботов в чат?

    shurshur
    @shurshur
    Зачем? Что мешает добавить ботов вручную? Это же разовая операция.
  • Не работает discord.py?

    shurshur
    @shurshur
    Ну так-то и работать это не может, потому что у обработчика нет декоратора, который бы задавал его поведение.
  • Вэб версия ватсап, через хром на андроид. ошибка! как восстановить сессию?

    shurshur
    @shurshur
    Решение одно - повторно залогиниться. Мистики не бывает, если авторизация в WA потеряна, то её невозможно восстановить вообще никак иначе, кроме как авторизоваться заново.
  • Ошибка в с Базой данных?

    shurshur
    @shurshur
    AUser0, я вижу ошибку в коде у автора вопроса. И я объясняю, что надо было сказать автору вопроса. Не просто кусок кода шлёпнуть, а объяснить, в чём состоит проблема и как её решать. Тем более не нужно кусок кода из интернета.
  • Callback-кнопка в модуле telebot (язык python) не обновляет свое содержание. Что делать?

    shurshur
    @shurshur
    RimMirK, это пример того, как НЕ НАДО отвечать на вопрос. Сделать за пользователя задачу, не объяснив, где он круто и безобразно налажал, чтобы в следующий раз он налажал ничуть не меньше.
  • Законно ли переслать файл книги другому человеку?

    shurshur
    @shurshur
    Даже бумажную книгу дать другому почитать может быть незаконно, если это оговорено условиями предоставления книги (правда, суд конкретной страны в конкретных условиях может иногда посчитать это ограничение неправомерным, так как урон автора и его прихлебателей от этого почти что иллюзорный в силу сложности передачи). С файлами всё как минимум точно так же (и тут те же суды будут более строги, ведь копирование файла как раз наоборот очень легко и позволяет наносить ущерб в огромных масштабах), причём, в отличие от бумажных книг, тут запрет на передачу прописывается явно.
  • Как сохранить мессенджи и всю моего аккаунта VK на пк?

    shurshur
    @shurshur
    maksam07, раньше да, фотки имели строго постоянные адреса. Раньше если даже в ссылке на фото были GET-параметры, то их можно было просто убрать и это работало. Сейчас - нет. Вероятно, это сделано в том числе и для защиты от прямого доступа и использования vk как неограниченного во времени и объёме хостинга картинок.
  • Как сохранить мессенджи и всю моего аккаунта VK на пк?

    shurshur
    @shurshur
    Если аккаунт удаляется полностью, то логично что ссылки на посты и всё прочее становится неактуально. Странно этому удивляться.
  • Как стать специалистом по информационной безопасности (кибербезопасность)?

    shurshur
    @shurshur
    iditussi, если хочется именно безопасностью заниматься (уязвимости, сценарии проникновения, конфигурирование доступов, защита данных, отслеживание вторжений итд итп), а не написанием бумажек и регламентов, то тут нужно одно - база, много базы и опыта. Нужно уметь и прогать, и решать задачки с хакфестов, и админить сервера, надо уметь читать CVE и самостоятельно писать к ним хотя бы тривиальные тестовые эксплойты...

    Просто слегка научиться ботиков на питоне писать недостаточно.
  • Что будет с моим данными у оператора связи, если я перейду к другому оператору?

    shurshur
    @shurshur
    В России будет хранить 3 года. Да, персональные данные и содержимое банковских SMS тоже.
  • Как запустить bash скрипт в crontab?

    shurshur
    @shurshur
    AUser0,
    $ echo 1 > aa
    $ echo 2 >> aa 2>&1
    $ cat aa 
    1
    2
  • Как запустить bash скрипт в crontab?

    shurshur
    @shurshur
    Неправда, 2>&1 не перезатирает файл, а лишь перенаправляет fd=2 в fd=1.

    Меня больше парит ^M в выводе. Не тут ли покопалась проблема?
  • Как устранить ошибку с генерацией случайных чисел в боте?

    shurshur
    @shurshur
    capybara123, можно создать эту переменную вне всех функций, а в нужных функциях объявить через global и заполнять случайным значением именно там. Использование global общепринято считается плохой практикой в python, но работать будет.

    Однако при этом возникнет другая проблема: эта переменная будет общей для всех пользователей бота. Если два игрока играют одновременно, то будет конфликт. Но я рекомендую заняться этой проблемой на следующей стадии. А сначала навести в этом боте порядок и переписать его хоть как-то по-человечески.

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

    Например, имя файла с картинкой и количество котов явно напрямую связано со значением random_number. Поэтому достаточно куска кода, который будет подставлять random_number везде где надо. Вот только с надписями на кнопках это не работает. Но это легко решить. Например, заведём словарь вариантов ответа, а для вывода сделаем простую функцию, которая будет склонять котов в зависимости от их количества:

    # варианты выбора для котов
    cat_choices = {
        1: (2, 3, 1),
        2: (4, 1, 2),
        ...
    }
    
    # функция, которая склоняет котов: по их количеству
    # возвращает человекочитабельную строку
    def get_cats_str(count:int):
        if count == 1: return "1 кот"
        elif count < 5: return f"{count} кота"
        else: return f"{count} котов"


    После этого код станет заметно короче и поубавится дублирование. Станет проще делать в нём доработки и меньше риск где-то ошибиться при этом.

    if message.text == 'game':
        random_number = randint(1,5)
        # конструкция with используется для того, чтобы файл
        # автоматически был закрыт при выходе из блока with
        with open(f"game/{random_number}.jpg", "rb") as cat_image_file:
            bot.send_photo(message.chat.id, cat_image_file)
        markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
        cats = cat_choices[random_number]:
        variant1 = types.KeyboardButton(get_cats_str(cats[0])
        variant2 = types.KeyboardButton(get_cats_str(cats[1])
        variant3 = types.KeyboardButton(get_cats_str(cats[2])
        markup.add(variant1, variant2, variant3)
        bot.send_message(message.chat.id, 'Выбери правильный вариант ответа', reply_markup = markup)
    else:
        # берём первое число перед первым пробелом, для простоты не проверяем, что там дальше "коты"
        cats_count = message.text.split(" ")[0]
        if cats_count.isdigit():
            cats_count = int(cats_count)
            if cats_count == random_number:
                # это верный ответ
            else:
                # это неверный ответ
         else: # не число:
             bot.send_message(message.chat.id, 'Так сколько котов-то?")


    Также советую начать выбирать более осмысленные названия переменным. Например, назвать файл с картинкой переменной game это мягко говоря странно. Чем осмысленнее названия переменных, тем понятнее код для восприятия. В том числе и самому себе (особенно если вернуться к нему через некоторое время позже). Кстати, random_number тоже плохое название, лучше что-нибудь про котов или игру, например, selected_game_cats (выбранные для игры коты).

    Это очень грубый набросок, тут ещё много чего можно улучшать. Например, данные бота можно организовать в словарь, в котором будет имя файла и правильное число котов, а неправильные количества котов можно генерировать динамически случайными числами, не равными правильному. Что число котов зашито в имени файла вообще корявое решение. Ведь можно в базе бота держать сотни картинок с любым количеством котов, это будет гораздо интереснее.

    Словарь с котами можно держать не в исходном коде, а в отдельном файле (json или yaml). Это тоже гораздо удобнее, заодно можно изучить работу с этими форматами.

    А затем можно заняться той самой проблемой, что несколько игроков одновременно играть не могут. Для этого надо хранить не просто общий random_number, а отдельный random_number для каждого пользователя. Для этого заведём словарь, в котором ключом будет chat.id:

    user_random_number = {}
    
    ...
    if message.text == 'game':
        user_random_number[message.chat.id] = randint(1,5)


    Но ещё лучше будет освоить FSM (Finite State Machine - конечный автомат состояний). В telebot есть довольно простая реализация FSM на основе вызова bot.register_next_step_handler. В данном случае можно после вывода задачи выставлять следующий обработчик ("next step handler") в другую функцию, которая проверяет ответ, а в ней после ответа сбрасывать обработчик на используемый по умолчанию. При вызове register_next_step_handler можно также передавать дополнительные аргументы, и вот можно передать тот самый random_number. Заодно мы окончательно избавимся от глобальной переменной.

    Даже на таком несложном боте можно очень многому научиться. Полезные темы для чтения: словари (dict), работа с файлами и открытие файла через контекстный менеджер с помощью with, глобальные переменные, работа с файлами в формате json, использование FSM (register_next_step_handler) для создания многошаговых взаимодействий пользователя с ботом.
  • Как пользоваться библоотекой FfiTdLib?

    shurshur
    @shurshur
    Не надо лепить уровень "сложный" на всё, на что лень было прочитать документацию.
  • Как тестировать телеграмм ботов?

    shurshur
    @shurshur
    utsiye, при такой постановке вопроса - да Аллах его знает...

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

    Например, пусть у нас 1000 пользователей, и в среднем каждый оставляет 1 сообщение в 2 дня. Тогда нагрузка 500 сообщений в сутки или 1/3 сообщения в минуту. Если запросы выполняются меньше 20 секунд, то мы уложимся. Ладно, люди ночью спят, пусть в пике будет в 3 раза больше активность, тогда надо выполнять запрос не больше 6 секунд.

    Вот примерно такие прикидки и надо делать.

    Большинству самописных ботов даже такая нагрузка и не снилась. Я рекомендую не париться, пока не возникнут какие-то реальные проблемы.
  • Как использовать данные CallbackQueryHandler в MessageHandler?

    shurshur
    @shurshur
    В каком message_handler? Который обработает следующее сообщение (не нажатие кнопки)? Очевидно, что это задача для FSM, а точнее bot.register_next_step_handler.
  • Как починить сайт на вордпресс?

    shurshur
    @shurshur
    Это что, из каких-то курсов?

    Задание тупое до дебильного. По логам же видно, что даже база с именем mysql сломана. В реальной жизни это автоматически означает, что базу надо переинициализировать и не выпендриваться.
  • Есть ли в питоне модуль в котором есть статический лист?

    shurshur
    @shurshur
    Agzamikail, какова РЕАЛЬНАЯ задача? "Хочу статический лист" это типичная XY problem.
  • Возможно ли появление проблем с раздачей интернета в зависимости от способностей ближайшей вышки?

    shurshur
    @shurshur
    Павел, нет, необязательно на роуминг. Например, может быть так, что в Москве не проверяется TTL пакетов, а во Владимирской области проверяется.