如何在 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;
}
- 如果有不用下载直接发送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();
}
}
}
我有两个错误:
"Request Entity Too Large" 当我的 mp3 大约 6mb 或 7mb 或...(不使用 http://bayanbox.ir/download/7028444634071302239/Sound-1.mp3)
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();
}
}
}
我在电报中创建了一个机器人 (@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;
}
- 如果有不用下载直接发送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(); } } }
我有两个错误:
"Request Entity Too Large" 当我的 mp3 大约 6mb 或 7mb 或...(不使用 http://bayanbox.ir/download/7028444634071302239/Sound-1.mp3)
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();
}
}
}