Как отправлять видео в бот с серверов телеграма?
Хочу через 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 шт):
Оказывается FileId - это не что-то в виде ссылки. FileId выглядит так:
"BAACAgIAAxkBAAIBEGMOZzOq544k7MthGRqDSqrWk1stAALiHQACGa0oSXt2bCR6FxVbKQQ"
Узнать FileId можно, если залогировать message?.Video?.FileId и отправить боту сообщение с видео.
Осталось только узнать, как не вручную узнать FileId у кучи видео сразу, но это уже другой вопрос.
Способ работы с публичными каналами/группами:
Сперва, я опишу способ получения ссылки на видео вручную, с ней все должно работать, в дальнейшем мы ее извлечем программно
- идем в тот канал где опубликовано видео
- находим видео
- кликаем на сообщение и копируем
ссылку на сообщение/message link - вставляем адресную строку браузера
- открываем девтулзы F12
- переходим на вкладку
Сеть/Network - запускаем видео
- изучаем
GETзапрос - теперь у нас реальная ссылка на видео
Ссылку можно было найти в исходниках на странице, но в данном случае это не так важно, это просто для понимания того, что ссылка на видео - это не ссылка на пост.
Выглядит она так:
https://cdn4.telegram-cdn.org/file/bb5dc6638a.mp4?token=eCanQCY5VRcEZvjQoL7jLmgOPjeeAVrKKqPF7KRFGGUKA6Adae38VASsOLQbGLAl92yNmcMRK0Nhtp8NwvfDCFH6ukakBgOAEYj8OR_coxn92CeYxbapQfKRR2h3aywkZVAdlfNEreoWzeUF6hC4swjDhtSWqWoM1VQszQo_xZxrZfJlZcRMtLMdMGMz9LbdW9VrCVf4L-qYZKQbbsOB3V4qQlofzX6gTevibh-janrF9aIyXQ_2s0JIixACn2x2oPnCrY2wwB6kVMZA6ks69qhzH8Fqe2JaZuY0QpKwRZvZrJvQbzzxLAc4oHEl7oIbpgkd-oQi7ELqVBnbEGUMcg
Теперь о самом интересном:
- нам нужно скачать веб страницу поста:
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);
- извлечь информацию
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;
- можно вставлять в комманду бота (изучив дополнительно документацию)
Мои предположения:
- Не хватит прав для скачивания страницы (CORS)
- Телеграм все равно скачает видео,
В этом случае делиться нужно не видео, а сообщением messages.forwardMessages (по документации)
Для начала вам нужно получить расширенную информацию о видео
var file = await botClient.GetFileAsync(update.Message.Video.FileId);
После чего вы сможете его отправить, указав его id
await botClient.SendVideoAsync(
chatId: message.Chat.Id,
video: file.FileId);