C# 如何使用电报机器人API';C语言中的sendAudio方法#

C# 如何使用电报机器人API';C语言中的sendAudio方法#,c#,httpclient,telegram,telegram-bot,C#,Httpclient,Telegram,Telegram Bot,我在电报中创建了一个bot(@mp3lyric\u bot\u test),并在我的频道中将其设置为管理员(@mp3lyric\u test)。现在我想发送一个mp3到频道使用 我的mp3在网络中,类似于: 首先,我用这种方法下载mp3: public static Task<byte[]> DownloadAsync(string requestUriSt) { var requestUri = new Uri(requestUriSt);

我在电报中创建了一个bot(@mp3lyric\u bot\u test),并在我的频道中将其设置为管理员(@mp3lyric\u test)。现在我想发送一个mp3到频道使用

我的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大约为6mb或7mb或。。。(不使用)

  • 错误代码:400,说明:“错误请求:URL必须为UTF-8格式”(使用该mp3进行28kb的测试后)


  • 要发送一个新的音频文件,您可以使用方法,但要使用字段

    首先创建一个
    InputFile
    对象,然后在
    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();
            }
        }
    }
    

    我不需要重新发送文件。因此,对于使用InputFile发送音频,我使用我所描述的多部分/表单数据。我的密码有什么问题?我该怎么办?@OmidRH您需要至少发送一次文件。您看过InputFile方法的文档了吗?是的,我看过了文档,需要上传新文件。请参阅sendAudio->audio parameter:“要发送的音频文件。您可以将文件id作为字符串传递,以重新发送已在电报服务器上的音频,也可以使用多部分/表单数据上传新的音频文件。”我想用多部分/表单数据上传一个新的音频文件
    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();
            }
        }
    }