Сообщить об ошибке.

Ведение публикаций в Telegram-канале с python-telegram-bot

Отправка/редактирование/удаление сообщений в Telegram-канале

Если при помощи python-telegram-bot планируется только вести Telegram-канал (например, публиковать анонсы новых статей сайта или их обновления), то ставить полностью библиотеку со всеми зависимостями не обязательно. Достаточно установить чистый интерфейс Python для Telegram Bot API python-telegram-bot-raw.

Так как TelegramBot нужен для ведения Telegram-канала, следовательно он не будет принимать каких либо сообщений, а будет только отправлять, удалять или редактировать уже отправленные сообщения в Telegram-канал. Для таких задач высокоуровневый интерфейс расширения telegram.ext не нужен. Расширение telegram.ext в основном используется для удобной обработки входящих сообщений, создания вебхука или регулярных обновлений бота и т.д.

Для начала необходимо создать Telegram-канал:

  • Для создания канала со смартфона необходимо нажать на значок с карандашом. Он отображается в окне со списком переписок и каналов. После этого нажмите на кнопку Создать канал.
  • В десктопной версии Telegram необходимо зайти в меню, а затем нажать на кнопку Создать канал.

После этого Telegram предложит написать имя канала, заполнить описание и поставить аватарку. Заполнять описание и выбирать картинку на этом этапе не обязательно, а вот без названия дальше работать с каналом не получится. Обратите внимание, что имя канала, описание и аватарку можно изменить в любой момент.

Затем выбираем тип канала: публичный или частный:

  • Публичный канал можно найти через поиск, а подписаться на него может любой пользователь Telegram.
  • Частный канал доступен только по ссылке-приглашению, то есть его нельзя найти через поиск.

Выбираем публичный, придумываем и вводим ссылку, по которой можно будет попасть на канал. Эта ссылка, также служит в качестве chat_id, на нее отправляются новые сообщения.

Далее создаем бота для отправки сообщений в созданный канал, для этого общаемся с @BotFather.

Осталось только добавить этого бота в качестве администратора канала (для Desktop клиента):

  • Открываем канал, жмем три точки и выбираем "Информация канале";
  • В открывшемся окне опять три точки и выбираем "Управление каналом";
  • Здесь выбираем "Администраторы". В списке ботов не будет.
  • В поиске вводим имя созданного бота и жмем "Добавить администратора";

Примечание:

  • Добавить бота может только создатель канала.
  • Другие администраторы не могут добавлять ботов в каналы.
  • Канал может быть публичным или частным (не имеет значения)

Содержание:


Отправляем сообщение в Telegram-канал.

Например, есть сайт. При публикации очередной статьи/материала можно выполнять представленный ниже код, для отправки сообщения в Telegram-канал. Полученный в результате отправки номер сообщения можно хранить в БД сайта, для случаев редактирования или удаления статьи/материала сайта (отправки сообщения в канал об обновлении статьи или ее удаления).

# код для python-telegram-bot-raw версии 13.x
import telegram

TOKEN = '...'
bot = telegram.Bot(token=TOKEN)
# ссылка_канала - это придуманная вами ссылка
# Telegram-канала (t.me/ссылка_канала)
chanell = '@ссылка_канала' 

text="Первое сообщение!"
send = bot.send_message(chat_id=chanell, text=text)
print(f'Номер отправленного сообщения: {send.message_id}')

После отправки сообщения, объект send будет содержать номер сообщения send.message_id в контексте этого канала. Этот номер можно использовать для редактирования или удаления отправленного сообщения.

Дополнительно смотрите аргументы, которые принимает метод bot.send_message().

Редактируем сообщение в Telegram-канале.

Для того, чтобы отредактировать отправленное сообщение в Telegram-канале, необходим его порядковый номер message_id в контексте этого канала, полученный при его отправке.

# код для python-telegram-bot-raw версии 13.x
import telegram

TOKEN = '...'
bot = telegram.Bot(token=TOKEN)
# ссылка_канала - это придуманная вами ссылка
# Telegram-канала (t.me/ссылка_канала)
chanell = '@ссылка_канала' 

# порядковый номер, полученный при отправке сообщения
message_id = 2
new_text="Измененное сообщение."
try:
    # возвращает то-же самое, что и `bot.send_message()`
    edit = bot.edit_message_text(chat_id=chanell, message_id=message_id, text=new_text)
except telegram.error.BadRequest:
    edit = None

if edit:
    print(f'Сообщение {message_id} отредактировано.')
else:
    print(f'Сообщение {message_id} не найдено.')

Метод bot.edit_мessage_text() используется для редактирования текстовых и игровых сообщений. В случае успеха, если отредактированное сообщение не является встроенным сообщением, возвращается отредактированное сообщение, в противном случае возвращается True.

Удаляем сообщение в Telegram-канале.

Для того, чтобы удалить сообщение в Telegram-канале, необходим его порядковый номер message_id в контексте этого канала, полученный при его отправке.

Внимание! Сообщение может быть удалено ботом только в том случае, если оно было отправлено менее 48 часов назад. После 48 часов сообщение может удалить только реальный пользователь (администратор канала), вручную.

# код для python-telegram-bot-raw версии 13.x
import telegram

TOKEN = '...'
bot = telegram.Bot(token=TOKEN)
# ссылка_канала - это придуманная вами ссылка
# Telegram-канала (t.me/ссылка_канала)
chanell = '@ссылка_канала' 

# порядковый номер, полученный при отправке сообщения
message_id = 2
try:
    delete = bot.delete_message(chat_id=chanell, message_id=message_id)
except telegram.error.BadRequest:
    delete = None

if delete:
    print(f'Сообщение {message_id} удалено.')
else:
    print(f'Сообщение {message_id} не найдено.')

Метод bot.delete_message() используется для удаления сообщения, в том числе служебного, со следующими ограничениями:

  • Служебные сообщения о создании супергруппы, канала или темы форума не могут быть удалены.
  • Сообщение с кубиками в приватном чате можно удалить только в том случае, если оно было отправлено более 24 часов назад.
  • Боты могут удалять исходящие сообщения в приватных чатах, группах и супергруппах.
  • Боты могут удалять входящие сообщения в приватных чатах.
  • Боты с разрешениями can_post_messages могут удалять исходящие сообщения в каналах.
  • Если бот является администратором группы, он может удалить там любое сообщение.
  • Если у бота есть разрешение can_delete_messages в супергруппе или канале, он может удалить там любое сообщение.

Возвращает True в случае успеха.

Закрепляем/открепляем сообщение в Telegram-канале.

Для того, чтобы закрепить/открепить сообщение в Telegram-канале, необходим его порядковый номер message_id в контексте этого канала, полученный при его отправке.

  • Метод bot.pin_chat_message(chat_id, message_id) - закрепляет сообщение для пользователей канала;
  • Метод bot.unpin_chat_message(chat_id, message_id) - открепляет сообщение для пользователей канала.

Используйте эти методы, чтобы добавить сообщение в список закрепленных сообщений в чате или открепить его. Если чат не является приватным, бот должен быть администратором в чате и должен иметь права администратора 'canpinmessages'.

Пример закрепления сообщения в канале Telegram:

# код для python-telegram-bot-raw версии 13.x
import telegram

TOKEN = '...'
bot = telegram.Bot(token=TOKEN)
# ссылка_канала - это придуманная вами ссылка
# Telegram-канала (t.me/ссылка_канала)
chanell = '@ссылка_канала' 

# порядковый номер, полученный при отправке сообщения
message_id = 2
try:
    pin = bot.pin_chat_message(chat_id=chanell, message_id=message_id)
except telegram.error.BadRequest:
    pin = None

if pin:
    print(f'Сообщение {message_id} закреплено.')
else:
    print(f'Сообщение {message_id} не найдено.')

Изменение название и описание канала.

Используйте метод bot.set_chat_title(), чтобы изменить название чата/канала. Названия не могут быть изменены для приватных чатов/групп. Чтобы это работало, бот должен быть администратором в чате и иметь соответствующие права администратора. Возвращает True в случае успеха.

Используйте метод bot.set_chat_description(), чтобы изменить описание группы, супергруппы или канала. Чтобы это работало, бот должен быть администратором в чате и иметь соответствующие права администратора. Возвращает True в случае успеха.

Пример изменения названия и описания канала Telegram:

# код для python-telegram-bot-raw версии 13.x
import telegram

TOKEN = '...'
bot = telegram.Bot(token=TOKEN)
# ссылка_канала - это придуманная вами ссылка
# Telegram-канала (t.me/ссылка_канала)
chanell = '@ссылка_канала' 

new_title = "Новое название канала Telegram"
if bot.set_chat_title(chat_id=chanell, title=new_title):
    print(f'Название канала {chanell} изменено.')
else:
    print(f'Что-то пошло не так.')

new_description = "Новое описание канала Telegram"
if bot.set_chat_description(chat_id=chanell, description=new_description):
    print(f'Описание канала {chanell} изменено.')
else:
    print(f'Что-то пошло не так.')