mirror of
https://github.com/python-telegram-bot/python-telegram-bot.git
synced 2025-01-03 09:49:21 +01:00
Get rid of requests requirement, adding sendVideo file test
This commit is contained in:
parent
d82b8bfbe6
commit
8f8b220bff
6 changed files with 113 additions and 52 deletions
|
@ -1 +0,0 @@
|
||||||
requests
|
|
|
@ -25,6 +25,7 @@ from replykeyboardmarkup import ReplyKeyboardMarkup
|
||||||
from replykeyboardhide import ReplyKeyboardHide
|
from replykeyboardhide import ReplyKeyboardHide
|
||||||
from forcereply import ForceReply
|
from forcereply import ForceReply
|
||||||
from replymarkup import ReplyMarkup
|
from replymarkup import ReplyMarkup
|
||||||
|
from inputfile import InputFile
|
||||||
from error import TelegramError
|
from error import TelegramError
|
||||||
from emoji import Emoji
|
from emoji import Emoji
|
||||||
from bot import Bot
|
from bot import Bot
|
||||||
|
|
|
@ -4,10 +4,11 @@
|
||||||
"""A library that provides a Python interface to the Telegram Bot API"""
|
"""A library that provides a Python interface to the Telegram Bot API"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import requests
|
import urllib
|
||||||
|
import urllib2
|
||||||
|
|
||||||
from telegram import (User, Message, Update, UserProfilePhotos, TelegramError,
|
from telegram import (User, Message, Update, UserProfilePhotos, TelegramError,
|
||||||
ReplyMarkup)
|
ReplyMarkup, InputFile)
|
||||||
|
|
||||||
|
|
||||||
class Bot(object):
|
class Bot(object):
|
||||||
|
@ -66,7 +67,7 @@ class Bot(object):
|
||||||
url = '%s/getMe' % (self.base_url)
|
url = '%s/getMe' % (self.base_url)
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'GET')
|
json_data = self._requestUrl(url, 'GET')
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return User.de_json(data)
|
return User.de_json(data)
|
||||||
|
|
||||||
|
@ -115,7 +116,7 @@ class Bot(object):
|
||||||
data['reply_markup'] = reply_markup
|
data['reply_markup'] = reply_markup
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return Message.de_json(data)
|
return Message.de_json(data)
|
||||||
|
|
||||||
|
@ -152,7 +153,7 @@ class Bot(object):
|
||||||
data['message_id'] = message_id
|
data['message_id'] = message_id
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return Message.de_json(data)
|
return Message.de_json(data)
|
||||||
|
|
||||||
|
@ -204,7 +205,7 @@ class Bot(object):
|
||||||
data['reply_markup'] = reply_markup
|
data['reply_markup'] = reply_markup
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return Message.de_json(data)
|
return Message.de_json(data)
|
||||||
|
|
||||||
|
@ -253,7 +254,7 @@ class Bot(object):
|
||||||
data['reply_markup'] = reply_markup
|
data['reply_markup'] = reply_markup
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return Message.de_json(data)
|
return Message.de_json(data)
|
||||||
|
|
||||||
|
@ -299,7 +300,7 @@ class Bot(object):
|
||||||
data['reply_markup'] = reply_markup
|
data['reply_markup'] = reply_markup
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return Message.de_json(data)
|
return Message.de_json(data)
|
||||||
|
|
||||||
|
@ -345,7 +346,7 @@ class Bot(object):
|
||||||
data['reply_markup'] = reply_markup
|
data['reply_markup'] = reply_markup
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return Message.de_json(data)
|
return Message.de_json(data)
|
||||||
|
|
||||||
|
@ -392,7 +393,7 @@ class Bot(object):
|
||||||
data['reply_markup'] = reply_markup
|
data['reply_markup'] = reply_markup
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return Message.de_json(data)
|
return Message.de_json(data)
|
||||||
|
|
||||||
|
@ -440,7 +441,7 @@ class Bot(object):
|
||||||
data['reply_markup'] = reply_markup
|
data['reply_markup'] = reply_markup
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return Message.de_json(data)
|
return Message.de_json(data)
|
||||||
|
|
||||||
|
@ -509,7 +510,7 @@ class Bot(object):
|
||||||
data['limit'] = limit
|
data['limit'] = limit
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return UserProfilePhotos.de_json(data)
|
return UserProfilePhotos.de_json(data)
|
||||||
|
|
||||||
|
@ -551,9 +552,9 @@ class Bot(object):
|
||||||
data['timeout'] = timeout
|
data['timeout'] = timeout
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return [Update.de_json(x) for x in data]
|
return [Update.de_json(x) for x in data] # TODO: error handling
|
||||||
|
|
||||||
def setWebhook(self, webhook_url=""):
|
def setWebhook(self, webhook_url=""):
|
||||||
"""Use this method to specify a url and receive incoming updates via an
|
"""Use this method to specify a url and receive incoming updates via an
|
||||||
|
@ -578,7 +579,7 @@ class Bot(object):
|
||||||
data = {'url': webhook_url}
|
data = {'url': webhook_url}
|
||||||
|
|
||||||
json_data = self._requestUrl(url, 'POST', data=data)
|
json_data = self._requestUrl(url, 'POST', data=data)
|
||||||
data = self._parseAndCheckTelegram(json_data.content)
|
data = self._parseAndCheckTelegram(json_data)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -601,51 +602,35 @@ class Bot(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if method == 'POST':
|
if method == 'POST':
|
||||||
if 'photo' in data and isinstance(data['photo'], file):
|
if 'audio' in data and isinstance(data['audio'], file) or \
|
||||||
|
'document' in data and isinstance(data['document'], file) or \
|
||||||
|
'photo' in data and isinstance(data['photo'], file) or \
|
||||||
|
'video' in data and isinstance(data['video'], file):
|
||||||
try:
|
try:
|
||||||
photo = data.pop('photo')
|
data = InputFile(data)
|
||||||
|
request = urllib2.Request(
|
||||||
return requests.post(
|
|
||||||
url,
|
url,
|
||||||
data=data,
|
data=data.to_form(),
|
||||||
files={'photo': photo}
|
headers=data.headers
|
||||||
)
|
)
|
||||||
except requests.RequestException as e:
|
return urllib2.urlopen(request).read()
|
||||||
raise TelegramError(str(e))
|
except urllib2.URLError as e:
|
||||||
if 'audio' in data and isinstance(data['audio'], file):
|
|
||||||
try:
|
|
||||||
audio = data.pop('audio')
|
|
||||||
|
|
||||||
return requests.post(
|
|
||||||
url,
|
|
||||||
data=data,
|
|
||||||
files={'audio': audio}
|
|
||||||
)
|
|
||||||
except requests.RequestException as e:
|
|
||||||
raise TelegramError(str(e))
|
|
||||||
if 'document' in data and isinstance(data['document'], file):
|
|
||||||
try:
|
|
||||||
document = data.pop('document')
|
|
||||||
|
|
||||||
return requests.post(
|
|
||||||
url,
|
|
||||||
data=data,
|
|
||||||
files={'document': document}
|
|
||||||
)
|
|
||||||
except requests.RequestException as e:
|
|
||||||
raise TelegramError(str(e))
|
raise TelegramError(str(e))
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
return requests.post(
|
return urllib2.urlopen(
|
||||||
url,
|
url,
|
||||||
data=data
|
urllib.urlencode(data)
|
||||||
)
|
).read()
|
||||||
except requests.RequestException as e:
|
except urllib.IOError as e:
|
||||||
raise TelegramError(str(e))
|
raise TelegramError(str(e))
|
||||||
|
except urllib2.URLError as e:
|
||||||
|
raise TelegramError(str(e))
|
||||||
|
|
||||||
if method == 'GET':
|
if method == 'GET':
|
||||||
try:
|
try:
|
||||||
return requests.get(url)
|
return urllib2.urlopen(url).read()
|
||||||
except requests.RequestException as e:
|
except urllib2.URLError as e:
|
||||||
raise TelegramError(str(e))
|
raise TelegramError(str(e))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
69
telegram/inputfile.py
Normal file
69
telegram/inputfile.py
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
|
||||||
|
import mimetools
|
||||||
|
import mimetypes
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class InputFile(object):
|
||||||
|
def __init__(self,
|
||||||
|
data):
|
||||||
|
self.data = data
|
||||||
|
self.boundary = mimetools.choose_boundary()
|
||||||
|
|
||||||
|
if 'audio' in data and isinstance(data['audio'], file):
|
||||||
|
self.input_name = 'audio'
|
||||||
|
self.input_file = data.pop('audio')
|
||||||
|
if 'document' in data and isinstance(data['document'], file):
|
||||||
|
self.input_name = 'document'
|
||||||
|
self.input_file = data.pop('document')
|
||||||
|
if 'photo' in data and isinstance(data['photo'], file):
|
||||||
|
self.input_name = 'photo'
|
||||||
|
self.input_file = data.pop('photo')
|
||||||
|
if 'video' in data and isinstance(data['video'], file):
|
||||||
|
self.input_name = 'video'
|
||||||
|
self.input_file = data.pop('video')
|
||||||
|
|
||||||
|
self.input_file_content = self.input_file.read()
|
||||||
|
self.filename = os.path.basename(self.input_file.name)
|
||||||
|
self.mimetype = mimetypes.guess_type(self.filename)[0] or \
|
||||||
|
'application/octet-stream'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def headers(self):
|
||||||
|
return {'User-agent': 'Python Telegram Bot (https://github.com/leandrotoledo/python-telegram-bot)',
|
||||||
|
'Content-type': self.content_type}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def content_type(self):
|
||||||
|
return 'multipart/form-data; boundary=%s' % self.boundary
|
||||||
|
|
||||||
|
def to_form(self):
|
||||||
|
form = []
|
||||||
|
form_boundary = '--' + self.boundary
|
||||||
|
|
||||||
|
# Add data fields
|
||||||
|
for name, value in self.data.iteritems():
|
||||||
|
form.extend([
|
||||||
|
form_boundary,
|
||||||
|
'Content-Disposition: form-data; name="%s"' % name,
|
||||||
|
'',
|
||||||
|
str(value)
|
||||||
|
])
|
||||||
|
|
||||||
|
# Add input_file to upload
|
||||||
|
form.extend([
|
||||||
|
form_boundary,
|
||||||
|
'Content-Disposition: form-data; name="%s"; filename="%s"' % (
|
||||||
|
self.input_name, self.filename
|
||||||
|
),
|
||||||
|
'Content-Type: %s' % self.mimetype,
|
||||||
|
'',
|
||||||
|
self.input_file_content
|
||||||
|
])
|
||||||
|
|
||||||
|
form.append('--' + self.boundary + '--')
|
||||||
|
form.append('')
|
||||||
|
|
||||||
|
return '\r\n'.join(form)
|
BIN
tests/telegram.mp4
Normal file
BIN
tests/telegram.mp4
Normal file
Binary file not shown.
|
@ -33,7 +33,7 @@ class BotTest(unittest.TestCase):
|
||||||
'''Test the telegram.Bot getUpdates method'''
|
'''Test the telegram.Bot getUpdates method'''
|
||||||
print 'Testing getUpdates'
|
print 'Testing getUpdates'
|
||||||
updates = self._bot.getUpdates()
|
updates = self._bot.getUpdates()
|
||||||
self.assertEqual(129566562, updates[0].update_id)
|
self.assertEqual(129566572, updates[0].update_id)
|
||||||
|
|
||||||
def testForwardMessage(self):
|
def testForwardMessage(self):
|
||||||
'''Test the telegram.Bot forwardMessage method'''
|
'''Test the telegram.Bot forwardMessage method'''
|
||||||
|
@ -93,6 +93,13 @@ class BotTest(unittest.TestCase):
|
||||||
chat_id=12173560)
|
chat_id=12173560)
|
||||||
self.assertEqual(39518, message.sticker.file_size)
|
self.assertEqual(39518, message.sticker.file_size)
|
||||||
|
|
||||||
|
def testSendVideo(self):
|
||||||
|
'''Test the telegram.Bot sendVideo method'''
|
||||||
|
print 'Testing sendVideo - File'
|
||||||
|
message = self._bot.sendVideo(video=open('tests/telegram.mp4', 'rb'),
|
||||||
|
chat_id=12173560)
|
||||||
|
self.assertEqual(326534, message.video.file_size)
|
||||||
|
|
||||||
def testResendVideo(self):
|
def testResendVideo(self):
|
||||||
'''Test the telegram.Bot sendVideo method'''
|
'''Test the telegram.Bot sendVideo method'''
|
||||||
print 'Testing sendVideo - Resend'
|
print 'Testing sendVideo - Resend'
|
||||||
|
|
Loading…
Reference in a new issue