如何在 C# 中使用 Telegram Bot API 的 sendAudio 方法将远程 mp3 文件发送到 Telegram 频道

How to send remote mp3 file to Telegram channel using Telegram Bot API's sendAudio method in C#

我在电报中创建了一个机器人 (@mp3lyric_bot_test),并在我的频道 (@mp3lyric_test) 中将其设置为管理员。现在我想 make a request to send an mp3 to channel using telegram api.

我的 mp3 在网络上,是这样的:http://bayanbox.ir/download/7028444634071302239/Sound-1.mp3

起初我用这种方法下载mp3:

    public static Task<byte[]> DownloadAsync(string requestUriSt)
    {
        var requestUri = new Uri(requestUriSt);

        byte[] fileBytes;

        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
            {
                using (var responseMessage = await httpClient.SendAsync(request))
                {
                    fileBytes = await responseMessage.Content.ReadAsByteArrayAsync();
                    var audioString = Encoding.UTF8.GetString(fileBytes, 0, fileBytes.Length);
                }
            }
        }

        return fileBytes;
    }

然后使用此代码发送该字节数组 (fileBytes):

我有两个错误:

  1. "Request Entity Too Large" 当我的 mp3 大约 6mb 或 7mb 或...(不使用 http://bayanbox.ir/download/7028444634071302239/Sound-1.mp3

  2. error_code:400, description:"Bad Request: URL must be in UTF-8"(用那个28kb的mp3测试后)

要发送新的音频文件,您可以使用 SendAudio method but with the InputFile 字段。

首先创建一个 InputFile 对象,然后将这些字节传递到 SendAudio 方法的 audio 参数中

如果您需要重新发送相同的AudioFile给另一个用户,那么您可以使用String 选项作为 SendAudio

中的 audio 参数

我更改了发送字节数组 (fileBytes) 的代码,现在它可以工作了:

using (var client = new HttpClient())
{
    var uri = new Uri("https://api.telegram.org/bot247655935:AAEhpYCeoXA5y7V8Z3WrVcNJ3AaChORjfvw/sendAudio?chat_id=@mp3lyric_test");

    using (var multipartFormDataContent = new MultipartFormDataContent())
    {
        var streamContent = new StreamContent(new MemoryStream(fileBytes));
        streamContent.Headers.Add("Content-Type", "application/octet-stream");
        streamContent.Headers.Add("Content-Disposition", "form-data; name=\"audio\"; filename=\"Sound-1.mp3\"");
        multipartFormDataContent.Add(streamContent, "file", "Sound-1.mp3");

        using (var message = await client.PostAsync(uri, multipartFormDataContent))
        {
            var contentString = await message.Content.ReadAsStringAsync();
        }
    }
}