繁体   English   中英

如何在 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)中将其设置为管理员。 现在我想请求使用电报 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, description:"Bad Request: URL must be in UTF-8"(使用 28kb 的 mp3 进行测试后)

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

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

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

我更改了发送字节数组 (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();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM