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

问题描述 投票:1回答:2

我在电报中创建了一个机器人(@ mp3lyric_bot_test),并在我的频道(@ mp3lyric_test)中将其设置为管理员。现在我希望make a request使用telegram api将mp3发送到频道。

我的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;
    }
  • 如果有办法直接发送mp3而不下载,请告诉我怎么样?谢谢。

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

  • 我的机器人令牌是247655935:AAEhpYCeoXA5y7V8Z3WrVcNJ3AaChORjfvw using (var client = new HttpClient()) { var uri = new Uri("https://api.telegram.org/bot247655935:AAEhpYCeoXA5y7V8Z3WrVcNJ3AaChORjfvw/sendAudio"); using (var multipartFormDataContent = new MultipartFormDataContent( "SendAudio----" + DateTime.Now.ToString(CultureInfo.InvariantCulture))) { multipartFormDataContent.Add( new StringContent("@mp3lyric_test"), string.Format("\"{0}\"", "chat_id") ); multipartFormDataContent.Add( new StreamContent(new MemoryStream(fileBytes)), '"' + "audio" + '"' ); using (var message = await client.PostAsync(uri, multipartFormDataContent)) { var contentString = await message.Content.ReadAsStringAsync(); } } }

我有两个错误:

  1. 当我的mp3大约是6mb或7mb或者......(不使用http://bayanbox.ir/download/7028444634071302239/Sound-1.mp3)时“请求实体太大”
  2. error_code:400,描述:“错误的请求:URL必须是UTF-8”(使用该mp3进行28kb的测试后)
c# httpclient telegram telegram-bot
2个回答
1
投票

要发送新的AudioFile,您可以使用SendAudio方法,但使用InputFile字段。

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

如果你需要将同一个AudioFile重新发送给另一个用户,那么你可以使用String选项作为audio中的SendAudio参数


0
投票

我更改了我的代码以发送我的字节数组(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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.