Ответы пользователя по тегу Боты
  • Как сделать ссылку в callback_data?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для этого надо использовать url-кнопку, а не callback-кнопку

    https://core.telegram.org/api/bots/buttons
    Ответ написан
    Комментировать
  • Как авторизовать пользователя на сайте через бот Вайбера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Update: как обсудили с автором, скорее всего тут речь об использовании deep linking. Пользователь идёт по ссылке, где в context передаётся какой-то идентификатор или хеш, затем делится с ботом своим номером телефона, и авторизация пройдена.

    Предыдущий ответ оставляю, так как он тоже может оказаться полезен:

    Viber Bot (в девичестве Viber Public Account) не позволяет отправку сообщений по номеру телефона. Для этого надо использовать Viber Business Messages (в девичестве Viber Service Messages) через партнёров Viber.

    Обычная практика в этой сфере - посылать сообщение через Viber, затем по таймауту высылать запасную СМС. Это называют модным словом "каскад". Можно для повышения надёжности включать в каскад также WhatsApp (и другие каналы с отправкой по номеру телефона, например, mail.ru notify). Но можно просто при проверке номера пользователя предлагать ему самому выбрать из списка предпочтительный канал для проверки (если не сработает - пользователь попробует другой канал самостоятельно).

    Нужно быть готовым к тому, что стоимость отправки в Viber/WA по номеру телефона стоит дороже, чем СМС. Хотя сообщение на мессенджеры принято тарифицировать только при успешной доставке (недоставленные бесплатны), есть также обязательный ежемесячный платёж (для Viber это требование самого Viber, для WhatsApp большинство поставщиков продают минимальный пакет хотя бы на 5-10 тыс. рублей, а те, кто не берут абонентку, для покрытия своих расходов тарифицируют даже бесплатные сообщения).
    Ответ написан
  • Возможна ли полная автоматизация в Viber?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    У Viber нет открытого клиентского API.
    Ответ написан
    Комментировать
  • Телеграм бот на from_user показывает свои данные. Что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    call.message - исходное сообщение, в котором пользователь нажал на кнопку. Разумеется, автором этого сообщения является бот.

    Вместо call.message.from_user надо использовать call.from_user.

    Идея использовать call.message.chat.id для получения id пользователя будет работать только до тех пор, пока это используется в личном чате с пользователем, где chat_id всегда равен user_id. В групповых чатах это работать не будет.
    Ответ написан
    Комментировать
  • Как сделать перенос текса в боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Укажи \n или даже \n\n (два переноса - чтобы между абзацами была пустая строка).

    Чтобы использовать html, надо передавать параметр parse_mode='html'. Есть ограничения - не все тэги поддерживаются. См. https://core.telegram.org/bots/api#html-style

    Также есть parse_mode='MarkdownV2' и parse_mode='Markdown, подробнее https://core.telegram.org/bots/api#formatting-options
    Ответ написан
    Комментировать
  • Как продолжить принимать сообщения aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это плохая идея! Библиотека выбирает первый обработчик, подходящий по условию (в данном случае content_types=["text"]) и остальные не использует вообще.

    Рекомендую либо вставить проверку в каждый handler, либо оформить её как условие в декораторе:

    @dp.message_handler(lambda message: not is_banned(message.from_user.id)


    Можно также написать свой декоратор, чтобы писать просто @check_user_banned. Но это уже по желанию.
    Ответ написан
    1 комментарий
  • Как получить file_id без отправки сообщения пользователю?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я решал эту задачу так: при первой отправке файла я его отправлял как файл, запоминая file_id в словаре и в таблице в базе, а при следующей уже имел готовый file_id. При этом я могу в любой момент добавлять файлы, не задумываясь о том, загружал ли я их уже в Telegram или нет.

    files = {}
    def load_files():
      global files
      res = db.execute("SELECT file_name,file_id FROM files")
      files = {}
      for row in res:
        file_name, file_id = row
        files[file_name] = file_id
    
    def save_file(file_name, file_id):
      global files
      db.execute("INSERT INTO files (file_name,file_id) VALUES (?,?) ON CONFLICT(file_name) DO UPDATE SET file_id=excluded.file_id", (file_name, file_id))
      files[file_name] = file_id
    
    load_files()
    
    ...
            if item["photo"] in files:
              file_id = files[item["photo"]]
              print (f" send photo file_name={item['photo']} file_id={file_id}")
              bot.send_photo(call.message.chat.id, file_id)
            else:
              with open(os.path.join("menu", item["photo"]), "rb") as f:
                bot.send_chat_action(call.message.chat.id, "upload_photo")
                r = bot.send_photo(call.message.chat.id, f)
                file_id = r.photo[0].file_id
                save_file(item["photo"], file_id)
                print (f" uploaded photo file_name={item['photo']} file_id={file_id}")
    Ответ написан
    Комментировать
  • Как узнать статус пользователя Telegram (онлайн\оффлайн)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Bots API не позволяет узнать состояние онлайна пользователя. Это можно узнать только через клиентский API.
    Ответ написан
    Комментировать
  • Расшифровывается QRcode в TelegramBotAPI, но расшифровывает характеристики фотографии?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Очевидно, потому что data представляет из себя экземпляр класса Decoded. Думаю, тебе нужно data.data, да ещё и привести тип bytes к строке: data.data.decode()
    Ответ написан
    1 комментарий
  • Что делать если бот не отвечает на команду?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Судя по коду, ты вообще не понимаешь, что написал.

    inp будет содержать строку, введённую с клавиатуры, cmds - пустой список

    Дальше проверяется inp == cmds. Очевидно, что пустой список никогда не равен строке, поэтому мы сразу попадаем в else и один раз выполнем этот блок, после этого программа автоматически хавершается.

    Возьми любой учебник по Python (например, Лутца) и изучи основы. Без понимания базовых вещей вообще ничего осмысленного ты никогда не напишешь.
    Ответ написан
    Комментировать
  • Передача данных в callback_data с pyTelegramBotAPI?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно просто запоминать текст пользователя, а в callback_data передавать какие-нибудь кодовые обозначения нажимаемых кнопок. При получении от пользователя кода кнопки можно по его id достать ранее сохранённый текст и выполнить все нужные действия.
    Ответ написан
    Комментировать
  • При наличии on_message(), @bot.command не работает, что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сейчас в коде какая-то каша. Зачем внутри класса MyClient, порождённого от Client, использовать методы с декораторами от ранее созданного инстанса другого потомка Client - commands.Bot? Это не имеет никакого смысла. Убери класс MyClient вообще, а все его методы перенеси на уровень выше (с соответствующим убиранием self везде в аргументах и заменой self на bot в коде). Вместо client.run сделай bot.run.
    Ответ написан
    Комментировать
  • Пишет два сообщения вместо одного. Что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Запись вида:

    if xxx == ('a' or 'b' or 'c'):

    свидетельствует о полном незнании языка Python. Соответственно, не зная языка, ничего хорошего написать не получится. Великое счастье, что этот код хотя бы не управляет ядерными боеголовками. Начинать надо с азов.
    Ответ написан
    2 комментария
  • Какая-то проблема с кодом, поможете?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ну так что написано, то он и делает.

    if message.chat.type == 'private':

    Если написали в приват, то в зависимости от сообщения будет тот или иной ответ.

    А если написали не в приват, то код сразу попадает в блок else.

    Прежде чем писать ботов, надо почитать учебник по python. Обязательно! Тогда и не будет таких тривиальных вопросов. Отступы в python очень важны. В этом коде else относится не к if-elif-elif... а к внешнему if.
    Ответ написан
    Комментировать
  • Ошибка в python aiogram телеграмм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Он же пишет прямо, что не так. Запущен где-то второй инстанс бота с тем же токеном, который также дёргает getUpdates.
    Ответ написан
    Комментировать
  • Как в телеграм-боте задать ключ для кнопки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    "Ключи" можно задать только для inline-клавиатуры.
    Ответ написан
    Комментировать
  • Почему не выводится результат в inline mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Всё прекрасно работает.

    615a38bc692d3060148638.png
    Ответ написан
  • Как получить file_id в телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    При отправке фото можно получить его file_id и в следующий раз отправлять только его, например:

    files = {}
    if photo_name in files:
        file_id = files[photo_name]
        bot.send_photo(message.chat.id, file_id)
    else:
        with open(photo_name, "rb") as f:
            bot.send_chat_action(message.chat.id, "upload_photo")
            r = bot.send_photo(message.chat.id, f)
            file_id = r.photo[0].file_id
            files[photo_name] = file_id


    Для входящих сообщений:

    @bot.message_handler(content_types=['photo'])
    def image_message(message):
      file_id = message.photo[0].file_id
    Ответ написан
  • Можно ли послать callback_data без кнопки в боте телеграм на aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак. Именно нажатие на кнопку и генерирует callback, без нажатия его и не случится.
    Ответ написан
  • Как побороть ошибку "Wrong response from the webhook: 404 Not Found"?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Там пишет последнюю ошибку и время, которые получил Телеграм при обращении к вебхуку. Если это не какая-то давно неактуальная ошибка, то надо чинить вебхук, ну или проверять что его адрес в Телеграме указан верно.
    Ответ написан
    Комментировать