Как отправлять видео в бот с серверов телеграма?

Хочу через file id отправлять юзеру видео, уже загруженное в телеграм, чтобы оно не грузилось каждый раз заново. Нашёл похожий вопрос, но что-то не особо получается повторить. Пишу вот такой код:

if (message.Text.ToLower() == "видео")
{
  await botClient.SendVideoAsync(
  chatId: message.Chat.Id,
  video: message.Video.FileId = "https://t.me/c/1652849086/242");
}

То есть я передаю ссылку на сообщение с видео, чтобы FileId достал id этого видео. Это вообще так должно работать?


Ответы (3 шт):

Автор решения: joeybreat

Оказывается FileId - это не что-то в виде ссылки. FileId выглядит так:

"BAACAgIAAxkBAAIBEGMOZzOq544k7MthGRqDSqrWk1stAALiHQACGa0oSXt2bCR6FxVbKQQ"

Узнать FileId можно, если залогировать message?.Video?.FileId и отправить боту сообщение с видео.


Осталось только узнать, как не вручную узнать FileId у кучи видео сразу, но это уже другой вопрос.

→ Ссылка
Автор решения: Daniil Loban

Способ работы с публичными каналами/группами:

Сперва, я опишу способ получения ссылки на видео вручную, с ней все должно работать, в дальнейшем мы ее извлечем программно

  1. идем в тот канал где опубликовано видео
  2. находим видео
  3. кликаем на сообщение и копируем ссылку на сообщение/message link
  4. вставляем адресную строку браузера
  5. открываем девтулзы F12
  6. переходим на вкладку Сеть/Network
  7. запускаем видео
  8. изучаем GET запрос
  9. теперь у нас реальная ссылка на видео

Ссылку можно было найти в исходниках на странице, но в данном случае это не так важно, это просто для понимания того, что ссылка на видео - это не ссылка на пост.

Выглядит она так:

https://cdn4.telegram-cdn.org/file/bb5dc6638a.mp4?token=eCanQCY5VRcEZvjQoL7jLmgOPjeeAVrKKqPF7KRFGGUKA6Adae38VASsOLQbGLAl92yNmcMRK0Nhtp8NwvfDCFH6ukakBgOAEYj8OR_coxn92CeYxbapQfKRR2h3aywkZVAdlfNEreoWzeUF6hC4swjDhtSWqWoM1VQszQo_xZxrZfJlZcRMtLMdMGMz9LbdW9VrCVf4L-qYZKQbbsOB3V4qQlofzX6gTevibh-janrF9aIyXQ_2s0JIixACn2x2oPnCrY2wwB6kVMZA6ks69qhzH8Fqe2JaZuY0QpKwRZvZrJvQbzzxLAc4oHEl7oIbpgkd-oQi7ELqVBnbEGUMcg

Теперь о самом интересном:

  1. нам нужно скачать веб страницу поста: url_группы/id_поста

В C# это выглядит примерно так:

var url = "url_группы/id_поста";
WebRequest request = HttpWebRequest.Create(url);  
WebResponse response = request.GetResponse();  
StreamReader reader = new StreamReader(response.GetResponseStream());  
string responseText = reader.ReadToEnd();  
Response.Write(responseText);  
  1. извлечь информацию src из тега video

  <video src="https://cdn4.telegram-cdn.org/file/bb5dc6638a.mp4?token=eCanQCY5VRcEZvjQoL7jLmgOPjeeAVrKKqPF7KRFGGUKA6Adae38VASsOLQbGLAl92yNmcMRK0Nhtp8NwvfDCFH6ukakBgOAEYj8OR_coxn92CeYxbapQfKRR2h3aywkZVAdlfNEreoWzeUF6hC4swjDhtSWqWoM1VQszQo_xZxrZfJlZcRMtLMdMGMz9LbdW9VrCVf4L-qYZKQbbsOB3V4qQlofzX6gTevibh-janrF9aIyXQ_2s0JIixACn2x2oPnCrY2wwB6kVMZA6ks69qhzH8Fqe2JaZuY0QpKwRZvZrJvQbzzxLAc4oHEl7oIbpgkd-oQi7ELqVBnbEGUMcg" class="tgme_widget_message_video js-message_video" width="100%" height="100%"></video>

Код примерно такой:

string url = Regex.Match(responseText, "<video[^>]+src=\"([^\"]+)",
    RegexOptions.IgnoreCase).Groups[1].Value;
  1. можно вставлять в комманду бота (изучив дополнительно документацию)

Мои предположения:

  1. Не хватит прав для скачивания страницы (CORS)
  2. Телеграм все равно скачает видео,

В этом случае делиться нужно не видео, а сообщением messages.forwardMessages (по документации)

→ Ссылка
Автор решения: Teslaaaaa1

Для начала вам нужно получить расширенную информацию о видео

var file = await botClient.GetFileAsync(update.Message.Video.FileId);

После чего вы сможете его отправить, указав его id

await botClient.SendVideoAsync(
chatId: message.Chat.Id,
video: file.FileId);
→ Ссылка