• Как сделать, чтобы телеграм-бот отвечал на входящие изображения?

    @lob4Noff
    Для библиотеки pyTelegramBotAPI:

    import telebot
    
    @bot.message_handler(content_types=['text', 'photo', 'files'])
    def give_photo(message):
        if message.content_type == 'photo':
            bot.send_message(message.chat.id, text="ОТВЕТ")
    Ответ написан
  • Срабатывает не тот if который должен, что не так?

    @lob4Noff
    Оператор input() имеет строчный тип данных, и он сравнивает значение первых символов. Чтобы ввести именно число (не строку), "оберните" input() в int():

    import random
    
    a = int(input("Введите ОТ скольки рандомизировать: "))
    b = int(input("Введите ДО скольки рандомизировать: "))
    
    if b > a:
        c = random.randint(a, b)
    else:
        c = random.randint(b, a)
        print ('Правильный порядок ОТ и ДО, а не ДО и ОТ как сделали вы! Но число всё равно сгенерировано')
    print (c)
    Ответ написан
    1 комментарий
  • Форматирование вывода?

    @lob4Noff
    import math
    
    while True:
        x = int(input("Введите число для вычисления факториала: "))
        fc = math.factorial(x)
        if len(str(fc)) > 5:
            print(f"Факториал числа {x} равен {str(fc)[:6]}..., цифр в числе - {len(str(fc))}")
        else:
            print(f"Факториал числа {x} равен {fc}, цифр в числе - {len(str(fc))}")


    При этом тип переменной остаётся таким же, каким и был.
    Ответ написан
    6 комментариев
  • Вывод словарь списков без скобок, как это сделать?

    @lob4Noff
    my_dict = {
        'Вика': [2, 0, 0, 2, 0], 
        'Даня': [2, 1, 0, 1, 3], 
        'Лиза': [2, 2, 0, 0, 6]
        }
    
    for key in my_dict:
        print(f"{key}: {str(my_dict[key]).replace('[', '').replace(']', '')}")
    Ответ написан
  • Как сделать input неактивным при определенном условии?

    @lob4Noff
    rating = int(input('Введите место в списке поступающих: '))
    if rating > 10:
        quantity_points = int(input('Введите количество баллов за экзамены: '))
    else:
        print('rating <= 10')
    Ответ написан
    Комментировать
  • Как в существующий файл дописать текст в python?

    @lob4Noff
    text = 'input' # фраза, которая будет дописана в конец строки
    output = '' # инициализация результирующего текста
    
    with open('1.txt', 'r') as file:
        for line in file: # считывание текущего файла
            output += (line.replace('\n', '') + text + '\n')
    
    with open('1.txt', 'w') as file:
        file.write(output) # перезапись файла
    Ответ написан
  • Как определить атрибуты файла — не магические методы?

    @lob4Noff
    Что мешает Вам напрямую передать значения этих переменных в обработчик файла?
    from file import a, b
    Ответ написан
    3 комментария
  • Мне нужно значение ключа сделать словарём, как это сделать?

    @lob4Noff
    Исходя из описанного примера:

    a = {'Спартак': 2, 'Зенит': 2, 'Локомотив': 2}
    
    for key in a:
        a[key] = [a[key]]
    
    print(a) # {'Спартак': [2], 'Зенит': [2], 'Локомотив': [2]}

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

    @lob4Noff
    string = '' # значение, которое будет проверяться в файле 1.txt 
    
    with open('1.txt', 'r') as file_c:
        for line in file_c:
            if string == line.replace('\n', ''):
                with open('all.txt', 'a') as file_w:
                    file_w.write(string)
    Ответ написан
    Комментировать
  • Как написать бота для вк с функциями администрирования беседы, а именно кик, бан, мут и предупреждение?

    @lob4Noff
    Начните с простого, а именно создайте бота, затем постепенно наращивайте функционал бота, тестируйте его в закрытой беседе.

    БД можно сделать с помощью csv, куда будут записываться айди пользователей, их статусы на право администрирования и отправки сообщений, количества предупреждений.
    Ответ написан
  • Как срезать в строке с нужного символа по следующую БУКВУ?

    @lob4Noff
    my = "G5293S982J"
    
    start = input('Enter the start: ').upper() # S
    end = input('Enter the end: ').upper() # J
    
    try:
        result = my[(my.index(start)+1):my.index(end)] 
        print(result) # 982 
    except:
        print('No matches!')

    В переменные start и end можете передавать символы, и программа сама вычислит необходимый промежуток.
    Ответ написан
    Комментировать
  • @callback_query_handler, в чем я ошибаюсь?

    @lob4Noff
    Python считывает Ваш код сверху вниз, и он передаёт call в первый callback_handler (собственно, он должен быть единственным).

    Ознакомьтесь более подробно с callback.data, чтобы использовать инлайн-клавиатуры и передавать функции в них.

    Возможное решение Вашей проблемы:

    ...
    @bot.message_handler(commands=['start'])
    def selects_an_employee(message):
        """Функция, которая отвечает за вывод кнопок с сотрудниками"""
        mes = 'Сотрудник'
        buttons_employee = get_buttons(list_of_employees)
    
        bot.send_message(message.chat.id, mes, reply_markup=buttons_employee) 
    
    @bot.callback_query_handler(func=lambda call: True)
    def callback_worker(call):
        if call.data == 'stanok': # если callback кнопки равен этому значению
            mes_machine = 'Станок'
            buttons_machine = get_buttons(list_of_machines)
    
            bot.send_message(call.message.chat.id, mes_machine, reply_markup=buttons_machine)  # вывод меню пользователю
    
        if call.data == 'detal': # условие, аналогичное условию выше
            mes_part = 'Деталь'
            buttons_parts = get_buttons(list_of_parts)
    
            # bot.send_message(message.chat.id, mes, reply_markup=buttons_machines)
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=mes_part,
                              reply_markup=buttons_parts)
    ...

    Также было бы интересно посмотреть на функцию get_buttons().
    Ответ написан
  • Как реализовать ограниченное количество попыток except?

    @lob4Noff
    Введите новую переменную, которая будет итерировать количество попыток:

    counter = 0 # Счётчик
    while counter <= 10:
        input_number = int(input('Enter the number: ')) #requests.get()
        try:
            result = 1/input_number
            counter += 1
        except:
            print('Wrong number, try again!')
            counter += 1
    else:
        print('End!') #system.exit(1)
    Ответ написан
    2 комментария
  • Как сделать реакцию на любую картинку в телеграм боте?

    @lob4Noff
    Воспользуйтесь следующей структурой:

    import telebot 
    
    bot = telebot.TeleBot('') #Вставьте Ваш токен сюда
    
    @bot.message_handler(content_types=['photo'])
    def get_pictures(message):
        bot.send_message(message.chat.id, text='Wow! Great picture!')
    ...
    bot.polling(none_stop=True)
    Ответ написан
    Комментировать
  • Почему Функция split не работает?

    @lob4Noff
    Вы получаете ошибку, потому что в описанном случае aiogram использует собственный тип данных. Метод split() работает в том случае, если объект является строкой.
    Вы можете получить словарь, содержащий информацию о пользователе и его сообщении, и затем передать в список значение сообщения по ключу (разбитие сообщения на отдельные слова будет при вхождении символа запятой):

    import config
    import logging
    
    from aiogram import Bot, Dispatcher, executor, types
    
    logging.basicConfig(level=logging.INFO)
    
    bot = Bot(token='')
    dp = Dispatcher(bot)
    
    @dp.message_handler()
    
    async def addrifm1(message: types.Message):
      mes = message
      list = mes['text'].split(",")
      await message.reply(" async def rifm1(message: types.Message):")
      await message.reply("if", list[1], " in message.text:")
      await message.reply("await message.reply(", list[2], ")")
    
    
    if __name__ == "__main__":
      executor.start_polling(dp, skip_updates=True)


    Если Вы только начинаете изучать программирование, советую Вам модуль telebot: его синтаксис намного легче, а в Сети Вы сможете получить больше документации.
    Ответ написан
  • Как сделать так, чтобы была одна команда, но разные ответы, зависящие от предыдущего ответа в «Телеграм» боте?

    @lob4Noff
    Алгоритм для реализации задачи достаточно прост:
    1. Создайте базу данных, которая будет содержать айди пользователя и количество раз, сколько этот пользователь вводил команду.
    2. При выполнении запроса считывайте полученный файл: если пользователя нет в базе данных, то запишите его айди и единицу (первый раз), затем отправьте ему 123. Если пользователь уже есть в базе, считайте текущее значение, и опираясь на него, отправьте пользователю нужный контент (если в базе 1, отправить 456; если 2, отправить 789 и т.д.)

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

    @lob4Noff
    kirillinyakin подсказал более компактный метод, в свою очередь могу предложить Вам доработанную версию Вашей идеи, где не будет рекурсивной ошибки, а сумма будет находиться для независимого количества чисел.

    def say(what):
        print(what)
    
    def get_sum(*args):
        items = [int(item) for item in list(*args)]
        print(sum(items))
    
    def connect(to):
        print(f'You are connected to "{to}"!')
    
    dict_func = locals()
    print(dict_func['connect'])
    
    while True:
        request = input('Enter your request: ')
        if 'say' in request and 'say' in request.split()[0]:
            say(request.replace('say ', ''))
        elif 'sum' in request:
            get_sum(request.split()[1:])
        elif 'connect' in request and 'connect' in request.split()[0]:
            connect(request.replace('connect ', ''))
        elif request == 'exit':
            print('Goodbye!'); break
        else:
            print("I don't understand you, try again!")
    Ответ написан
    Комментировать
  • Как сделать боту команду start?

    @lob4Noff
    Один из способов для Python, с помощью модуля telebot (установка - pip install pyTelegramBotAPI)

    1) Если у Вас нет бота, создайте его с помощью "Отца Ботов" (https://t.me/BotFather)
    2) Имея токен, создайте *.py-файл, и вставьте туда следующий шаблон для самого простого ответчика:
    import telebot
    
    token = '' #Вставьте Ваш токен, полученный от BotFather
    bot = telebot.TeleBot(token)
    
    
    @bot.message_handler(commands=['start']) #Для команды /start, можете изменить на любую другую
    def start_join(message):
        bot.send_message(message.chat.id, text="Приветствую!")
    
    bot.polling(none_stop=True) #Чтобы бот работал бесперебойно, пока запущена программа
    Ответ написан
    Комментировать
  • Как узнать о новом человеке в канале через telebot?

    @lob4Noff
    Используйте алгоритм подобного вида для получения данных о новом пользователе канала:
    @bot.message_handler(content_types=["new_chat_members"])
    def handler_new_member(message):
        user_id = message.from_user.id
        user_username = message.from_user.username

    Полученные данные можете вывести в терминал или записать в файл.
    Ответ написан
  • Как вывести подстрочный символ в строке ввода?

    @lob4Noff
    В Python 3.x поддерживаются индексы Юникода, и Вы можете воспользоваться ими в коде Вашей программы:
    • 0x208N - для чисел, +, -, =, (, )
    • 0x209N - для букв

    Пример использования:
    print(u'H\u2082O\u2082')
    # H₂O₂


    Источник: Stack Overflow
    Ответ написан