Name | telegram-sender JSON |
Version |
1.3.4
JSON |
| download |
home_page | None |
Summary | Asynchronous Python tool for efficiently sending messages and photos to multiple Telegram users with optional MongoDB logging. |
upload_time | 2024-10-14 12:00:23 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.10 |
license | None |
keywords |
telegram
bot
async
message
sender
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# telegram_sender: Asynchronous Telegram Message Sender
**telegram_sender** is an asynchronous Python package designed to send messages, photos, and videos (single or multiple, in any order) to multiple Telegram users efficiently. It leverages Python's `asyncio` and `aiohttp` libraries to handle concurrent HTTP requests, making it suitable for broadcasting messages to a large number of users with optimal performance.
## Table of Contents
- [Overview](#overview)
- [Installation](#installation)
- [How It Works](#how-it-works)
- [Advantages](#advantages)
- [Usage Examples](#usage-examples)
- [Example 1 - Simple Text Message Broadcast](#example-1---simple-text-message-broadcast)
- [Example 2 - Sending a Single Photo with Text and Buttons](#example-2---sending-a-single-photo-with-text-and-buttons)
- [Example 3 - Sending Multiple Photos and Videos in Any Order](#example-3---sending-multiple-photos-and-videos-in-any-order)
- [Example 4 - Sending a Single Video with Text and Buttons](#example-4---sending-a-single-video-with-text-and-buttons)
- [Example 5 - Logging Messages in MongoDB](#example-5---logging-messages-in-mongodb)
- [Getting Started](#getting-started)
- [How to Obtain Media File IDs](#how-to-obtain-media-file-ids)
## Overview
In modern applications, especially those involving notifications or updates, sending messages to a multitude of users is a common requirement. **telegram_sender** addresses this need by providing an asynchronous solution that sends messages in batches, handles errors gracefully, and optionally logs the results to MongoDB for record-keeping or analysis.
## Installation
You can install **telegram_sender** directly from PyPI:
```bash
pip install telegram_sender
```
Make sure you have Python 3.10 or higher installed.
## How It Works
**telegram_sender** operates by:
1. **Preparing Message Data**: It formats the message content, including text, photos, and videos (single or multiple, in any order), and optional reply markups, in a way that is compatible with the Telegram Bot API. You can also specify the `parse_mode` (e.g., `HTML`, `Markdown`) when initializing the class to control how text is parsed by Telegram.
2. **Batching Requests**: To avoid exceeding Telegram's rate limits and to improve performance, it divides the list of recipient chat IDs into batches. Each batch contains a specified number of messages (`batch_size`).
3. **Asynchronous Sending**: Using asynchronous HTTP requests, it sends each batch concurrently, ensuring that the program doesn't block while waiting for responses.
4. **Delay Between Batches**: After sending a batch, it waits for a specified delay (`delay_between_batches`) before sending the next one. This delay helps comply with Telegram's rate limits and prevents server overload.
5. **Error Handling**: If a message fails to send, the error is logged using Python's `logging` module. The process continues with the next messages without interruption.
6. **MongoDB Logging (Optional)**: If enabled, the results of each message send operation are stored in a MongoDB collection. This feature is useful for auditing, analytics, or retry mechanisms.
## Advantages
- **Asynchronous Processing**: Utilizes `asyncio` and `aiohttp` for non-blocking operations, making it efficient for high-volume message sending.
- **Batch Management**: Sends messages in configurable batches to optimize performance and comply with rate limits.
- **Error Resilience**: Continues sending messages even if some fail, and logs errors for later review.
- **Configurable**: Offers flexibility through parameters such as batch size, delay intervals, parse mode, and MongoDB settings.
- **Optional Logging**: Allows enabling or disabling MongoDB logging based on your needs.
## Usage Examples
### Example 1 - Simple Text Message Broadcast
This example demonstrates how to send a simple text message to multiple users.
```python
import asyncio
from telegram_sender import TelegramSender
async def main():
# Initialize the message sender
sender = TelegramSender(
token="YOUR_TELEGRAM_BOT_TOKEN",
batch_size=30, # Increased batch size to 30 messages concurrently
delay_between_batches=1.5, # 1.5-second delay between batches
use_mongo=False, # No MongoDB logging
parse_mode="Markdown" # Setting parse_mode to Markdown
)
# Message text
text = "*Hello!* This is a test message."
# List of chat IDs
chat_ids = [123456789, 987654321, 456123789]
# Start the message sending process
delivered, not_delivered = await sender.run(chat_ids, text=text)
# Output statistics
print(f"Successfully sent: {delivered}, Failed to send: {not_delivered}")
# Run the asynchronous task
asyncio.run(main())
```
### Example 2 - Sending a Single Photo with Text and Buttons
This example shows how to send a single photo with a caption and inline buttons.
```python
import asyncio
from telegram_sender import TelegramSender, Photo
async def main():
# Initialize the message sender
sender = TelegramSender(
token="YOUR_TELEGRAM_BOT_TOKEN",
batch_size=20, # Send 20 messages concurrently
delay_between_batches=2.0, # 2-second delay between batches
use_mongo=True, # Log results in MongoDB
parse_mode="HTML" # Using HTML as parse_mode
)
# Prepare the data
text = "Check out this <b>beautiful</b> photo!"
media_items = [
Photo("PHOTO_FILE_ID") # Single photo
]
reply_markup = {
"inline_keyboard": [
[{"text": "Like", "callback_data": "like"},
{"text": "Dislike", "callback_data": "dislike"}]
]
}
# List of chat IDs
chat_ids = [123456789, 987654321, 456123789]
# Start the message sending process
delivered, not_delivered = await sender.run(chat_ids, text=text, media_items=media_items, reply_markup=reply_markup)
# Output statistics
print(f"Successfully sent: {delivered}, Failed to send: {not_delivered}")
# Run the asynchronous task
asyncio.run(main())
```
### Example 3 - Sending Multiple Photos and Videos in Any Order
This example demonstrates how to send multiple photos and videos in a single message using `sendMediaGroup`, preserving the order of media items.
```python
import asyncio
from telegram_sender import TelegramSender, Photo, Video
async def main():
# Initialize the message sender
sender = TelegramSender(
token="YOUR_TELEGRAM_BOT_TOKEN",
batch_size=2, # Send 2 messages concurrently
delay_between_batches=1.5, # 1.5-second delay between batches
use_mongo=False # No MongoDB logging
)
# Prepare the data
text = "Here are some highlights from our latest event!"
media_items = [
Photo("PHOTO_FILE_ID_1"),
Video("VIDEO_FILE_ID_1"),
Photo("PHOTO_FILE_ID_2"),
]
# Note: reply_markup is not supported with sendMediaGroup
reply_markup = None
# List of chat IDs
chat_ids = [123456789, 987654321, 456123789]
# Start the message sending process
delivered, not_delivered = await sender.run(chat_ids, text=text, media_items=media_items)
# Output statistics
print(f"Successfully sent: {delivered}, Failed to send: {not_delivered}")
# Run the asynchronous task
asyncio.run(main())
```
**Important Notes:**
- When sending multiple media files using `sendMediaGroup`, the `reply_markup` parameter (e.g., inline keyboards) is **not supported** by the Telegram API. If you need to include buttons, consider sending them in a separate message after the media group.
- The `media_items` list allows you to mix photos and videos in any order. Each item is an instance of `Photo` or `Video`.
### Example 4 - Sending a Single Video with Text and Buttons
This example shows how to send a single video with a caption and inline buttons.
```python
import asyncio
from telegram_sender import TelegramSender, Video
async def main():
# Initialize the message sender
sender = TelegramSender(
token="YOUR_TELEGRAM_BOT_TOKEN",
batch_size=10, # Send 10 messages concurrently
delay_between_batches=1.0, # 1-second delay between batches
use_mongo=False, # No MongoDB logging
parse_mode="Markdown" # Using Markdown as parse_mode
)
# Prepare the data
text = "*Watch* this exciting video!"
media_items = [
Video("VIDEO_FILE_ID") # Single video
]
reply_markup = {
"inline_keyboard": [
[{"text": "👍 Like", "callback_data": "like"},
{"text": "👎 Dislike", "callback_data": "dislike"}]
]
}
# List of chat IDs
chat_ids = [123456789, 987654321, 456123789]
# Start the message sending process
delivered, not_delivered = await sender.run(chat_ids, text=text, media_items=media_items, reply_markup=reply_markup)
# Output statistics
print(f"Successfully sent: {delivered}, Failed to send: {not_delivered}")
# Run the asynchronous task
asyncio.run(main())
```
### Example 5 - Logging Messages in MongoDB
This example demonstrates how to enable MongoDB logging to keep records of sent messages.
```python
import asyncio
from telegram_sender import TelegramSender
async def main():
# Initialize the message sender with MongoDB logging
sender = TelegramSender(
token="YOUR_TELEGRAM_BOT_TOKEN",
batch_size=10, # Batch size of 10 messages
delay_between_batches=1.0, # 1-second delay between batches
use_mongo=True, # Enable MongoDB logging
mongo_uri="mongodb://localhost:27017", # MongoDB URI
mongo_db="telegram_logs" # Database name
)
# Message text
text = "This message will be logged in MongoDB."
# List of chat IDs
chat_ids = [123456789, 987654321, 456123789]
# Start the message sending process
delivered, not_delivered = await sender.run(chat_ids, text=text)
# Output statistics
print(f"Successfully sent: {delivered}, Failed to send: {not_delivered}")
# Run the asynchronous task
asyncio.run(main())
```
## Getting Started
To start using **telegram_sender**, you need:
- **Python 3.10+**: The codebase uses modern Python features and type annotations.
- **Telegram Bot Token**: Obtain one by creating a bot through [BotFather](https://telegram.me/botfather) on Telegram.
- **Install the Package**: Install **telegram_sender** using pip:
```bash
pip install telegram_sender
```
- **MongoDB Instance (Optional)**: If you wish to enable logging, have access to a MongoDB database.
## How to Obtain Media File IDs
To reuse photos or videos in Telegram without re-uploading, you can obtain their `file_id` by sending the media as a message through your bot to any user (e.g., yourself or any user who has interacted with the bot).
Here's a simple function to get a photo or video `file_id`:
```python
import requests
def get_media_token(bot_token: str, media_path: str, chat_id: int, media_type: str = "photo") -> str:
with open(media_path, "rb") as media_file:
response = requests.post(
url=f"https://api.telegram.org/bot{bot_token}/send{media_type.capitalize()}",
files={media_type: media_file},
data={"chat_id": chat_id}
)
response_data = response.json()
if not response_data.get("ok"):
raise Exception(f"Error sending media: {response_data}")
result = response_data["result"]
media_key = "photo" if media_type == "photo" else "video"
media = result[media_key]
if isinstance(media, list):
return media[-1]["file_id"]
else:
return media["file_id"]
# Example usage:
# Replace "YOUR_TELEGRAM_BOT_TOKEN" with your bot token and use your own chat_id or any user who interacted with the bot.
# photo_token = get_media_token("YOUR_TELEGRAM_BOT_TOKEN", "/path/to/photo.jpg", YOUR_CHAT_ID, media_type="photo")
# video_token = get_media_token("YOUR_TELEGRAM_BOT_TOKEN", "/path/to/video.mp4", YOUR_CHAT_ID, media_type="video")
```
Raw data
{
"_id": null,
"home_page": null,
"name": "telegram-sender",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "telegram, bot, async, message, sender",
"author": null,
"author_email": "Alexander Smirnov <Alex@TheSmirnov.com>",
"download_url": "https://files.pythonhosted.org/packages/f8/b4/7632a2867c809bcde67af39740f4519c9eff3e6f00f503c843ecc4d7a27b/telegram_sender-1.3.4.tar.gz",
"platform": null,
"description": "# telegram_sender: Asynchronous Telegram Message Sender\n\n**telegram_sender** is an asynchronous Python package designed to send messages, photos, and videos (single or multiple, in any order) to multiple Telegram users efficiently. It leverages Python's `asyncio` and `aiohttp` libraries to handle concurrent HTTP requests, making it suitable for broadcasting messages to a large number of users with optimal performance.\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Installation](#installation)\n- [How It Works](#how-it-works)\n- [Advantages](#advantages)\n- [Usage Examples](#usage-examples)\n - [Example 1 - Simple Text Message Broadcast](#example-1---simple-text-message-broadcast)\n - [Example 2 - Sending a Single Photo with Text and Buttons](#example-2---sending-a-single-photo-with-text-and-buttons)\n - [Example 3 - Sending Multiple Photos and Videos in Any Order](#example-3---sending-multiple-photos-and-videos-in-any-order)\n - [Example 4 - Sending a Single Video with Text and Buttons](#example-4---sending-a-single-video-with-text-and-buttons)\n - [Example 5 - Logging Messages in MongoDB](#example-5---logging-messages-in-mongodb)\n- [Getting Started](#getting-started)\n- [How to Obtain Media File IDs](#how-to-obtain-media-file-ids)\n\n## Overview\n\nIn modern applications, especially those involving notifications or updates, sending messages to a multitude of users is a common requirement. **telegram_sender** addresses this need by providing an asynchronous solution that sends messages in batches, handles errors gracefully, and optionally logs the results to MongoDB for record-keeping or analysis.\n\n## Installation\n\nYou can install **telegram_sender** directly from PyPI:\n\n```bash\npip install telegram_sender\n```\n\nMake sure you have Python 3.10 or higher installed.\n\n## How It Works\n\n**telegram_sender** operates by:\n\n1. **Preparing Message Data**: It formats the message content, including text, photos, and videos (single or multiple, in any order), and optional reply markups, in a way that is compatible with the Telegram Bot API. You can also specify the `parse_mode` (e.g., `HTML`, `Markdown`) when initializing the class to control how text is parsed by Telegram.\n\n2. **Batching Requests**: To avoid exceeding Telegram's rate limits and to improve performance, it divides the list of recipient chat IDs into batches. Each batch contains a specified number of messages (`batch_size`).\n\n3. **Asynchronous Sending**: Using asynchronous HTTP requests, it sends each batch concurrently, ensuring that the program doesn't block while waiting for responses.\n\n4. **Delay Between Batches**: After sending a batch, it waits for a specified delay (`delay_between_batches`) before sending the next one. This delay helps comply with Telegram's rate limits and prevents server overload.\n\n5. **Error Handling**: If a message fails to send, the error is logged using Python's `logging` module. The process continues with the next messages without interruption.\n\n6. **MongoDB Logging (Optional)**: If enabled, the results of each message send operation are stored in a MongoDB collection. This feature is useful for auditing, analytics, or retry mechanisms.\n\n## Advantages\n\n- **Asynchronous Processing**: Utilizes `asyncio` and `aiohttp` for non-blocking operations, making it efficient for high-volume message sending.\n- **Batch Management**: Sends messages in configurable batches to optimize performance and comply with rate limits.\n- **Error Resilience**: Continues sending messages even if some fail, and logs errors for later review.\n- **Configurable**: Offers flexibility through parameters such as batch size, delay intervals, parse mode, and MongoDB settings.\n- **Optional Logging**: Allows enabling or disabling MongoDB logging based on your needs.\n\n## Usage Examples\n\n### Example 1 - Simple Text Message Broadcast\n\nThis example demonstrates how to send a simple text message to multiple users.\n\n```python\nimport asyncio\nfrom telegram_sender import TelegramSender\n\nasync def main():\n # Initialize the message sender\n sender = TelegramSender(\n token=\"YOUR_TELEGRAM_BOT_TOKEN\",\n batch_size=30, # Increased batch size to 30 messages concurrently\n delay_between_batches=1.5, # 1.5-second delay between batches\n use_mongo=False, # No MongoDB logging\n parse_mode=\"Markdown\" # Setting parse_mode to Markdown\n )\n\n # Message text\n text = \"*Hello!* This is a test message.\"\n\n # List of chat IDs\n chat_ids = [123456789, 987654321, 456123789]\n\n # Start the message sending process\n delivered, not_delivered = await sender.run(chat_ids, text=text)\n\n # Output statistics\n print(f\"Successfully sent: {delivered}, Failed to send: {not_delivered}\")\n\n# Run the asynchronous task\nasyncio.run(main())\n```\n\n### Example 2 - Sending a Single Photo with Text and Buttons\n\nThis example shows how to send a single photo with a caption and inline buttons.\n\n```python\nimport asyncio\nfrom telegram_sender import TelegramSender, Photo\n\nasync def main():\n # Initialize the message sender\n sender = TelegramSender(\n token=\"YOUR_TELEGRAM_BOT_TOKEN\",\n batch_size=20, # Send 20 messages concurrently\n delay_between_batches=2.0, # 2-second delay between batches\n use_mongo=True, # Log results in MongoDB\n parse_mode=\"HTML\" # Using HTML as parse_mode\n )\n\n # Prepare the data\n text = \"Check out this <b>beautiful</b> photo!\"\n media_items = [\n Photo(\"PHOTO_FILE_ID\") # Single photo\n ]\n reply_markup = {\n \"inline_keyboard\": [\n [{\"text\": \"Like\", \"callback_data\": \"like\"},\n {\"text\": \"Dislike\", \"callback_data\": \"dislike\"}]\n ]\n }\n\n # List of chat IDs\n chat_ids = [123456789, 987654321, 456123789]\n\n # Start the message sending process\n delivered, not_delivered = await sender.run(chat_ids, text=text, media_items=media_items, reply_markup=reply_markup)\n\n # Output statistics\n print(f\"Successfully sent: {delivered}, Failed to send: {not_delivered}\")\n\n# Run the asynchronous task\nasyncio.run(main())\n```\n\n### Example 3 - Sending Multiple Photos and Videos in Any Order\n\nThis example demonstrates how to send multiple photos and videos in a single message using `sendMediaGroup`, preserving the order of media items.\n\n```python\nimport asyncio\nfrom telegram_sender import TelegramSender, Photo, Video\n\nasync def main():\n # Initialize the message sender\n sender = TelegramSender(\n token=\"YOUR_TELEGRAM_BOT_TOKEN\",\n batch_size=2, # Send 2 messages concurrently\n delay_between_batches=1.5, # 1.5-second delay between batches\n use_mongo=False # No MongoDB logging\n )\n\n # Prepare the data\n text = \"Here are some highlights from our latest event!\"\n media_items = [\n Photo(\"PHOTO_FILE_ID_1\"),\n Video(\"VIDEO_FILE_ID_1\"),\n Photo(\"PHOTO_FILE_ID_2\"),\n ]\n\n # Note: reply_markup is not supported with sendMediaGroup\n reply_markup = None\n\n # List of chat IDs\n chat_ids = [123456789, 987654321, 456123789]\n\n # Start the message sending process\n delivered, not_delivered = await sender.run(chat_ids, text=text, media_items=media_items)\n\n # Output statistics\n print(f\"Successfully sent: {delivered}, Failed to send: {not_delivered}\")\n\n# Run the asynchronous task\nasyncio.run(main())\n```\n\n**Important Notes:**\n\n- When sending multiple media files using `sendMediaGroup`, the `reply_markup` parameter (e.g., inline keyboards) is **not supported** by the Telegram API. If you need to include buttons, consider sending them in a separate message after the media group.\n- The `media_items` list allows you to mix photos and videos in any order. Each item is an instance of `Photo` or `Video`.\n\n### Example 4 - Sending a Single Video with Text and Buttons\n\nThis example shows how to send a single video with a caption and inline buttons.\n\n```python\nimport asyncio\nfrom telegram_sender import TelegramSender, Video\n\nasync def main():\n # Initialize the message sender\n sender = TelegramSender(\n token=\"YOUR_TELEGRAM_BOT_TOKEN\",\n batch_size=10, # Send 10 messages concurrently\n delay_between_batches=1.0, # 1-second delay between batches\n use_mongo=False, # No MongoDB logging\n parse_mode=\"Markdown\" # Using Markdown as parse_mode\n )\n\n # Prepare the data\n text = \"*Watch* this exciting video!\"\n media_items = [\n Video(\"VIDEO_FILE_ID\") # Single video\n ]\n reply_markup = {\n \"inline_keyboard\": [\n [{\"text\": \"\ud83d\udc4d Like\", \"callback_data\": \"like\"},\n {\"text\": \"\ud83d\udc4e Dislike\", \"callback_data\": \"dislike\"}]\n ]\n }\n\n # List of chat IDs\n chat_ids = [123456789, 987654321, 456123789]\n\n # Start the message sending process\n delivered, not_delivered = await sender.run(chat_ids, text=text, media_items=media_items, reply_markup=reply_markup)\n\n # Output statistics\n print(f\"Successfully sent: {delivered}, Failed to send: {not_delivered}\")\n\n# Run the asynchronous task\nasyncio.run(main())\n```\n\n### Example 5 - Logging Messages in MongoDB\n\nThis example demonstrates how to enable MongoDB logging to keep records of sent messages.\n\n```python\nimport asyncio\nfrom telegram_sender import TelegramSender\n\nasync def main():\n # Initialize the message sender with MongoDB logging\n sender = TelegramSender(\n token=\"YOUR_TELEGRAM_BOT_TOKEN\",\n batch_size=10, # Batch size of 10 messages\n delay_between_batches=1.0, # 1-second delay between batches\n use_mongo=True, # Enable MongoDB logging\n mongo_uri=\"mongodb://localhost:27017\", # MongoDB URI\n mongo_db=\"telegram_logs\" # Database name\n )\n\n # Message text\n text = \"This message will be logged in MongoDB.\"\n\n # List of chat IDs\n chat_ids = [123456789, 987654321, 456123789]\n\n # Start the message sending process\n delivered, not_delivered = await sender.run(chat_ids, text=text)\n\n # Output statistics\n print(f\"Successfully sent: {delivered}, Failed to send: {not_delivered}\")\n\n# Run the asynchronous task\nasyncio.run(main())\n```\n\n## Getting Started\n\nTo start using **telegram_sender**, you need:\n\n- **Python 3.10+**: The codebase uses modern Python features and type annotations.\n- **Telegram Bot Token**: Obtain one by creating a bot through [BotFather](https://telegram.me/botfather) on Telegram.\n- **Install the Package**: Install **telegram_sender** using pip:\n\n ```bash\n pip install telegram_sender\n ```\n\n- **MongoDB Instance (Optional)**: If you wish to enable logging, have access to a MongoDB database.\n\n## How to Obtain Media File IDs\n\nTo reuse photos or videos in Telegram without re-uploading, you can obtain their `file_id` by sending the media as a message through your bot to any user (e.g., yourself or any user who has interacted with the bot).\n\nHere's a simple function to get a photo or video `file_id`:\n\n```python\nimport requests\n\ndef get_media_token(bot_token: str, media_path: str, chat_id: int, media_type: str = \"photo\") -> str:\n with open(media_path, \"rb\") as media_file:\n response = requests.post(\n url=f\"https://api.telegram.org/bot{bot_token}/send{media_type.capitalize()}\",\n files={media_type: media_file},\n data={\"chat_id\": chat_id}\n )\n response_data = response.json()\n if not response_data.get(\"ok\"):\n raise Exception(f\"Error sending media: {response_data}\")\n result = response_data[\"result\"]\n media_key = \"photo\" if media_type == \"photo\" else \"video\"\n media = result[media_key]\n if isinstance(media, list):\n return media[-1][\"file_id\"]\n else:\n return media[\"file_id\"]\n\n# Example usage:\n# Replace \"YOUR_TELEGRAM_BOT_TOKEN\" with your bot token and use your own chat_id or any user who interacted with the bot.\n# photo_token = get_media_token(\"YOUR_TELEGRAM_BOT_TOKEN\", \"/path/to/photo.jpg\", YOUR_CHAT_ID, media_type=\"photo\")\n# video_token = get_media_token(\"YOUR_TELEGRAM_BOT_TOKEN\", \"/path/to/video.mp4\", YOUR_CHAT_ID, media_type=\"video\")\n```\n",
"bugtrack_url": null,
"license": null,
"summary": "Asynchronous Python tool for efficiently sending messages and photos to multiple Telegram users with optional MongoDB logging.",
"version": "1.3.4",
"project_urls": {
"Bug Tracker": "https://github.com/smalyu/telegram_sender/issues",
"Homepage": "https://github.com/smalyu/telegram_sender",
"Source": "https://github.com/smalyu/telegram_sender"
},
"split_keywords": [
"telegram",
" bot",
" async",
" message",
" sender"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "ac548b381d19947b98645ffa451a430a3fe3d81060189bdd0dfbc0f3f715768e",
"md5": "ced685225cf3f75cc4f0f0435526db35",
"sha256": "f6451f7d5c745fb1d4b75db71142496c547fca4531fe834a2cfe82e555545846"
},
"downloads": -1,
"filename": "telegram_sender-1.3.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ced685225cf3f75cc4f0f0435526db35",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 7354,
"upload_time": "2024-10-14T12:00:21",
"upload_time_iso_8601": "2024-10-14T12:00:21.289477Z",
"url": "https://files.pythonhosted.org/packages/ac/54/8b381d19947b98645ffa451a430a3fe3d81060189bdd0dfbc0f3f715768e/telegram_sender-1.3.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f8b47632a2867c809bcde67af39740f4519c9eff3e6f00f503c843ecc4d7a27b",
"md5": "6ba7ee0d153cbd2680a22ff506a17063",
"sha256": "5c431fee872cfe3c253abc9c991d3d128b28249fe383056240b0de58260c1360"
},
"downloads": -1,
"filename": "telegram_sender-1.3.4.tar.gz",
"has_sig": false,
"md5_digest": "6ba7ee0d153cbd2680a22ff506a17063",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 9967,
"upload_time": "2024-10-14T12:00:23",
"upload_time_iso_8601": "2024-10-14T12:00:23.162402Z",
"url": "https://files.pythonhosted.org/packages/f8/b4/7632a2867c809bcde67af39740f4519c9eff3e6f00f503c843ecc4d7a27b/telegram_sender-1.3.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-14 12:00:23",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "smalyu",
"github_project": "telegram_sender",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "telegram-sender"
}