How to use sendAudio in Telegram bot (Python)
<p>I have a Telegram bot, it replies with text and images, but I have a problem with sending an MP3 file in the reply. Can anyone please help?</p>

<p>This part of code defines the reply:</p>

<pre><code>        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
</code></pre>

<p>And this one defines the type of message it should return:</p>

<pre><code>       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')
</code></pre>

<p>For "One" and "Two" in text ot works perfectly (returns text for "One" and image for "Two"), but for "Three" it doesn't return an mp3 file.</p>

<p>What could be the problem? Thanks a lot in advance!</p>

<p>I think the issue is with <code>output = StringIO.StringIO()</code></p>

<p>you should use 
<code>io.BytesIO()</code></p>

<p>Here is a working code I am using: </p>

<pre><code>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)
</code></pre>

python json mp3 telegram telegram-bot