Как отправить стикер в Telegram с помощью Telethon, используя file_id?

Я пытаюсь отправить видеосообщение через юзербот с использованием библиотеки Telethon, применяя file_id, access_hash и file_reference, полученные от обычного бота (созданного через BotFather). Однако в результате отправляется обычное видео вместо видеосообщения. Вот пример кода, который я использую: 
<br/> 
<pre><code class="python">await client.send_file(
    entity=chat_name,
    file=InputDocument(id=file_id, access_hash=access_hash, file_reference=file_reference),
    video_note=True
)</code></pre> 
<br/> Все параметры видео соответствуют требованиям для видеосообщения. Я также пробовал отправить видеосообщение, указывая путь к локальному файлу, и в этом случае оно отправлялось корректно. Однако мне необходимо использовать file_id для экономии трафика. После того как обычный бот пересылает видео юзерботу, оно остается в формате 400x400, и все предоставленные file_id, access_hash и file_reference проверены и верны, так как иначе отправка вызвала бы ошибку.
  • 23 марта 2025 г. 11:25
Ответы на вопрос 2
Отправка видеосообщения (video note) в Telegram с использованием `file_id`, `access_hash` и `file_reference` должна выполняться с учётом специфики формата видеосообщений. Дело в том, что просто передав документы с помощью `InputDocument`, вы не сможете гарантировать, что Telegram обработает их как видеосообщения.

Вот несколько шагов и советов, которые могут помочь в вашей ситуации:

1. **Проверьте форматы**: Убедитесь, что ваши видео соответствуют формату для видеосообщений, который должен быть квадратным (например, 640x640 или 320x320) и иметь кодек VP8.

2. **Использование `send_document`**: Иногда вместо `send_file` и создания `InputDocument` может быть целесообразно использовать `send_document`. Это позволит Telegram само обрабатывать и классифицировать файл как видеозапись.

3. **Параметр video_note**: Параметр `video_note` должен быть верно установлен в `True`, как вы уже это сделали.

Вот пример кода, где вместо `InputDocument` используется `file_id`, который может сработать для вашего случая:

```python
async def send_video_note(chat_name, file_id):
    await client.send_document(
        entity=chat_name,
        document=file_id,
        attributes=[DocumentAttributeVideo(duration=60, w=640, h=640, supports_streaming=True)],
        buttons=None,
        force_document=False,
        allow_cache=True,
        video_note=True
    )
```

4. **Проверьте свойства видео**: Обязательно проверьте, что свойства видео (duration, width, height и т.д.) установлены правильно. Например, размер должен быть квадратным.

5. **Используйте транзакцию**: Если ничего не помогает, попробуйте сначала загрузить видео на сервер Telegram с помощью другой функции, чтобы получить новый `file_id` и затем отправьте его как видеосообщение.

6. **Отладка**: Используйте простую функцию для отладки, которая отправляет видео (или другое сообщение), убедитесь, что коды ошибок не генерализированы и вручную проверьте значения `file_id` и других параметров.

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