Ответы пользователя по тегу Telegram
  • Можно ли послать callback_data без кнопки в боте телеграм на aiogram?

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

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя. Боты не могут создавать группы.

    Новую группу может создать только полноценный пользователь Telegram, так что это возможно реализовать только с помощью клиентского (MTProto) API.
    Ответ написан
    Комментировать
  • Через что сделать телеграм бота?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если надо, чтобы заказы на сайте приходили владельцу сайта в телеграм, то это довольно просто сделать. Надо просто создать бота, самому написать там /start (чтобы бот мог слать этому пользователю), получить свой id любым образом (например, через сторонних ботов) и сделать по факту заказа вызов запроса:

    https://api.telegram.org/botТУТМОЙТОКЕН/sendMessage?chat_id=мой_id&text=Текст+сообщения
    Ответ написан
    Комментировать
  • Как получить имя 2 юзера через ответ на сообщение?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Поле reply_to_message у класса Message содержит информацию о сообщении, на которое отвечают. Ну или None, если это обычное сообщение.
    Ответ написан
    2 комментария
  • Отредактировать текст поста в своем телеграм канале?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вообще говоря, правильно отслеживать ботом публикации и запоминать id, например, в базу. Но так-то можно найти в клиенте пост, и сделать копирование ссылки на пост в меню, она будет иметь вид:

    https://t.me/my_awesome_channel/message_id

    Bot API не позволяет прочитать историю, боты видят только новые публикации. Если ручной способ не подходит (например, постов слишком много для ручной работы), придётся пилить бота на клиентском MTProto API (telethon, pyrogram).
    Ответ написан
    Комментировать
  • ERROR - TeleBot: "A request to the Telegram API was unsuccessful. Error code: 404. Description: N что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Токен неверный. Библиотека делает запросы вида https://api.telegram.org/botTOKEN/xxxx и получает 404.
    Ответ написан
    Комментировать
  • На что жалуется телеграм бот aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    BOT_TOKEN="твой_токен"

    Всё остальное лишнее.
    Ответ написан
    Комментировать
  • Как сделать добавление товара в корзину с плавающим товаром?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    После этого:

    next_item = int(call.data.split('_')[-1])

    значение next_item будет равен номеру товара. Ещё можно такое сделать:

    operation = call.data.split('_')[0]

    Тогда смотрим, что operation == 'add' и добавляем товар с номером next_item (хотя, конечно, слово "next" в названии переменной сбивает с толку, я бы переименовал).
    Ответ написан
    Комментировать
  • Как сделать что бы inline кнопка отправляла сообщение в боте, Как обычная кнопка?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вызвать в цикле bot.send_message на все извлечённые из базы chat_id. Учесть при этом, что у Телеграма ограничение в 30 запросов в секунду. Учесть, что некоторые пользователи уже могли отписаться от бота (отправка им вызовет исключение).
    Ответ написан
    4 комментария
  • Как писать бота через Webhook?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Читать в официальной документации.

    Кратко: либо бот делает запросы getUpdates для получения новых данных, либо бот представляет из себя web-сервер с адресом, за который Телеграм может его дёрнуть при наступлении нового события. Первое намного проще в организации и для небольших ботов с не очень значительным трафиком более чем достаточно.
    Ответ написан
    Комментировать
  • Какой диапазон id у открытых групп (не канал) в Telegram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никакой. Любую группу можно из открытой перевести в закрытую и обратно.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вот и надо редактировать предыдущее сообщение. Например:

    bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text='Новый текст')
    bot.edit_message_media(chat_id=call.message.chat.id, message_id=call.message.id, media=types.InputMediaPhoto(open('file.jpg','r').read(), caption='Новая картинка'))
    Ответ написан
    Комментировать
  • Как узнать данные сообщений в Telebot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, бот должен при необходимости сам запоминать все данные, которые отправлял/принимал, в API для этого никаких методов не предусмотрено.
    Ответ написан
    Комментировать
  • Как оформить кнопку "Следующий товар"/"Предыдущий товар"?

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

    Например, как-то так (items - словарь товаров с артикулами в качестве ключей):

    #
        numbers = items.keys()
        index_current = numbers.index(number_current)
        if index_current > 0:
            number_prev = numbers[index_current-1]
        else:
            number_prev = numbers[-1]
        if index_current < len(numbers)-1:
            number_next = numbers[index_current+1]
        else:
            number_next = numbers[0]
    
        next =InlineKeyboardButton(text= 'Следующий',callback_data= f'item:{number_next}')
        previous =InlineKeyboardButton(text= 'Предыдущий',callback_data= f'item:{number_prev}')
        add = InlineKeyboardButton(text= 'Добавить в корзину',callback_data= f'add:{number_current}')
    
    ...
    
        if call.data.startswith('item:'):
           number_current = call.data[5:]
           show_this_item_to_user
        if call.data.startswith('add:'):
           number_current = call.data[4:]
           add_this_item_to_basket
    Ответ написан
    6 комментариев
  • Как менять сообщение в телеграмм боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    При отправке сообщения возвращается объект Message, в котором есть требуемый id.

    Например, в telebot:

    msg = bot.send_message(my_chat_id, message_text)
    msg_id = msg.message_id
    bot.edit_message_text(chat_id=my_chat_id, message_id=msg_id, text="(edited) "+message_text)
    Ответ написан
    Комментировать
  • Как зациклить функцию отправки сообщения ботом на aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Так нельзя, это же asyncio, тут любой синхронный код блокирует event loop и всё ломает. Для начала, надо вместо time.sleep использовать asyncio.sleep.

    Потом, таск бота запускается при вызове start_polling уже после цикла. При этом event loop к тому моменту закончился, так как asyncio.run отработал.

    Надо сделать как-то так:

    async def main():
      polling_task = asyncio.create_task(dp.start_polling())
      while True:
        await asyncio.sleep(60)
        await bot.send_message(owner, "Hello!")
    
    loop = asyncio.get_event_loop()
    if __name__ == '__main__':
      loop.run_until_complete(main())
      loop.close()
    Ответ написан
    Комментировать
  • Как через url отправить сообщение боту в телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, в upd всё верно написано, надо сначала получить chat_id. Это можно сделать, отправив боту любое сообщение, а потом с помощью вызова .../getUpdates его получить. В сообщении будет искомый chat_id. Далее можно на этот chat_id посылать сообщения. Если это всё для того, чтобы просто посылать в телеграм себе оповещения, то держать постоянно запущенного бота и не нужно, достаточно дёргать sendMessage по необходимости.
    Ответ написан
    Комментировать
  • AIOgram, как лучше обновить код рассылки, чтобы она не останавливалась из-за Flood control?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо использовать time.sleep в асинхронном коде, это блокирует event loop! Вместо этого надо использовать асинхронный вариант asyncio.sleep.

    По существу с таким кодом будет делаться 10 отправок в секунду, а официально лимит 30 в секунду. Но лучше бы дополнительно отлавливать исключение с flood control и по нему делать дополнительный sleep хотя бы на 1 секунду, а то и чуть больше, чтобы счётчик числа попыток на стороне Telegram обнулился за это время.
    Ответ написан
    Комментировать