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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Боты не могут подписываться на каналы, их может добавлять в список подписчиков канала только владелец/админ канала. На каналы могут подписываться только живые пользователи. Соответственно, придётся пересмотреть концепцию. Например, объяснить пользователю в картинках, как ему добавить бота в канал вручную. Или, в конце концов, вместо бота использовать юзербота.
    Ответ написан
    Комментировать
  • Как перебрать всех пользователей, и узнать создателя беседы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Telegram Bot API не предоставляет возможности получить список участников чата. Это можно сделать только с помощью клиентского API (его реализует, например, библиотека telethon).

    Однако если id пользователя известен (можно, например, отслеживать ботом сообщения о вступлениях в чат, запоминая всех, кто вошёл в чат после бота), можно проверить его роль в чате с помощь метода get_chat_member. Но основатель чата, очевидно, будет в нём всегда самым первым пользователем до любого бота.
    Ответ написан
    Комментировать
  • Как настроить передачу с формы на заказчика т.г?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Токен не даёт полного доступа к аккаунту, только возможность отправлять/принимать сообщения от имени бота. Так что это вполне нормально передавать токен бота для интеграции. В конце концов, владелец бота может через BotFather поменять токен и тем самым быстро отключить ранее выданный.
    Ответ написан
    3 комментария
  • Как сделать телеграмм бота, который когда его отметили дает выбор какое отправить аудио?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это не "отметили", а так называемый inline mode. Нужно включить этот режим в настройках бота, а затем в коде реализовать обработчик inline_handler. Примерно так:

    @bot.inline_handler(lambda query: len(query.query) > 0)
    def query_text(inline_query):
        keyboard = []
        for code in ['foo', 'bar']:
            keyboard.append(telebot.types.InlineQueryResultArticle(code, f'>>> {code} <<<', telebot.types.InputTextMessageContent(f'<<<{code}>>>')))
        bot.answer_inline_query(inline_query.id, keyboard, is_personal=True)


    Важно понимать, что inline mode - это не полноценное средство интеракции с ботом, а помощник в написании сообщения от пользователя. В частности, результаты inline query кэшируются на серверах Телеграма, так что если поступит такой же запрос, что и минуту назад, то Телеграм даже не сделает запроса к боту. Также в этом режиме не раскрывается информация о чате, в который будет отправлено сообщение, и даже больше того, пользователь может в итоге отказаться от отправки сообщения вообще, но бот об этом не узнает.

    ЗЫ
    Мне в одном боте пришлось из-за этого реализовать концепцию inline policy: в зависимости от настроек чата бот может игнорировать или даже удалять сообщения, оставленные пользователями с помощью inline mode ботов из чёрного списка.
    Ответ написан
    Комментировать
  • Есть ли payload в телеграм кнопках?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для обычных (не inline) кнопок текст на кнопке означает обычный текст, передаваемый боту при нажатии на кнопку. Никакого другого способа определить нажатую кнопку нет.
    Ответ написан
    Комментировать
  • Как получить id?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, средствами Bot API это невозможно. Тем более что у пользователя может вообще не быть username.

    Конечно, его можно получить в событии от пользователя в поле Update.from.id, но для этого пользователь должен сделать какое-то действие в сторону бота (или, например, в сторону группы, в которой он состоит).
    Ответ написан
    Комментировать
  • Как сделать что-бы бот отправлял сообщение в групповой но, не в лс?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Распространённая ошибка: в качестве chat_id используется id пользователя. Естественно, получателем будет пользователь, а не группа.

    Правильно вместо этого:

    $chat_id = $data['message']['from']['id'];

    использовать это:

    $chat_id = $data['message']['chat']['id'];
    Ответ написан
    Комментировать
  • Как ограничить частоту нажатий кнопки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Очевидно, запоминать куда-нибудь время последнего нажатия на кнопку и сравнивать его при очередном нажатии. Можно также при нажатии на кнопку убирать/изменять клавиатуру, но пользователь может успевать иногда нажать на кнопку 2-3 раза до исчезновения/изменения кнопки.
    Ответ написан
    6 комментариев
  • Как прописать код на питоне для настройки кнопок бота телеграмм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, по кнопке выполняется всего одно действие. Так что можно передать только то, что передаётся с этой кнопкой, плюс каким-либо образом ранее полученую информацию.
    Ответ написан
  • Получить список каналов/чатов на которые подписан бот?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Бот никак не может получить список чатов, которые ему доступны. Нужно было сохранять их самому куда-то.
    Ответ написан
    Комментировать
  • Как реализовать регистрацию пользователя из чата telegram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Обычная практика - держать в памяти кэш пользователей. При изменениях также выполнять запрос к базе. При запуске бота - вычитывать пользователей в память.
    Ответ написан
    Комментировать
  • Где в моём коде ошибка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет работать. После отправки сообщения "Вам есть 18?" в переменной message не появится нового сообщения. И вообще, надо привыкать, что боты работают по событиям. Нажатие на кнопку - это новое событие, которое сделает новый вызов обработчика.

    Для таких задач лучше использовать FSM пример https://github.com/eternnoir/pyTelegramBotAPI/blob...
    Ответ написан
    Комментировать
  • Как изменить отправленное ботом inline сообщение?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо внутри функции объявлять другую функцию! Это делают в некоторых специфических случаях (например, создание нового декоратора), но чаще всего это категорически неправильно и никаких задач не решает. В том числе и в этом случае никак это не поможет.

    Что касается задачи, то это типичный FSM https://github.com/eternnoir/pyTelegramBotAPI/blob...

    Использовать одну глобальную переменную тут бессмысленно, так как с ботом взаимодействует много пользователей, и у каждого должно быть своё значение. А не одно на всех.
    Ответ написан
    3 комментария
  • I made a telegram bot, it worked, but I restarted it, the same code that worked started to give an error. what to do?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Очевидно, что содержимое data сохранялось только в памяти и после рестарта бота было потеряно. Надо было сохранять куда-нибудь.
    Ответ написан
    Комментировать
  • Почему 2 id, хотя один должен быть?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что надо различать message.from_user.id и message.chat.id. Первое - id отправителя. Второе - id чата. На текущий момент API Телеграма реализован так, что для привата с ботом chat_id == user_id, хотя по чисто формальным признакам это необязательно и id чата может отличаться от id пользователя. Но для групп это, разумеется, не может быть так, у групп id отличается от id пользователя всегда.
    Ответ написан
  • Как сделать рассылку в телеграмм незнакомым пользователям?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    С помощью клиентского API технически возможно. Но лучше не надо. Телеграм за такое очень быстро заблокирует.

    Надо просто приучить себя к мысли, что Телеграм - это не канал рассылки и никогда им не будет. Телеграм - это мессенджер. Он предполагает, что пользователь сам должен проявить инициативу для начала какого-то взаимодействия, а не ему это взаимодействие подсунули без спросу (проще говоря, спам). Если нужно получить контакт с пользователем, то это надо делать иначе. Публиковать контакты на сайте, в своих публичных каналах в Телеграме (пользователь может найти их по своей инициативе). Сообщать через другие ранее верифицированные каналы (например, по адресу электронной почты или в смс-сообщении), для которых пользователь уже дал согласие на получение информации.
    Ответ написан
    Комментировать
  • Как исправить Message to delete not found?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Тут делается reply, а затем через 30 секунд удаление этого сообщения. Если нажать кнопку удаления, то сообщение будет удалено, но удаление через 30 секунд всё равно будет вызвано и приведёт к ошибке, ведь сообщения и правда уже нет.
    Ответ написан
  • Можно ли общаться с телеграм ботом в канале, но так чтобы этого не было видно остальным?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя, никак. Канал по определению нужен для того, что его содержание видели все подписчики (и вообще все пользователи, если это публичный канал). Вот специально для таких задач в Телеграме появилась возможность ботам писать подписчикам канала даже без /start.
    Ответ написан
    Комментировать
  • Как создать многопользовательского бота в Telegram на Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка в том, что бот сохраняет в одних и тех же переменных данные разных пользователей.

    Решение этой задачи называется FSM (Finite State Machine - конечный автомат) и в указанной библиотеке есть простая реализация FSM на основе метода register_next_step_handler. Пример.
    Ответ написан
    2 комментария