簡體   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