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

    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 пакетов, а во Владимирской области проверяется.
  • Возможно ли появление проблем с раздачей интернета в зависимости от способностей ближайшей вышки?

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

    shurshur
    @shurshur
    Одной задачи не хватит. Нужны десятки и даже сотни. Причём бессмысленно решать синтетические задачи. Так что совет поставить себе и часто пользоваться будет наилучшим.
  • Как получить кол-во просмотров на посте в тг, с помощью тг бота (node js)?

    shurshur
    @shurshur
    r_e_n_y, там другой протокол, бинарный, не http. Для Python его реализует библиотека telethon, для js не подскажу.
  • Почему Python Telethon не использует сессии?

    shurshur
    @shurshur
    Удали реквизиты api, их невозможно поменять.
  • После авторизации Что делать с Google Id Token?

    shurshur
    @shurshur
    AlexVWill, можно вместо email хранить от него хеш, такое вполне решается. Впрочем, многие сайты специально хранят емейл, и можно авторизоваться как по логину-паролю, так и через сторонние интеграции, если емейл совпадёт. Например, такое в браузерных игрушках распространено. Уместность подобного сильно зависит от назначения сайта и того, нужна ли почта у пользователя для его функциональности.

    Но если и правда есть уникальный постоянный uid, и почта сама по себе не нужна, то помнить его конечно же лучше, чем email.
  • После авторизации Что делать с Google Id Token?

    shurshur
    @shurshur
    Зачем? У пользователя в качестве логина выступает email, вот его и надо помнить. Он будет один и тот же при каждом логине.
  • Как правильно написать рекурсию в Python для сбора элементов по parent key?

    shurshur
    @shurshur
    alexandrsemen4ukk, в исходных данных каждая запись это словарь, в котором несколько ключей. Я добавляю в него ключ childs, в значении которого будет храниться список дочерних элементов. В следующей строчке делается append в childs, но parent_item["childs"] должен быть создан до первого вызова этого append.
  • Почему Zabbix agent подключается к не понятным IP?

    shurshur
    @shurshur
    winser, если винда то там как-то по-своему это устроено, хотя контейнеры там это виртуалки. Но тоже в контейнерах должны быть свои отдельные IP.

    См. docker network inspect bridge.