Как в bot.send_media_group интегрировать caption и parse_mode?

Рейтинг: 0Ответов: 1Опубликовано: 24.05.2023

Я делаю Телеграм бота, который публикует посты из Твиттера. У меня возникает проблема если в твите два и больше изображения, так как мой код использует bot.send_photo, который, насколько я понял, предназначен для отправки только одного, или первого изображения. Как я вычитал, для публикации больше одного изображения нужно использовать bot.send_media_group, но в библиотеке telebot (pyTelegramBotAPI), я прочел в документации, не предусмотрен caption и parse_mode. То есть если в твите есть текст он не будет публиковаться. Да и вообще если применять bot.send_media_group почему-то публикуется только одно (первое) изображение.

Вот блок кода:

            if 'media' in tweet.entities and tweet.entities['media']:
            # Загружаем изображение в память
            image_url = tweet.entities['media'][0]['media_url_https']
            response = requests.get(image_url)
            image = response.content

            # Отправляем сообщение вместе с изображением
            bot.send_photo(chat_id='@' + channel_name, photo=image, caption=message, parse_mode='HTML')
        else:
            # Отправляем только текст сообщения
            bot.send_message(chat_id='@' + channel_name, text=message, parse_mode='HTML',
                             disable_web_page_preview=True)

Может вообще я не прав, и нужно всё поменять. Буду благодарен за помощь!

Вот библиотеки, которые я использую во всем коде:

import tweepy
import telebot
import asyncio
from translate import Translator
from langdetect import detect
import requests

Добавляю функцию:

# Функция для отправки нового твита в Телеграм канал
async def send_new_tweet_to_telegram():
    global last_tweet

    # Получение последнего твита
    tweet = api.user_timeline(screen_name='NZ72737586', count=1, include_entities=True)[0]

    # Если это новый твит, отправляем его в Телеграм канал
    if tweet.id_str != last_tweet:
        text = get_tweet_text(tweet)
        lang = detect(text)
        if lang != 'ru':
            translator = Translator(from_lang=lang, to_lang="ru")
            translation = translator.translate(text)
        else:
            translation = text

        # Получение даты написания твита
        tweet_date = tweet.created_at.strftime("<code>%d.%m.%Y</code>")

        # Данные для HyperLink
        subscribe_link = "https://t.me/+7K4vNzXP2vIzOTIy"
        channels_link = "https://t.me/+jiuRboD5H501MTJi"
        contact_link = "https://t.me/prjctmngr"

        texthyperlink = f"<a href='{subscribe_link}'>Подписаться</a>" + " | " + \
                        f"<a href='{subscribe_link}'>Subscribe</a>\n" + \
                        f"<a href='{channels_link}'>Наши каналы</a>" + " | " + \
                        f"<a href='{channels_link}'>Our channels</a>\n" + \
                        f"<a href='{contact_link}'>Связаться с нами</a>" + " | " + \
                        f"<a href='{contact_link}'>Contact us</a>"

        # Формирование сообщения для отправки в Телеграм канал
        tweet_link = f"https://twitter.com/i/web/status/{tweet.id_str}"
        message = f"{tweet_date}\n\n{text}\n\n\n{translation}\n\n<code>via Twitter</code>\n{tweet_link}" \
                  f"\n\n\n{texthyperlink}"

        if hasattr(tweet, 'retweeted_status'):
            retweeted_status = tweet.retweeted_status
            if hasattr(retweeted_status, 'extended_tweet') and 'full_text' in retweeted_status.extended_tweet:
                text = '<code>RT @{}:</code> {}'.format(retweeted_status.user.screen_name,
                                                        retweeted_status.extended_tweet['full_text'])
            else:
                try:
                    original_tweet = api.get_status(retweeted_status.id, tweet_mode='extended')
                    if hasattr(original_tweet, 'extended_tweet') and 'full_text' in original_tweet.extended_tweet:
                        text = '<code>RT @{}:</code> {}'.format(retweeted_status.user.screen_name,
                                                                original_tweet.extended_tweet['full_text'])
                    else:
                        if 'media' in original_tweet.entities and original_tweet.entities['media']:
                            # Загружаем изображение в память
                            image_url = original_tweet.entities['media'][0]['media_url_https']
                            response = requests.get(image_url)
                            image = response.content

                            message = message.replace(original_tweet.entities['media'][0]['url'], '')

                            # Отправляем сообщение вместе с изображением
                            bot.send_photo(chat_id='@' + channel_name, photo=image, caption=message, parse_mode='HTML')
                        else:
                            # Отправляем только текст сообщения
                            bot.send_message(chat_id='@' + channel_name, text=message, parse_mode='HTML',
                                             disable_web_page_preview=True)
                except tweepy.TweepyException as e:
                    text = '<code>RT @{}:</code> {}'.format(retweeted_status.user.screen_name, retweeted_status.text)

        # Проверяем, содержит ли твит изображение если текст большой
        if tweet.truncated:
            tweet = api.get_status(tweet.id, tweet_mode='extended')
            if hasattr(tweet, 'extended_tweet') and 'full_text' in tweet.extended_tweet:
                text = tweet.extended_tweet['full_text']
            else:
                text = tweet.full_text
            text = '<code>TW:</code> ' + text

        # Проверяем наличие медиа в твите
        if hasattr(tweet, 'entities') and 'media' in tweet.entities:
            media = tweet.entities['media']

        # Проверяем, содержит ли твит изображение
        if hasattr(tweet, 'retweeted_status'):
            retweet = tweet.retweeted_status
            if 'media' in retweet.entities and retweet.entities['media']:
                # Загружаем изображение в память
                image_url = retweet.entities['media'][0]['media_url_https']
                response = requests.get(image_url)
                image = response.content

        else:
            if 'media' in tweet.entities and tweet.entities['media']:
                media = tweet.entities['media']
                medias = []
                for i, m in enumerate(media):
                    media_url = m['media_url_https']
                    response = requests.get(media_url)
                    image = response.content
                    if i == 0:
                        # Первое изображение будет иметь подпись (caption)
                        medias.append(telebot.types.InputMediaPhoto(image, caption=message, parse_mode='HTML'))
                    else:
                        medias.append(telebot.types.InputMediaPhoto(image))

                # Отправляем сообщение с группой изображений
                bot.send_media_group(chat_id='@' + channel_name, media=medias)
            else:
                bot.send_message(chat_id='@' + channel_name, text=message, parse_mode='HTML',
                                 disable_web_page_preview=True)

        last_tweet = tweet.id_str

Ответы

▲ 0

Вам нужно использовать bot.send_media_group, но с небольшой хитростью. Формировать список медиа примерно так

medias = [telebot.types.InputMediaPhoto('https://i.pinimg.com/originals/8a/de/fe/8adefe5af862b4f9cec286c6ee4722cb.jpg', caption='TEXT'), telebot.types.InputMediaPhoto('https://i.pinimg.com/originals/8a/de/fe/8adefe5af862b4f9cec286c6ee4722cb.jpg'), telebot.types.InputMediaPhoto('https://i.pinimg.com/originals/8a/de/fe/8adefe5af862b4f9cec286c6ee4722cb.jpg'), telebot.types.InputMediaPhoto('https://i.pinimg.com/originals/8a/de/fe/8adefe5af862b4f9cec286c6ee4722cb.jpg'), 

То есть caption только у первой картинки, в таком случае текст отобразится.

введите сюда описание изображения