4

python telepot apiを使用して電報ボットを作成しています。ローカルに保存せずに、URL から直接取得した画像を送信したいところに行き詰まっています。Telepotは、写真を送信するために次の指示を提供します。

>>> 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 (most recent call last):

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

ここで提供される別のテレグラムボットプロジェクトの解決策があります。ここではurllib2.urlopen('url').read()、テレグラムに返信しますが、私の場合、これは .read() なしと同じエラーを生成します。

URLからファイルオブジェクトとしてファイルを取得するにはどうすればよいですか(ローカルに保存しないのが最善です)?または、urlopen() によって提供される「ファイルのようなオブジェクト」から「ファイル オブジェクト」を取得するにはどうすればよいですか?

助けてくれてありがとう:)

4

2 に答える 2

2

はい。

非同期にする(またはしない)ことができます:

async with aiohttp.get("http://i.imgur.com/B1fzGoh.jpg") as r:
    result = r.read()
await self.sendPhoto(chat_id, ('image.jpg', result))
于 2016-04-24T15:52:55.417 に答える