botapi-py 1.4.8__tar.gz → 1.4.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {botapi_py-1.4.8 → botapi_py-1.4.10}/PKG-INFO +1 -1
- {botapi_py-1.4.8 → botapi_py-1.4.10}/pyproject.toml +1 -1
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/core.py +13 -1
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/shortcuts.py +75 -3
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/__init__.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/__init__.pyi +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/dispatchers/__init__.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/dispatchers/__init__.pyi +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/dispatchers/common.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/dispatchers/get_updates_handler.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/dispatchers/redis_pubsub_handler.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/enums.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/errors.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/methods.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/types.py +0 -0
- {botapi_py-1.4.8 → botapi_py-1.4.10}/src/botapi/utils.py +0 -0
|
@@ -49,7 +49,19 @@ class BaseBot:
|
|
|
49
49
|
url += 'test/'
|
|
50
50
|
url += method
|
|
51
51
|
return url
|
|
52
|
-
|
|
52
|
+
|
|
53
|
+
def _compose_api_file_url(self, file_path: str) -> str:
|
|
54
|
+
'''
|
|
55
|
+
Composes the URL for file downloads from the Telegram Bot API.
|
|
56
|
+
'''
|
|
57
|
+
# https://api.telegram.org/file/bot<token>/<file_path>
|
|
58
|
+
# https://api.telegram.org/file/bot<token>/test/<file_path>
|
|
59
|
+
url = f'{self.api_url}/file/bot{self.token}/'
|
|
60
|
+
if self.test_server:
|
|
61
|
+
url += 'test/'
|
|
62
|
+
url += file_path
|
|
63
|
+
return url
|
|
64
|
+
|
|
53
65
|
def _convert_data(self, data: dict[str, Any]) -> tuple[dict[str, Any], MultipartFiles]:
|
|
54
66
|
new_data: dict[str, Any] = {}
|
|
55
67
|
files: MultipartFiles = {} # (filename, file_content, mime_type)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Optional, Union, List, cast
|
|
3
|
+
from typing import Optional, Union, List, cast, overload
|
|
4
4
|
|
|
5
5
|
from . import enums
|
|
6
6
|
from . import types
|
|
@@ -17,8 +17,8 @@ class BotShortcuts:
|
|
|
17
17
|
async def send_media(
|
|
18
18
|
self,
|
|
19
19
|
chat_id: Union[int, str],
|
|
20
|
-
media: Union[types.InputFile, str],
|
|
21
|
-
file_type: enums.MediaType,
|
|
20
|
+
media: Union[types.InputFile, str, None],
|
|
21
|
+
file_type: Optional[enums.MediaType],
|
|
22
22
|
caption: Optional[str] = None,
|
|
23
23
|
parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
|
|
24
24
|
caption_entities: Optional[List[types.MessageEntity]] = None,
|
|
@@ -36,6 +36,7 @@ class BotShortcuts:
|
|
|
36
36
|
) -> types.Message:
|
|
37
37
|
'''
|
|
38
38
|
Method that sends common types of media by automatically routing to the correct `send_<type>` method.
|
|
39
|
+
Also supports send_message with text only for convenience.
|
|
39
40
|
|
|
40
41
|
:param chat_id: Unique identifier for the target chat or username of the target channel.
|
|
41
42
|
:param media: File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data.
|
|
@@ -58,6 +59,29 @@ class BotShortcuts:
|
|
|
58
59
|
'''
|
|
59
60
|
self = cast(methods.Bot, self)
|
|
60
61
|
|
|
62
|
+
# Plain text message
|
|
63
|
+
if not media or not file_type:
|
|
64
|
+
if not caption:
|
|
65
|
+
raise ValueError('Either media or caption must be provided.')
|
|
66
|
+
|
|
67
|
+
return await self.send_message(
|
|
68
|
+
chat_id=chat_id,
|
|
69
|
+
# =media,
|
|
70
|
+
text=caption,
|
|
71
|
+
parse_mode=parse_mode,
|
|
72
|
+
entities=caption_entities,
|
|
73
|
+
disable_notification=disable_notification,
|
|
74
|
+
protect_content=protect_content,
|
|
75
|
+
reply_parameters=reply_parameters,
|
|
76
|
+
reply_markup=reply_markup,
|
|
77
|
+
message_effect_id=message_effect_id,
|
|
78
|
+
allow_paid_broadcast=allow_paid_broadcast,
|
|
79
|
+
business_connection_id=business_connection_id,
|
|
80
|
+
message_thread_id=message_thread_id,
|
|
81
|
+
# has_spoiler=has_spoiler,
|
|
82
|
+
# show_caption_above_media=show_caption_above_media
|
|
83
|
+
)
|
|
84
|
+
|
|
61
85
|
match file_type:
|
|
62
86
|
|
|
63
87
|
case enums.MediaType.PHOTO:
|
|
@@ -219,3 +243,51 @@ class BotShortcuts:
|
|
|
219
243
|
case _:
|
|
220
244
|
raise ValueError(f'Unknown media type: {file_type}')
|
|
221
245
|
|
|
246
|
+
@overload
|
|
247
|
+
async def download_file(
|
|
248
|
+
self,
|
|
249
|
+
file: types.File,
|
|
250
|
+
destination_path: str
|
|
251
|
+
) -> None: ...
|
|
252
|
+
|
|
253
|
+
@overload
|
|
254
|
+
async def download_file(
|
|
255
|
+
self,
|
|
256
|
+
file: types.File,
|
|
257
|
+
destination_path: None = None
|
|
258
|
+
) -> bytes: ...
|
|
259
|
+
|
|
260
|
+
async def download_file(
|
|
261
|
+
self,
|
|
262
|
+
file: types.File,
|
|
263
|
+
destination_path: Optional[str] = None
|
|
264
|
+
) -> bytes | None:
|
|
265
|
+
'''
|
|
266
|
+
Convenience method to download a file from Telegram servers.
|
|
267
|
+
|
|
268
|
+
Call this method with a `File` object obtained via `get_file`.
|
|
269
|
+
|
|
270
|
+
:param file: File object to download.
|
|
271
|
+
:param destination_path: Optional path to save the downloaded file. If not provided, the file content will be returned as bytes.
|
|
272
|
+
:return: The file content as bytes if destination_path is not provided, otherwise None.
|
|
273
|
+
'''
|
|
274
|
+
self = cast(methods.Bot, self)
|
|
275
|
+
|
|
276
|
+
file_path = file.file_path
|
|
277
|
+
if not file_path:
|
|
278
|
+
raise ValueError('The file does not have a valid file_path to download.')
|
|
279
|
+
|
|
280
|
+
# https://api.telegram.org/file/bot<token>/<file_path>
|
|
281
|
+
# https://api.telegram.org/file/bot<token>/test/<file_path>
|
|
282
|
+
url = self._compose_api_file_url(file_path=file_path) # pyright: ignore[reportPrivateUsage]
|
|
283
|
+
|
|
284
|
+
response = await self.session.get(url)
|
|
285
|
+
content = response.content
|
|
286
|
+
|
|
287
|
+
if destination_path:
|
|
288
|
+
with open(destination_path, 'wb') as f:
|
|
289
|
+
f.write(content)
|
|
290
|
+
return None
|
|
291
|
+
|
|
292
|
+
return content
|
|
293
|
+
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|