2016-10-09 16 views
1

У меня есть бот Telegram, он отвечает текстом и изображениями, но у меня есть проблема с отправкой файла MP3 в ответ. Кто-нибудь может помочь?Как использовать sendAudio в телеграмме bot (Python)

Эта часть кода определяет ответ:

 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 

И это один определяет тип сообщения, он должен вернуть:

 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') 

для «One» и «двойки» в тексте ВЗ работ отлично (возвращает текст для «One» и изображение для «Two»), но для «Three» он не возвращает mp3-файл.

В чем может быть проблема? Заранее большое спасибо!

ответ

0

Просто решается вопрос таким образом:

 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()) 
0

Я думаю, что вопрос с 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) 
+0

Спасибо! Есть ли возможность использовать этот подход io.BytesIO без использования request.get()? Чтобы передать данные через multipart.post_multipart()? –

 Смежные вопросы

  • Нет связанных вопросов^_^