2016-02-10 2 views
2

Im, пишущий телеграмму с использованием python telepot api. Я сейчас застрял в точке, где хочу отправить картинку, которая напрямую поступает из URL-адреса, не сохраняя его локально. Telepot предоставляет следующую команду, чтобы отправить фото:Telegram-bot (telepot api): возможно ли отправить изображение прямо из URL-адреса без сохранения его.

>>> f = open('zzzzzzzz.jpg', 'rb') # some file on local disk 
>>> response = bot.sendPhoto(chat_id, f) 

Теперь им с помощью

f = urllib2.urlopen('http://i.imgur.com/B1fzGoh.jpg') 
bot.sendPhoto(chat_id, f) 

Проблема здесь в том, что urllib2.urlopen('url') предоставить мне файл-подобный объект, как:

<addinfourl at 140379102313792 whose fp = <socket._fileobject object at 0x7fac8e86d750>>

и не нравится open('myFile.jpg', 'rb') файловый объект, такой как:

<open file 'app-root/runtime/repo/myImage.jpg', mode 'rb' at 0x7fac8f322540>

Если я отправить файл-подобный объект в sendPhoto() Я получаю следующее сообщение об ошибке: Traceback (последний звонок последний):

[Wed Feb 10 06:21:09 2016] [error] File "/var/lib/openshift/56b8e2787628e1484a00013e/python/virtenv/lib/python2.7/site-packages/telepot/__init__.py", line 340, in handle 
[Wed Feb 10 06:21:09 2016] [error]  callback(update['message']) 
[Wed Feb 10 06:21:09 2016] [error] File "/var/lib/openshift/56b8e2787628e1484a00013e/app-root/runtime/repo/moviequiz_main.py", line 35, in handle 
[Wed Feb 10 06:21:09 2016] [error]  response = bot.sendPhoto(chat_id, gif) 
[Wed Feb 10 06:21:09 2016] [error] File "/var/lib/openshift/56b8e2787628e1484a00013e/python/virtenv/lib/python2.7/site-packages/telepot/__init__.py", line 230, in sendPhoto 
[Wed Feb 10 06:21:09 2016] [error]  return self._sendFile(photo, 'photo', p) 
[Wed Feb 10 06:21:09 2016] [error] File "/var/lib/openshift/56b8e2787628e1484a00013e/python/virtenv/lib/python2.7/site-packages/telepot/__init__.py", line 226, in _sendFile 
[Wed Feb 10 06:21:09 2016] [error]  return self._parse(r) 
[Wed Feb 10 06:21:09 2016] [error] File "/var/lib/openshift/56b8e2787628e1484a00013e/python/virtenv/lib/python2.7/site-packages/telepot/__init__.py", line 172, in _parse 
[Wed Feb 10 06:21:09 2016] [error]  raise BadHTTPResponse(response.status_code, response.text) 
[Wed Feb 10 06:21:09 2016] [error] BadHTTPResponse: (414, u'<html>\\r\\n<head><title>414 Request-URI Too Large</title></head>\\r\\n<body bgcolor="white">\\r\\n<center><h1>414 Request-URI Too Large</h1></center>\\r\\n<hr><center>nginx/1.9.1</center>\\r\\n</body>\\r\\n</html>\\r\\n') 

Существует решение для different telegram-bot project provided here где они отправляют urllib2.urlopen('url').read() обратно в телеграмму, но в моем случае это порождает ту же ошибку, что и без .read().

Как я могу получить файл с URL-адреса в качестве объекта файла (лучше всего было бы не сохранять его локально)? Или как мне получить «файл-объект» из «файла-подобного объекта», предоставленного urlopen()?

Спасибо за любую помощь :)

+0

Метод 'sendPhoto()' Telepot интерпретирует второй аргумент таким образом: если это файл, контент загружается с использованием multipart/form-data; в противном случае он предоставляется API-интерфейсу Bot в виде строки, указывающей на сервере 'file_id'. Ваша проблема возникает, потому что, очевидно, файловый объект - это * не * файл, поэтому * неправильно * рассматривается как последний случай. Ваше желание использовать 'sendPhoto()' без сохранения в локальном файле вполне разумно и законно. Если это достаточно важно для вас, перейдите на домашнюю страницу Gitub на telepot и откройте проблему. –

+0

Как автор телепотока, я думаю, что telepot * должен * правильно обрабатывать ваш случай. Я попытаюсь исправить вашу проблему в будущей версии. –

+0

Теперь я понимаю, что происходит! Я не знал, что он просто рассматривает его как 'file_id'. В этом случае HttpResponse имеет смысл для меня. Спасибо за вашу помощь и за потрясающий телепат! Вы все еще хотите, чтобы я открыл конкретную проблему в github telepot? – basilius

ответ

2

Да.

Вы можете сделать это ASync (или нет):

async with aiohttp.get("http://i.imgur.com/B1fzGoh.jpg") as r: 
    result = r.read() 
await self.sendPhoto(chat_id, ('image.jpg', result)) 
0

В текущем Bot Api 2.3.1, Вы можете просто отправить URL файла на сервер:

bot.sendPhoto(chat_id, "http://i.imgur.com/B1fzGoh.jpg"); 

Вот и все.

Вам даже его не нужно скачивать, Telegram загрузит его сам.

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