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

    InternetMaster
    @InternetMaster
    Интернет
    Вообще tel:77777777777 или tel://77777777777, но телеграм блокирует такие ссылки. Если попытаться отправить в другом приложении (например СМС, то все ок).

    При максимальной необходимости можно с использованием сайта дать пользователю ссылку на сайт, и уже на нем будет кнопка "Позвонить". По идеи не должно быть так, чтобы из браузера не позвонилось.
    Ответ написан
  • Бот не выводит встроенную клавиатуру, в чём может быть проблема?

    InternetMaster
    @InternetMaster
    Интернет
    Так ты же не привязал клавиатуру к сообщению. И кстати, ты уже назначил глобал переменную markup, хорошечно было бы её не перебивать локалом, а юзать иное название.

    Привязываю исправную версию кода
    import telebot
    import random
    import config
    from telebot import types
    from random import choice
    
    bot = telebot.TeleBot(config.TOKEN)
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton('Расписание')
    markup.add(item1)
    
    
    
    
    @bot.message_handler(commands='start')
    def welcome(message):
      pic = open(r'aitvaro.jfif', 'rb')
      bot.send_photo(message.chat.id, pic)
    
      bot.send_message(message.chat.id, 'Привет, {0.first_name}! Я -<b>{1.first_name}</b>, Бот-помощник для учеников "Айтваро Гимназии"\nМогу подсказать расписание, даты каникул, фильм на вечер и многое другое'.format(message.from_user,bot.get_me()),
          parse_mode='html', reply_markup=markup)
      
    
    
    @bot.message_handler(content_types=['text'])
    def raspisanie(message):
      if message.chat.type == 'private':
        if message.text == 'Расписание':
          markup2 = types.InlineKeyboardMarkup(row_width=2)
          item21 = types.InlineKeyboardButton('1a', callback_data='1a')
          item22 = types.InlineKeyboardButton('1b', callback_data='1b')
          item23 = types.InlineKeyboardButton('1c', callback_data='1c')
          item24 = types.InlineKeyboardButton('1d', callback_data='1d')
          item25 = types.InlineKeyboardButton('2a', callback_data='2a')
          item26 = types.InlineKeyboardButton('2b', callback_data='2b')
          item27 = types.InlineKeyboardButton('2c', callback_data='2c')
          item28 = types.InlineKeyboardButton('2d', callback_data='2d')
          markup2.add(item21, item22, item23, item24, item25, item26, item27, item28)
          bot.send_message(message.chat.id, 'Выбери свой класс', reply_markup=markup2)
        else:
          bot.send_message(message.chat.id, 'Я не понял этого сообщения')
    
    
    
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
      pic1a = open('1a.png', 'rb')
      pic1b = open('1b.png', 'rb')
      pic1c = open('1c.png', 'rb')
      pic1d = open('1d.png', 'rb')
      pic2a = open('2a.png', 'rb')
      pic2b = open('2b.png', 'rb')
      pic2c = open('2c.png', 'rb')
      pic2d = open('2d.png', 'rb')
    
      try:
        if call.message:
          if call.data =='1a':
            bot.send_message(call.message.chat.id, pic1a, 'Расписание "1а" класса')
          elif call.data =='1b':
            bot.send_message(call.message.chat.id, pic1b, 'Расписание "1б" класса')
          elif call.data == '1c':
            bot.send_message(call.message.chat.id, pic1c, 'Расписание "1с" класса')
          elif call.data =='1d':
            bot.send_message(call.message.chat.id, pic1d, 'Расписание "1д" класса')
          elif call.data =='2a':
            bot.send_message(call.message.chat.id, pic2a, 'Расписание "2а" класса')
          elif call.data == '2b':
            bot.send_message(call.message.chat.id, pic2b, 'Расписание "2б" класса')
          elif call.data =='2c':
            bot.send_message(call.message.chat.id, pic2c, 'Расписание "2с" класса')
          elif call.data =='2d':
            bot.send_message(call.message.chat.id, pic2d, 'Расписание "2д" класса')
    
          else:
            ('Такого класса нет в списке')
      except Exception as e:
        print(repr(e))
    Ответ написан
    Комментировать
  • Есть ли в aiogram аналог "bot.register_next_step_handler" от telebot?

    InternetMaster
    @InternetMaster
    Интернет
    Нет, такого нет. Хотя есть State, можно с ней разобраться.

    Ссылку прилагаю: https://docs.aiogram.dev/en/latest/examples/finite...
    Ответ написан
    Комментировать
  • Как подключить калькулятор криптовалют к боту?

    InternetMaster
    @InternetMaster
    Интернет
    Нужно использовать API сервисов которые предоставляют курс нужной криптовалюты.
    Ответ написан
    Комментировать
  • Реализация выдачи персональной ссылки на чат через телеграм бота?

    InternetMaster
    @InternetMaster
    Интернет
    Добро пожаловать в раздел документации, уважаемый новичок.

    Тебя интересует метод createchatinvitelink.
    Ответ написан
    Комментировать
  • Как сделать пригласить в чат через URL кнопку?

    InternetMaster
    @InternetMaster
    Интернет
    Это посредством ссылки t.me/share.

    Использование: t.me/share/url?url=&text=hello

    В text= можно подставить любой текст, которым вы хотите поделиться.
    Можно и url= поставить ссылку на любой сайт каким хотите поделиться, например: t.me/share/url?url=telegram.org&text=hello

    Но ссылки без url (как в начале) не работают например, в Telegram Desktop, а только в мобильных приложениях.
    Ссылки с url, работают везде (кроме Web, где это не работает вообще)
    Ответ написан
    3 комментария
  • Выдает ошибку: Bad Request: can't parse inline keyboard button: Text buttons are unallowed in the inline keyboard?

    InternetMaster
    @InternetMaster
    Интернет
    В Inline клавиатуре нужно callback_data сделать не 0, а "0"; не 1, а "1".
    Ответ написан
    2 комментария
  • Как сделать меню InlineKeyboard которое будет переключаться как страницы (Telebot)?

    InternetMaster
    @InternetMaster
    Интернет
    Тут зависит от того, постоянный ли результат или динамический.

    Если постоянный (не изменяется если, например запрос был сделан сейчас и через 3 секунды), то можно просто указать, что стрелочка "вперед" перекинет на следующую страничку результатов.

    Для этого в callback нужно передать уникальный идентификатор запроса (например, результаты по поиску "как приготовить роллы" это уникальный идентификатор "1", запрос "как приготовить блины" уникальный идентификатор "2", и т.д.).
    Callback data может выглядеть как-то так: "result1_2" (где 1 - уникальный идентификатор запроса, а 2 - номер странички, куда перебросить при нажатии).
    Когда пользователь нажмет на эту кнопку, выдайте callback "result1_3", а в кнопку назад - "result1_1".

    Если динамическая система, например как у гугла или яндекса, где при каждом запросе уникальные результаты, то лучше сразу записать в базу все ответы, и уже от туда доставать, с уникальным идентификатором запроса для каждого конкретного запроса. Но это уже другой уровень, думаю что не в вашем случае.
    Ответ написан
    Комментировать
  • Почему не обрабатывается следующий handler?

    InternetMaster
    @InternetMaster
    Интернет
    Потому что у тебя обработчик команды /go находится ниже обработчика текста. Команда /go относится к тексту, если обработчик не ловит эту команду раньше текста. Просто поднимите обработчик команды.

    @bot.message_handler(commands=['start'])  
    def welcome(message):
        sti = open('imagine/sticker.webp', 'rb')
        bot.send_sticker(message.chat.id, sti)
    
        #КЛАВИАТУРА 1
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard =True)
        item = types.KeyboardButton("\N{world map}")
    
        markup.add(item)
    
        bot.send_message(message.chat.id, "Привет! /help".format(message.from_user,bot.get_me()),
                         parse_mode='html', reply_markup=markup)
    
    @bot.message_handler(commands=['help'])
    def hi1(message):
        bot.send_message (message.chat.id, "Наберите команду /go или /we")
            
    @bot.message_handler(commands=['go'])
    def go(message):
        
        #КЛАВИАТУРА 2
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard =True)
        item1 = types.KeyboardButton("\N{baby}")
        item2 = types.KeyboardButton("\N{girl}")
        item3 = types.KeyboardButton("\N{man}")
    
        markup.add(item1, item2, item3)
        
        bot.send_message(message.chat.id, "Возраст?", reply_markup=markup)
        bot.register_next_step_handler(go1)
    
    @bot.message_handler(content_types=['text'])
    def hi(message):
        if message.chat.type == 'private':
            if message.text == '\N{world map}':
                 mesg = bot.send_message(message.chat.id, 'наберите команду /go')
                 if message.text == '/go':
                     bot.register_next_step_handler(mesg, go)
            else:
                bot.send_message(message.chat.id, 'Не знаю, что и ответить \N{anguished face} \nНабери команду /help, чтобы ознакомиться со списком команд')
    
    
    def go1(message):
        if message.chat.type == 'private':
            if message.text == '\N{baby}':
    
                 #КЛАВИАТУРА 3
                markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard =True)
                item1 = types.KeyboardButton("игры")
                item2 = types.KeyboardButton("деньги")
                item3 = types.KeyboardButton("телки")
    
                markup.add(item1, item2, item3)
            
                bot.send_message(message.chat.id, 'Окей, кого вы любите больше?')
    Ответ написан
    Комментировать
  • Aiogram. Не работает рассылка. как исправить?

    InternetMaster
    @InternetMaster
    Интернет
    Напоминаю, что нужно строго соответствовать пункту 3.8 правил.

    А ответ на вопрос - пишет, что чат не найден. Возможно у вас в базе нет пользователей вообще, или в качестве user_id вернулось что то другое, хотелось бы видеть ответ от базы, чтобы понять. Возможно вернулось [(None), (None), (None)] или тому подобное.

    Также вы не реализовали механизм задержки при рассылке. Это надо, чтобы не упереться в лимит - 30 сообщений в секунду, сделайте это.
    Ответ написан
    Комментировать
  • Как создать психологический тест на телеграм боте?

    InternetMaster
    @InternetMaster
    Интернет
    Ну начнем с того, что вы не указали библиотеку, но можно понять что у вас PyTelegramBotAPI по bot.register_next_step_handler и общей сложности вопроса.

    Думаю, может вы всерьез про оператор сравнения не слышали.

    def lala(message):
        if kolvoLet == 0: # На самом деле, можно и не делать, если возраст не привязан к ответам, просто в вопросе было 0 лет
            if chtoTamUTebya == 'любишь играть':
                pass # Здесь соответственно на «любишь играть»
            elif chtoTamUTebya == 'любишь петь':
                pass # Здесь соответственно на «любишь петь»
            # И попер так дальше по всем вариантам.
    Ответ написан
    3 комментария
  • Не работает меню и за Webhook, как исправить?

    InternetMaster
    @InternetMaster
    Интернет
    Не понял, зачем bot.polling() если у вас webHook?
    Это раз. Во вторых, вы хотите дать самоуничтожение серверам Telegram или что? Зачем вы в качестве своего url даете url сервера телеграма на который обычно нужно отправлять запросы, если телеграм с него и посылает вам (см. переменную APP_URL)?
    В третьих, хочу вам сказать, чтобы вы не забыли насчет слешей когда будете принимать запросы от телеграма, чтобы если ваш url был yourdomain.com/secrettoken/ вы указали @server.route('/secrettoken/'), а не @server.route('/secrettoken')

    Можно через домен (желательно), можно по IP, но указать ваш сервер куда телеграм будет посылать запросы, а не чтобы телеграм сам себе посылал запросы.

    Также не забудьте, про сертификат SSL, который требует от вас телеграм. Можно - нормальный, можно самоподписанный. Его отправьте в запросе setWebhook и добавьте к server.run в паре с секретным ключом.

    Если не хотите SSL, можно настроить Local Bot API Server, и чтобы он отсылал вам запросы по localhost и вы ему, но это куда запарнее, чем дать SSL.
    Ответ написан
    Комментировать
  • Можно ли как-то просто и быстро поднять Telegram Local Bot API Server в Docker Compose (лучше всего - в Laradock) - как именно?

    InternetMaster
    @InternetMaster
    Интернет
    Может, эффективней открыть порт чтобы присылались webHook на ваш компьютер?
    Ответ написан
  • Хранение картинок БОТ-магазин?

    InternetMaster
    @InternetMaster
    Интернет
    У телеграм есть file_id для каждой фотографии/видео/файла и т.д. Лишь раз отправив в боте картинку кому-нибудь телеграм тебе вернёт file_id этой фотографии. Потом вместо того, чтобы хранить фото у себя, просто записываешь file_id и отсылаешь в качестве фото file_id. Это максимально удобно.
    Ответ написан
    Комментировать
  • Как зациклить телеграм бота, написанного в питоне?

    InternetMaster
    @InternetMaster
    Интернет
    Необходимо строго соблюдать пункт правил 3.8!

    А по вопросу просто добавить else в text handler
    Ответ написан
  • Возможна ли локальная разработка с Telegram Login Widget без костылей?

    InternetMaster
    @InternetMaster
    Интернет
    Ну можно открыть порт своего компьютера. А вообще, просто прописать localhost, но не 127.0.0.1. Соответственно в браузере тоже писать localhost
    Ответ написан
  • Как определить количество фото в media group (pytelegrambotapi)?

    InternetMaster
    @InternetMaster
    Интернет
    Телеграм высылает все фото по отдельности (не важно, были они отправлены группой или по отдельности). Тут нужно пересчитать количество полученных от пользователя сообщений message photo. Или перед отправкой спросить у пользователя.
    Ответ написан
  • Как с помощью ботов отправлять видео в телеграмме которое весит больше 50 Мб?

    InternetMaster
    @InternetMaster
    Интернет
    Запустить telegram-bot-api на локальном сервере. Тогда отправлять можно будет до 2 гб.
    Ответ написан
    Комментировать
  • Как реализовать что б при нажатии кнопки клавиатуры в телеграм боте у вас открывался чат с человеком?

    InternetMaster
    @InternetMaster
    Интернет
    Можно Inline кнопкой в качестве url передать username пользователя с которым требуется открыть чат. Ссылка в формате t.me/username.
    Ответ написан
    Комментировать