<p align="center">
<img src="assets/logo.svg" alt="PyMax" width="400">
</p>
<p align="center">
<strong>Python wrapper для API мессенджера Max</strong>
</p>
<p align="center">
<img src="https://img.shields.io/badge/python-3.10+-3776AB.svg" alt="Python 3.11+">
<img src="https://img.shields.io/badge/License-MIT-2f9872.svg" alt="License: MIT">
<img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff">
<img src="https://img.shields.io/badge/packaging-uv-D7FF64.svg" alt="Packaging">
</p>
---
## Описание
**`pymax`** — асинхронная Python библиотека для работы с API мессенджера Max. Предоставляет интерфейс для отправки сообщений, управления чатами, каналами и диалогами через WebSocket соединение.
### Основные возможности
- Вход по номеру телефона
- Отправка, редактирование и удаление сообщений
- Работа с чатами и каналами
- История сообщений
## Установка
> [!IMPORTANT]
> Для работы библиотеки требуется Python 3.10 или выше
### Установка через pip
```bash
pip install -U maxapi-python
```
### Установка через uv
```bash
uv add -U maxapi-python
```
## Быстрый старт
### Базовый пример использования
```python
import asyncio
from pymax import MaxClient, Message
# Инициализация клиента
phone = "+1234567890"
client = MaxClient(phone=phone, work_dir="cache")
# Обработчик входящих сообщений
@client.on_message
async def handle_message(message: Message) -> None:
print(f"{message.sender}: {message.text}")
# Обработчик запуска клиента
@client.on_start
async def handle_start() -> None:
print("Клиент запущен")
# Получение истории сообщений
history = await client.fetch_history(chat_id=0)
if history:
for message in history:
user = await client.get_user(message.sender)
if user:
print(f"{user.names[0].name}: {message.text}")
async def main() -> None:
await client.start()
# Работа с чатами
for chat in client.chats:
print(f"Чат: {chat.title}")
# Отправка сообщения
message = await client.send_message(
"Привет от PyMax!",
chat.id,
notify=True
)
# Редактирование сообщения
await asyncio.sleep(2)
await client.edit_message(
chat.id,
message.id,
"Привет от PyMax! (отредактировано)"
)
# Удаление сообщения
await asyncio.sleep(2)
await client.delete_message(chat.id, [message.id], for_me=False)
# Работа с диалогами
for dialog in client.dialogs:
print(f"Диалог: {dialog.last_message.text}")
# Работа с каналами
for channel in client.channels:
print(f"Канал: {channel.title}")
await client.close()
if __name__ == "__main__":
asyncio.run(main())
```
## Документация
WIP
## Лицензия
Этот проект распространяется под лицензией MIT. См. файл [LICENSE](LICENSE) для получения информации.
## Авторы
- **[noxzion](https://github.com/noxzion)** — оригинальный автор проекта
- **[ink](https://github.com/ink-developer)** — второй разработчик, исследование API и его документация
- **[fresh-milkshake](https://github.com/fresh-milkshake)** — контрибьютор и автор лого
Raw data
{
"_id": null,
"home_page": null,
"name": "maxapi-python",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "api, max, messenger, websocket, wrapper",
"author": null,
"author_email": "noxzion <negroid2281488ilikrilex@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/06/e9/a39b768c31388c1cd627ae75280f8261731a36d66195f5ee2e1d2755b9b8/maxapi_python-0.1.1.tar.gz",
"platform": null,
"description": "<p align=\"center\">\n <img src=\"assets/logo.svg\" alt=\"PyMax\" width=\"400\">\n</p>\n\n<p align=\"center\">\n <strong>Python wrapper \u0434\u043b\u044f API \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 Max</strong>\n</p>\n\n<p align=\"center\">\n <img src=\"https://img.shields.io/badge/python-3.10+-3776AB.svg\" alt=\"Python 3.11+\">\n <img src=\"https://img.shields.io/badge/License-MIT-2f9872.svg\" alt=\"License: MIT\">\n <img src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\" alt=\"Ruff\">\n <img src=\"https://img.shields.io/badge/packaging-uv-D7FF64.svg\" alt=\"Packaging\">\n</p>\n\n---\n\n## \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\n\n**`pymax`** \u2014 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f Python \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 Max. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0430\u0442\u0430\u043c\u0438, \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 WebSocket \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.\n\n### \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\n\n- \u0412\u0445\u043e\u0434 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430\n- \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\n- \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0447\u0430\u0442\u0430\u043c\u0438 \u0438 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438\n- \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n> [!IMPORTANT]\n> \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f Python 3.10 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435\n\n### \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 pip\n\n```bash\npip install -U maxapi-python\n```\n\n### \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 uv\n\n```bash\nuv add -U maxapi-python\n```\n\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n### \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\n\n```python\nimport asyncio\nfrom pymax import MaxClient, Message\n\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430\nphone = \"+1234567890\"\nclient = MaxClient(phone=phone, work_dir=\"cache\")\n\n# \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\n@client.on_message\nasync def handle_message(message: Message) -> None:\n print(f\"{message.sender}: {message.text}\")\n\n# \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\n@client.on_start\nasync def handle_start() -> None:\n print(\"\u041a\u043b\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\")\n \n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\n history = await client.fetch_history(chat_id=0)\n if history:\n for message in history:\n user = await client.get_user(message.sender)\n if user:\n print(f\"{user.names[0].name}: {message.text}\")\n\nasync def main() -> None:\n await client.start()\n \n # \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0447\u0430\u0442\u0430\u043c\u0438\n for chat in client.chats:\n print(f\"\u0427\u0430\u0442: {chat.title}\")\n \n # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n message = await client.send_message(\n \"\u041f\u0440\u0438\u0432\u0435\u0442 \u043e\u0442 PyMax!\", \n chat.id, \n notify=True\n )\n \n # \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n await asyncio.sleep(2)\n await client.edit_message(\n chat.id, \n message.id, \n \"\u041f\u0440\u0438\u0432\u0435\u0442 \u043e\u0442 PyMax! (\u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e)\"\n )\n \n # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n await asyncio.sleep(2)\n await client.delete_message(chat.id, [message.id], for_me=False)\n \n # \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u0430\u043c\u0438\n for dialog in client.dialogs:\n print(f\"\u0414\u0438\u0430\u043b\u043e\u0433: {dialog.last_message.text}\")\n \n # \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438\n for channel in client.channels:\n print(f\"\u041a\u0430\u043d\u0430\u043b: {channel.title}\")\n \n await client.close()\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n```\n\n## \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\n\nWIP\n\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\n\n\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 MIT. \u0421\u043c. \u0444\u0430\u0439\u043b [LICENSE](LICENSE) \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.\n\n## \u0410\u0432\u0442\u043e\u0440\u044b\n\n- **[noxzion](https://github.com/noxzion)** \u2014 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n- **[ink](https://github.com/ink-developer)** \u2014 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 API \u0438 \u0435\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\n- **[fresh-milkshake](https://github.com/fresh-milkshake)** \u2014 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440 \u0438 \u0430\u0432\u0442\u043e\u0440 \u043b\u043e\u0433\u043e\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Python wrapper \u0434\u043b\u044f API \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 Max",
"version": "0.1.1",
"project_urls": {
"Homepage": "https://github.com/noxzion/PyMax",
"Issues": "https://github.com/noxzion/PyMax/issues",
"Repository": "https://github.com/noxzion/PyMax"
},
"split_keywords": [
"api",
" max",
" messenger",
" websocket",
" wrapper"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "97c6ed27a1479ccf2aebac3caf9d243c44d7435d307dc26aef99baa01782946b",
"md5": "af9c31f51a8ebdeb010334e9c707a1f6",
"sha256": "e93ef523dee4a9c4132ec9e0f60b7b64491b7616c1a255c1892d2451edfab658"
},
"downloads": -1,
"filename": "maxapi_python-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "af9c31f51a8ebdeb010334e9c707a1f6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 3565,
"upload_time": "2025-09-02T08:32:48",
"upload_time_iso_8601": "2025-09-02T08:32:48.163336Z",
"url": "https://files.pythonhosted.org/packages/97/c6/ed27a1479ccf2aebac3caf9d243c44d7435d307dc26aef99baa01782946b/maxapi_python-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "06e9a39b768c31388c1cd627ae75280f8261731a36d66195f5ee2e1d2755b9b8",
"md5": "313fca7955d1179086be13f699a96a05",
"sha256": "e26434fdd0382fd982174ffe9cdfe4e5a5600e12f86a4b2f3949533784e1e0f4"
},
"downloads": -1,
"filename": "maxapi_python-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "313fca7955d1179086be13f699a96a05",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 24896,
"upload_time": "2025-09-02T08:32:49",
"upload_time_iso_8601": "2025-09-02T08:32:49.266534Z",
"url": "https://files.pythonhosted.org/packages/06/e9/a39b768c31388c1cd627ae75280f8261731a36d66195f5ee2e1d2755b9b8/maxapi_python-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-02 08:32:49",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "noxzion",
"github_project": "PyMax",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "maxapi-python"
}