如何在 Telegram 机器人中使用 sendAudio (Python)
How to use sendAudio in Telegram bot (Python)
我有一个 Telegram 机器人,它用文本和图像回复,但我在回复中发送 MP3 文件时遇到问题。有人可以帮忙吗?
这部分代码定义了回复:
def reply(msg=None, img=None, aud=None):
if msg:
resp = urllib2.urlopen(BASE_URL + 'sendMessage', urllib.urlencode({
'chat_id': str(chat_id),
'text': msg.encode('utf-8'),
'disable_web_page_preview': 'false',
# 'reply_to_message_id': str(message_id),
'reply_markup': json_keyboard,
})).read()
elif img:
resp = multipart.post_multipart(BASE_URL + 'sendPhoto', [
('chat_id', str(chat_id)),
('reply_to_message_id', str(message_id)),
], [
('photo', 'image.jpg', img),
])
elif aud:
resp = multipart.post_multipart(BASE_URL + 'sendAudio', [
('chat_id', str(chat_id)),
('reply_to_message_id', str(message_id)),
], [
('audio', 'aud.mp3', aud),
])
else:
logging.error('no msg or img specified')
resp = None
而这个定义了它应该return:
的消息类型
elif 'Two' in text:
img = Image.open('statimg/firstf.jpg')
output = StringIO.StringIO()
img.save(output, 'JPEG')
reply(img=output.getvalue())
elif 'Three' in text:
aud = open('statimg/firsta.mp3')
output = StringIO.StringIO()
aud.save(output, 'MP3')
reply(aud=output.getvalue())
elif 'One' in text:
# json_keyboard = json.dumps({keym: [bline3]})
bline1 = [b1]
bline2 = [b2]
json_keyboard = json.dumps({keym: [bline1, bline2]})
if func6.state == 0:
reply('Hello text1')
func6()
elif func6.state == 1:
func6()
reply('Hello text2')
For "One" and "Two" in text ot works perfectly (returns text for "One" and image for "Two"), but for "Three" 它不是 return mp3 文件。
可能是什么问题?非常感谢!
我认为问题出在 output = StringIO.StringIO()
你应该使用
io.BytesIO()
这是我正在使用的工作代码:
def sendTelegramAudio(self, file_url, text):
url = "https://api.telegram.org/botxxx:yyyy/sendAudio";
remote_file = requests.get(file_url)
file1 = io.BytesIO(remote_file.content)
file1.name = 'audio.mp3'
files = {'audio': file1}
data = {'chat_id' : "@your_channel", 'caption':text}
r= requests.post(url, files=files, data=data)
print(r.status_code, r.reason, r.content)
这样简单地解决了问题:
elif aud:
resp = multipart.post_multipart(BASE_URL + 'sendAudio', [
('chat_id', str(chat_id)),
#('caption', 'Music in the park'),
('reply_markup', json_keyboard),
], [
('audio', 'Play', aud),
])
reply(aud=urllib.urlopen('statimg/musone.mp3').read())
我有一个 Telegram 机器人,它用文本和图像回复,但我在回复中发送 MP3 文件时遇到问题。有人可以帮忙吗?
这部分代码定义了回复:
def reply(msg=None, img=None, aud=None):
if msg:
resp = urllib2.urlopen(BASE_URL + 'sendMessage', urllib.urlencode({
'chat_id': str(chat_id),
'text': msg.encode('utf-8'),
'disable_web_page_preview': 'false',
# 'reply_to_message_id': str(message_id),
'reply_markup': json_keyboard,
})).read()
elif img:
resp = multipart.post_multipart(BASE_URL + 'sendPhoto', [
('chat_id', str(chat_id)),
('reply_to_message_id', str(message_id)),
], [
('photo', 'image.jpg', img),
])
elif aud:
resp = multipart.post_multipart(BASE_URL + 'sendAudio', [
('chat_id', str(chat_id)),
('reply_to_message_id', str(message_id)),
], [
('audio', 'aud.mp3', aud),
])
else:
logging.error('no msg or img specified')
resp = None
而这个定义了它应该return:
的消息类型 elif 'Two' in text:
img = Image.open('statimg/firstf.jpg')
output = StringIO.StringIO()
img.save(output, 'JPEG')
reply(img=output.getvalue())
elif 'Three' in text:
aud = open('statimg/firsta.mp3')
output = StringIO.StringIO()
aud.save(output, 'MP3')
reply(aud=output.getvalue())
elif 'One' in text:
# json_keyboard = json.dumps({keym: [bline3]})
bline1 = [b1]
bline2 = [b2]
json_keyboard = json.dumps({keym: [bline1, bline2]})
if func6.state == 0:
reply('Hello text1')
func6()
elif func6.state == 1:
func6()
reply('Hello text2')
For "One" and "Two" in text ot works perfectly (returns text for "One" and image for "Two"), but for "Three" 它不是 return mp3 文件。
可能是什么问题?非常感谢!
我认为问题出在 output = StringIO.StringIO()
你应该使用
io.BytesIO()
这是我正在使用的工作代码:
def sendTelegramAudio(self, file_url, text):
url = "https://api.telegram.org/botxxx:yyyy/sendAudio";
remote_file = requests.get(file_url)
file1 = io.BytesIO(remote_file.content)
file1.name = 'audio.mp3'
files = {'audio': file1}
data = {'chat_id' : "@your_channel", 'caption':text}
r= requests.post(url, files=files, data=data)
print(r.status_code, r.reason, r.content)
这样简单地解决了问题:
elif aud:
resp = multipart.post_multipart(BASE_URL + 'sendAudio', [
('chat_id', str(chat_id)),
#('caption', 'Music in the park'),
('reply_markup', json_keyboard),
], [
('audio', 'Play', aud),
])
reply(aud=urllib.urlopen('statimg/musone.mp3').read())