I am building a Telegram bot using a Telepot library. To send a picture downloaded from Internet I have to use sendPhoto method, which accepts a file-like object.
Looking through the docs I found this advice:
If the file-like object is obtained by
urlopen()
, you most likely have to supply a filename because Telegram servers require to know the file extension.
So the question is, if I get my filelike object by opening it with requests.get
and wrapping with BytesIO
like so:
res = requests.get(some_url)
tbot.sendPhoto(
messenger_id,
io.BytesIO(res.content)
)
how and where do I supply a filename?
You would supply the filename as the object's .name
attribute.
Opening a file with open()
has a .name attribute.
>>> local_file = open("file.txt")
>>> local_file
<open file 'file.txt', mode 'r' at ADDRESS>
>>> local_file.name
'file.txt'
Where opening a url does not. Which is why the documentation specifically mentions this.
>>> import urllib
>>> url_file = urllib.open("http://example.com/index.html")
>>> url_file
<addinfourl at 44 whose fp = <open file 'nul', mode 'rb' at ADDRESS>>
>>> url_file.name
AttributeError: addinfourl instance has no attribute 'name'
In your case, you would need to create the file-like object, and give it a .name
attribute:
res = requests.get(some_url)
the_file = io.BytesIO(res.content)
the_file.name = 'file.image'
tbot.sendPhoto(
messenger_id,
the_file
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With