Ответы пользователя по тегу Боты
  • Как выводить ответ на вопрос при нажатии InlineKeyboardButton в телеграмм боте на pyTelegramBotAPI?

    shabelski89
    @shabelski89
    engineer
    вот за 10 мин набросал тебе пример, изучай.
    Вместо словарей прикрутить запросы к БД, можно логику меню подправить, например добавить выход из викторины.

    from random import choice
    import telebot
    from telebot import types
    
    
    
    API_TOKEN = ""
    bot = telebot.TeleBot(API_TOKEN)
    
    
    guessing_game = {
        0: {'question': 'Кто убил Кеннеди?', 'choices': ['Lee Harvey Oswald', 'Pamela Denise Anderson', 'Joseph Robinette Biden'] , 'answer': 'Lee Harvey Oswald'},
        1: {'question': 'Кто президент России?', 'choices': ['Горбачёв', 'Путин', 'Медведев'] , 'answer': 'Путин'},
        2: {'question': 'Что?Где?Когда?', 'choices': ['1', '2', '3'] , 'answer': '2'}
    }
    answer_guessing_game = {
        0: 'Lee Harvey Oswald',
        1: 'Путин',
        2: '2',
    }
    
    @bot.message_handler(commands=["start"])
    def start_message(message):
        keyboardmain = types.InlineKeyboardMarkup()
        ask_button = types.InlineKeyboardButton(text="Угадывать!", callback_data="play")
        keyboardmain.add(ask_button)
        try:
            bot.send_message(message.chat.id, "Привет, я бот помощник по тестам!", reply_markup=keyboardmain)
        except telebot.apihelper.ApiException:
            print('Error')
    
    
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
        if call.data == "play":
            keyboard_main = types.InlineKeyboardMarkup()
            question_id = choice(list(guessing_game.keys()))
            question = guessing_game[question_id]['question']
            choices = guessing_game[question_id]['choices']
    
            choices_buttons = [types.InlineKeyboardButton(text=x, callback_data=f"{question_id}_answer_{x}") for x in choices]
            keyboard_main.add(*choices_buttons)
    
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                                  text=question, reply_markup=keyboard_main)
    
        if "answer" in call.data:
            question_id, _, answer = call.data.split('_')
            right_answer = answer_guessing_game.get(int(question_id))
            keyboard = types.InlineKeyboardMarkup()
            if right_answer == answer:
                back_button = types.InlineKeyboardButton(text="back", callback_data="play")
                keyboard.add(back_button)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                                      text="Правильно!", reply_markup=keyboard)
            else:
                back_button = types.InlineKeyboardButton(text="back", callback_data="play")
                keyboard.add(back_button)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                                      text="Не правильно!", reply_markup=keyboard)
    
    
    
    if __name__ == '__main__':
        bot.infinity_polling()
    Ответ написан
    Комментировать
  • Rest Api telegram BOT как отследить на какое сообщение ответил пользователь?

    shabelski89
    @shabelski89
    engineer
    Вы не указали на каком ЯП, но в общем случае смотрим АПИ
    у объекта message , если это был ответ на другой message будет и свой ИД и вложенный объект message, на который ответили.
    вот пример сообщения , запоминаем "message_id": 1165934,
    {
     "update_id": 933188596,
     "message": {
      "message_id": 1165934,
      "from": {
       "id": 534905,
       "is_bot": false,
       "first_name": "Aleksandr",
       "last_name": "Shabelsky",
       "username": "shabelsky",
       "language_code": "ru"
      },
      "chat": {
       "id": 534905,
       "first_name": "Aleksandr",
       "last_name": "Shabelsky",
       "username": "shabelsky",
       "type": "private"
      },
      "date": 1661801219,
      "text": "тест сообщения"
     }
    }


    а вот при ответе на него

    {
     "update_id": 933188598,
     "message": {
      "message_id": 1165936,
      "from": {
       "id": 534905,
       "is_bot": false,
       "first_name": "Aleksandr",
       "last_name": "Shabelsky",
       "username": "shabelsky",
       "language_code": "ru"
      },
      "chat": {
       "id": 534905,
       "first_name": "Aleksandr",
       "last_name": "Shabelsky",
       "username": "shabelsky",
       "type": "private"
      },
      "date": 1661801228,
      "reply_to_message": {
       "message_id": 1165934,
       "from": {
        "id": 534905,
        "is_bot": false,
        "first_name": "Aleksandr",
        "last_name": "Shabelsky",
        "username": "shabelsky",
        "language_code": "ru"
       },
       "chat": {
        "id": 534905,
        "first_name": "Aleksandr",
        "last_name": "Shabelsky",
        "username": "shabelsky",
        "type": "private"
       },
       "date": 1661801219,
       "text": "тест сообщения"
      },
      "text": "тест ответа на сообщение"
     }
    }

    как видно в блоке reply_to_message есть "message_id": 1165934 , ссылка на отвеченное сообщение
    Ответ написан
    4 комментария
  • Проблемка с fetchall(). Можете помочь?

    shabelski89
    @shabelski89
    engineer
    Читаем учебник, а не пишем ботов. Что такое кортежи, списки, срезы.
    example = ('Valentine',)
    example[0]
    'Valentine'
    Ответ написан
    Комментировать
  • Как на питоне проверять статус платежа каждые 5 минут в telegram боте?

    shabelski89
    @shabelski89
    engineer
    Самое простое запустить функцию проверки в отдельном потоке. Примеры потоков тут.
    Ответ написан
    Комментировать
  • Как прикрепить фотографию к элементу списка в python?

    shabelski89
    @shabelski89
    engineer
    во-первых, не нужно называть переменные ключевыми словами ЯП (list )
    во-вторых, в данном случае лучше подходит структура данных - словарь
    from pprint import pprint
    cards = {'card_' + str(x): {'name': x, 'desc': x, 'photo': x} for x in range(1,22)}
    cards['card_21']['name'] = 'Мир'
    cards['card_21']['desc'] = 'Завершенность бла бла бла'
    cards['card_21']['photo'] = 'C:/Tools/tmp/card_21.png'
    pprint(cards)
    {'card_1': {'desc': 1, 'name': 1, 'photo': 1},
     'card_10': {'desc': 10, 'name': 10, 'photo': 10},
     'card_11': {'desc': 11, 'name': 11, 'photo': 11},
     'card_12': {'desc': 12, 'name': 12, 'photo': 12},
     'card_13': {'desc': 13, 'name': 13, 'photo': 13},
     'card_14': {'desc': 14, 'name': 14, 'photo': 14},
     'card_15': {'desc': 15, 'name': 15, 'photo': 15},
     'card_16': {'desc': 16, 'name': 16, 'photo': 16},
     'card_17': {'desc': 17, 'name': 17, 'photo': 17},
     'card_18': {'desc': 18, 'name': 18, 'photo': 18},
     'card_19': {'desc': 19, 'name': 19, 'photo': 19},
     'card_2': {'desc': 2, 'name': 2, 'photo': 2},
     'card_20': {'desc': 20, 'name': 20, 'photo': 20},
     'card_21': {'desc': 'Завершенность бла бла бла',
                 'name': 'Мир',
                 'photo': 'C:/Tools/tmp/card_21.png'},
     'card_3': {'desc': 3, 'name': 3, 'photo': 3},
     'card_4': {'desc': 4, 'name': 4, 'photo': 4},
     'card_5': {'desc': 5, 'name': 5, 'photo': 5},
     'card_6': {'desc': 6, 'name': 6, 'photo': 6},
     'card_7': {'desc': 7, 'name': 7, 'photo': 7},
     'card_8': {'desc': 8, 'name': 8, 'photo': 8},
     'card_9': {'desc': 9, 'name': 9, 'photo': 9}}

    как понятно из кода выше, в словарь добавляется ключ 'photo' и значение путь до файла.
    и дальше нужно передавать его через бота прочитав файл
    with open(cards['card_21']['photo'], "rb") as file:
        data = file.read()
    bot.send_photo(message.from_user.id, photo=data)

    но перед эти нужно написать функцию, которая будет принимать аргумент - ИД карты и подставлять его в open()
    Ответ написан
    Комментировать
  • Какую платформу для телеграм-бота выбрать?

    shabelski89
    @shabelski89
    engineer
    Вы можете написать этот код без телеграм бота ? Или хотя бы псевдокод?
    Ответ написан
  • Как в python telebot добавить кнопку?

    shabelski89
    @shabelski89
    engineer
    Информация с офф сайта
    а бибилиотека какая??
    вот примеры для aiogram
    вот примеры для pytelegrambotapi
    Ответ написан
    Комментировать
  • Возможно ли добавить циклом кнопки в телеграм боте?

    shabelski89
    @shabelski89
    engineer
    конечно, вот пример я для callback использую конструкцию, потому что список переменной длины.
    l = ['Яблоко', 'Груша']
    keyboard = types.InlineKeyboardMarkup()
    backbutton = types.InlineKeyboardButton(text="Back", callback_data="MainMenu")
    button_list = [types.InlineKeyboardButton(text=x, callback_data=x) for x in l]
    keyboard.add(*button_list, backbutton)
    Ответ написан
    1 комментарий
  • Как добавить гиперссылку в кнопку Telegram бота?

    shabelski89
    @shabelski89
    engineer
    Как написали выше только через inline клавиатуру.
    Рабочий код с примерами ниже, допиливайте как надо.
    import telebot
    from telebot import types
    
    token = ""
    
    bot = telebot.TeleBot(token)
    
    contacs = {'sales': '8 (888) 888888, доб. 300',
               'support': '8 (888) 888888, доб. 301',
               'accounting': '8 (888) 888888, доб. 302',
               'address': 'Наш адрес находится по адресу - адрес'}
    
    
    @bot.message_handler(commands=['start'])
    def handle_start(message):
        keyboardmain = types.InlineKeyboardMarkup()
        help = types.InlineKeyboardButton(text="Помощь", callback_data="help")
        contacts = types.InlineKeyboardButton(text="Адрес офиса", callback_data="address")
        site = types.InlineKeyboardButton(text="Перейти на сайт", callback_data="site", url='https://qna.habr.com/q/889613')
        keyboardmain.add(help, contacts, site)
        text = 'Добро пожаловать в Telegram бот компании "Лайт".'
        bot.send_message(chat_id=message.chat.id, text=text, reply_markup=keyboardmain)
    
    
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
        keyboardmain = types.InlineKeyboardMarkup()
        help = types.InlineKeyboardButton(text="Помощь", callback_data="help")
        contacts = types.InlineKeyboardButton(text="Адрес офиса", callback_data="address")
        site = types.InlineKeyboardButton(text="Перейти на сайт", callback_data="site", url='https://qna.habr.com/q/889613')
        buttons = [help, contacts, site]
        text = contacs.get(call.data, None)
        if call.data == 'help':
            accounting = types.InlineKeyboardButton(text="Бухгалтерия", callback_data="accounting")
            support = types.InlineKeyboardButton(text="Техподдержка", callback_data="support")
            sales = types.InlineKeyboardButton(text="Отдел продаж", callback_data="sales")
            back = types.InlineKeyboardButton(text="Назад", callback_data="back")
            buttons = [accounting, support, sales, back]
            text = 'Выберите пункт меню: '
        if call.data == 'accounting':
            back = types.InlineKeyboardButton(text="Назад", callback_data="back")
            buttons.append(back)
        if call.data == 'support':
            back = types.InlineKeyboardButton(text="Назад", callback_data="back")
            buttons.append(back)
        if call.data == 'sales':
            back = types.InlineKeyboardButton(text="Назад", callback_data="back")
            buttons.append(back)
        if call.data == 'address':
            back = types.InlineKeyboardButton(text="Назад", callback_data="back")
            buttons.append(back)
        keyboardmain.add(*buttons)
        bot.send_message(chat_id=call.message.chat.id, text=text, reply_markup=keyboardmain)
    
    
    if __name__ == "__main__":
        try:
            bot.polling(none_stop=True)
        except Exception as Error:
            print(Error)

    вот как будет выглядеть
    5fbb8eef7ca8b632815097.png
    Ответ написан
    1 комментарий
  • Как научить бота прятать в текст ссылку и отправлять клиенту?

    shabelski89
    @shabelski89
    engineer
    Вы об этом?
    bot.send_message(chat_id, '<a href="https://qna.habr.com/q/871643">Как научить бота прятать в текст ссылку и отправлять клиенту?</a>', parse_mode='html')

    5f969a2910599798913028.png
    Ответ написан
    5 комментариев
  • PyTelegramBotAPI - Как сделать отправку большого при нажатие на кнопку у бота телеграм?

    shabelski89
    @shabelski89
    engineer
    Предположим Вы хотите выдавать текст песни методом bot.send_message. нужно учесть ограничение telegram api на 5000 знаков за один запрос. В документации pytelegrambotapi приведен пример как брать большой текст из файла и отправлять его порциями. 5f6fb6b0f172d925441874.jpeg

    Нужно определиться с размером текста, меняется ли он в зависимости от поведения/запросов пользователя.
    Ответ написан
    Комментировать
  • Связать телеграмм бота со своим аккаунтом?

    shabelski89
    @shabelski89
    engineer
    Например через библиотеку телетон , можно и эмуляцию пользователя и бота делать.
    Ответ написан
    Комментировать
  • Как сделать отложенную отправку?

    shabelski89
    @shabelski89
    engineer
    Не совсем ясна задача, то ли по cron на каждом сервере что-то делать, то ли внутри бота по расписанию внутри бота.. ниже пример запуска в отдельном потоке "планировщика", который в 12:00 будет вызывать функцию отправки текста
    from threading import Thread
    import schedule
    
    
    def sheduler():
        schedule.every().day.at("12:00").do(daily_notify)
        while True:
            schedule.run_pending()
            sleep(1)
    
    
    
    def daily_notify():
        pass
        #bot send text
    
    Thread(target=sheduler, args=()).start()
    Ответ написан
    Комментировать
  • Telebot - Как получить ID пользователя по username?

    shabelski89
    @shabelski89
    engineer
    Напрямую никак,
    есть методы получить кол-во участников в чате (нужно знать group_chat_id):
    bot.get_chat_members_count(group_chat_id)
    метод получения админов
    bot.get_chat_administrators(group_chat_id)
    чтобы получить инфо по юзерам нужен chat_id каждого и тут возможно только хитростями
    bot.get_chat_member(group_chat_id, chat_id )
    • записывать все сообщения чата от пользователей и составлять таблицу USERS, с полями chat_id, username, first_name, last_name. Если чат активный то быстро получите всех и сопоставите.
    • отслеживать сообщения "присоединился к группе" и "вышел из группы"

    Есть сложность что username, first_name, last_name - не являются обязательными полями, то есть могут быть юзеры у которых они не заполнены. Поэтому, на мой взгляд оптимально парсить сообщения группы, и каждого кто написал заносить в таблицу БД.
    Ответ написан
    1 комментарий
  • TelegramBOT сохранение голосовых сообщений?

    shabelski89
    @shabelski89
    engineer
    Когда будем учиться гуглить и изучать документацию, примеры?

    Ниже код, при отправке голосовой заметки - сохраняет файл в формате *.ogg с именем userId_unixtime (микросекунды обрезал коряво но и так сойдет). По команде /start - бот отправит сохранённые файлы голосовых заметок для пользователя, который их записал.

    # -*- coding: utf-8 -*-
    import telebot
    from time import time
    import os
    
    bot = telebot.TeleBot(token_test)
    
    
    @bot.message_handler(content_types=['voice'])
    def voice_processing(message):
        file_info = bot.get_file(message.voice.file_id)
        downloaded_file = bot.download_file(file_info.file_path)
        with open(f'{message.chat.id}_{int(time())}.ogg', 'wb') as new_file:
            new_file.write(downloaded_file)
    
    
    @bot.message_handler(commands=['start'])
    def voice_send(message):
        l_send = [filename for filename in os.listdir() if filename.startswith(f'{message.chat.id}')]
        for f in l_send:
            voice = open(f'{f}', 'rb')
            bot.send_voice(chat_id=message.chat.id, voice=voice)
    
    
    if __name__ == "__main__":
        try:
            bot.polling(none_stop=True)
        except Exception as e:
            print(e)
    Ответ написан
    1 комментарий
  • Как дать телегам-боту задержку?

    shabelski89
    @shabelski89
    engineer
    То что нужно почти 1 в 1 в примере тут
    Ответ написан
  • Как передать ответ функции парсинга почты в телеграмм бот на python?

    shabelski89
    @shabelski89
    engineer
    1) функция должна что-то возвращать, добавьте return data например.
    2) из бота импорт модуля с функцией проверки почты from module_name import loop , лучше имени для функции нет?
    3) добавляете в боте функцию check_email, которая периодически дергает функцию проверки почты - loop
    from time import sleep
    
    
    def check_email():
        while True:
            mails = loop()
            if mails:
                for mail in mails:
                    bot.send_message(admin_id, mail)
            sleep(60)

    4) в боте делаете вызов функции check_email в отдельном потоке, например так
    from threading import Thread
    
    Thread(target=check_email, args=()).start()

    5) бот умеет слать только str, это касается return data, если там например возвращается tuple.
    Ответ написан
    4 комментария
  • Удалить с базы юзера если 403 bot was blocked by the user?

    shabelski89
    @shabelski89
    engineer
    def post_sql_query(sql_query):
        with sqlite3.connect(database) as connection:
            cursor = connection.cursor()
            try:
                cursor.execute(sql_query)
            except Error:
                print(Error)
            result = cursor.fetchall()
            return result
    
    def delete_user(user_id):
        del_user_query = f'DELETE FROM users WHERE user_id = {user_id};'
        post_sql_query(del_user_query)
    
    try:
        bot.send_message(user_id, text)
    except telebot.apihelper.ApiException:
        delete_user(user_id)
    Ответ написан
  • Как отфильтровать текст по символу в python-telegram-bot?

    shabelski89
    @shabelski89
    engineer
    штатными средствами python?
    if message.text.find('?') != -1:
       print('ok')
    Ответ написан
    1 комментарий