maxapi-python 2.4.0__tar.gz → 2.5.0__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.
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/PKG-INFO +22 -12
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/README.md +18 -10
- maxapi_python-2.5.0/TODO.md +45 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/account.rst +2 -3
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/auth.rst +2 -0
- maxapi_python-2.5.0/docs/api/client-session.rst +20 -0
- maxapi_python-2.5.0/docs/api/client-versions.rst +12 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/client.rst +2 -0
- maxapi_python-2.5.0/docs/api/router.rst +41 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/auth.rst +24 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/chats.rst +8 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/client.rst +125 -12
- maxapi_python-2.5.0/docs/di.rst +144 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/examples.rst +5 -12
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/faq.rst +7 -3
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/files.rst +27 -7
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/formatting.rst +10 -1
- maxapi_python-2.5.0/docs/fsm.rst +160 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/getting-started.rst +10 -5
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/index.rst +5 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/messages.rst +169 -12
- maxapi_python-2.5.0/docs/release-2-4-1.rst +103 -0
- maxapi_python-2.5.0/docs/release-2-5-0.rst +181 -0
- maxapi_python-2.5.0/docs/router.rst +391 -0
- maxapi_python-2.5.0/docs/stories.rst +203 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/troubleshooting.rst +8 -6
- maxapi_python-2.5.0/docs/types/callback_response.rst +9 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/enums.rst +9 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/index.rst +12 -3
- maxapi_python-2.5.0/docs/types/story.rst +62 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/pyproject.toml +6 -2
- maxapi_python-2.5.0/scripts/todo.py +48 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/__init__.py +8 -2
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/_data/apk_fingerprints.json +374 -17
- maxapi_python-2.5.0/src/pymax/_data/rootca_ssl_rsa2022.crt +33 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/service.py +15 -2
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/types.py +3 -0
- maxapi_python-2.5.0/src/pymax/api/bots/payloads.py +15 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/bots/service.py +13 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/chats/enums.py +1 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/chats/payloads.py +21 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/chats/service.py +41 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/facade.py +2 -0
- maxapi_python-2.5.0/src/pymax/api/messages/__init__.py +1 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/messages/enums.py +1 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/messages/payloads.py +56 -4
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/messages/service.py +405 -27
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/response.py +1 -1
- maxapi_python-2.5.0/src/pymax/api/stories/__init__.py +2 -0
- maxapi_python-2.5.0/src/pymax/api/stories/enums.py +19 -0
- maxapi_python-2.5.0/src/pymax/api/stories/payloads.py +64 -0
- maxapi_python-2.5.0/src/pymax/api/stories/service.py +198 -0
- maxapi_python-2.5.0/src/pymax/api/uploads/payloads.py +72 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/uploads/service.py +171 -69
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/app.py +39 -8
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/__init__.py +2 -0
- maxapi_python-2.5.0/src/pymax/auth/exceptions.py +9 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/providers.py +6 -2
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/qr.py +11 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/sms.py +11 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/base.py +146 -27
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/client.py +39 -11
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/client_web.py +15 -12
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/config.py +101 -53
- maxapi_python-2.5.0/src/pymax/di/__init__.py +2 -0
- maxapi_python-2.5.0/src/pymax/di/context.py +18 -0
- maxapi_python-2.5.0/src/pymax/di/resolver.py +38 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/__init__.py +7 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/dispatcher.py +143 -40
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/enums.py +1 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/mapping.py +23 -3
- maxapi_python-2.5.0/src/pymax/dispatch/middleware.py +32 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/resolvers.py +4 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/router.py +86 -34
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/base.py +58 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/video.py +32 -40
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/voice.py +18 -4
- maxapi_python-2.5.0/src/pymax/filters/__init__.py +15 -0
- maxapi_python-2.5.0/src/pymax/filters/base.py +218 -0
- maxapi_python-2.5.0/src/pymax/filters/containers/__init__.py +2 -0
- maxapi_python-2.5.0/src/pymax/filters/containers/chat.py +240 -0
- maxapi_python-2.5.0/src/pymax/filters/containers/message.py +147 -0
- maxapi_python-2.5.0/src/pymax/filters/filters.py +211 -0
- maxapi_python-2.5.0/src/pymax/filters/magic.py +13 -0
- maxapi_python-2.5.0/src/pymax/filters/presets.py +88 -0
- maxapi_python-2.5.0/src/pymax/filters/refs.py +56 -0
- maxapi_python-2.5.0/src/pymax/fingerprint/fingerprint.py +30 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/fingerprint/models.py +1 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/formatting/markdown.py +55 -1
- maxapi_python-2.5.0/src/pymax/fsm/__init__.py +3 -0
- maxapi_python-2.5.0/src/pymax/fsm/context.py +30 -0
- maxapi_python-2.5.0/src/pymax/fsm/protocol.py +14 -0
- maxapi_python-2.5.0/src/pymax/fsm/state.py +70 -0
- maxapi_python-2.5.0/src/pymax/fsm/storage.py +151 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/base.py +2 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/bots.py +20 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/chat.py +37 -5
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/message.py +204 -9
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/protocol.py +5 -1
- maxapi_python-2.5.0/src/pymax/infra/stories.py +205 -0
- maxapi_python-2.5.0/src/pymax/integrations/dishka.py +109 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/enums.py +2 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/payload.py +0 -2
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/session/__init__.py +1 -1
- maxapi_python-2.5.0/src/pymax/session/models.py +41 -0
- maxapi_python-2.5.0/src/pymax/session/protocol.py +40 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/session/store.py +73 -5
- maxapi_python-2.5.0/src/pymax/transport/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/transport/tcp.py +11 -3
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/__init__.py +23 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/__init__.py +1 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/call.py +7 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/contact.py +3 -3
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/control.py +3 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/enums.py +16 -0
- maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/__init__.py +1 -0
- maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/enums.py +12 -0
- maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/inline.py +90 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/video.py +3 -3
- maxapi_python-2.5.0/src/pymax/types/domain/callback.py +19 -0
- maxapi_python-2.5.0/src/pymax/types/domain/comment.py +24 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/enums.py +7 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/message.py +158 -9
- maxapi_python-2.5.0/src/pymax/types/domain/story.py +126 -0
- maxapi_python-2.5.0/src/pymax/types/events/reaction.py +45 -0
- maxapi_python-2.5.0/src/pymax/versions/__init__.py +2 -0
- maxapi_python-2.5.0/src/pymax/versions/catalog.py +104 -0
- maxapi_python-2.5.0/src/pymax/versions/exceptions.py +10 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/api/test_auth_service.py +8 -19
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/api/test_chat_user_self_session_services.py +10 -2
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/api/test_message_service.py +6 -8
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/api/test_upload_service.py +6 -7
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/app/test_app_runtime.py +129 -2
- maxapi_python-2.5.0/tests/app/test_client_user_agent_config.py +37 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/auth/test_auth_flows.py +4 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/conftest.py +13 -2
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/connection/test_readers_and_transports.py +1 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/dispatch/test_dispatcher.py +33 -7
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/domain/test_bound_models.py +1 -1
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/files/test_files_and_formatting.py +35 -0
- maxapi_python-2.5.0/tests/filters/test_magic.py +145 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/session/test_store.py +65 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/uv.lock +22 -6
- maxapi_python-2.4.0/docs/api/router.rst +0 -16
- maxapi_python-2.4.0/docs/router.rst +0 -247
- maxapi_python-2.4.0/src/pymax/api/bots/payloads.py +0 -7
- maxapi_python-2.4.0/src/pymax/api/messages/__init__.py +0 -1
- maxapi_python-2.4.0/src/pymax/api/uploads/payloads.py +0 -31
- maxapi_python-2.4.0/src/pymax/fingerprint/fingerprint.py +0 -47
- maxapi_python-2.4.0/src/pymax/session/models.py +0 -11
- maxapi_python-2.4.0/src/pymax/session/protocol.py +0 -14
- maxapi_python-2.4.0/src/pymax/types/domain/attachments/keyboards/__init__.py +0 -1
- maxapi_python-2.4.0/src/pymax/types/domain/attachments/keyboards/inline.py +0 -19
- maxapi_python-2.4.0/src/pymax/types/events/reaction.py +0 -21
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/pull_request_template.md +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/workflows/publish.yml +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/workflows/tests.yml +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.gitignore +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.pre-commit-config.yaml +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/LICENSE +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/_static/.gitkeep +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/client-client.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/client-config.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/client-web.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/files.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/conf.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-1-0.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-1-1.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-1-2.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-1-3.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-2-0.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-3-0.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-3-1.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-4-0.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/audio_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/call_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/chat.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/contact_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/contact_info.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/control_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/element.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/file_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/folder.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/folder_list.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/folder_update.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/inline_keyboard_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/message.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/message_delete_event.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/message_read_event.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/name.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/photo_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/poll.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/poll_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/presence_event.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/profile.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/reaction_counter.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/reaction_info.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/reaction_update_event.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/read_state.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/session.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/share_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/sticker_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/sync_overrides.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/sync_state.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/typing_event.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/user.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/video_attachment.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/users.rst +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/enums.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/payloads.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/binding.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/bots/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/chats/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/models.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/self/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/self/enums.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/self/payloads.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/self/service.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/session/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/session/enums.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/session/payloads.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/session/service.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/uploads/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/uploads/models.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/users/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/users/enums.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/users/payloads.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/users/service.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/base.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/email.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/models.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/service.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/connection.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/pending.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/readers/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/readers/base.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/readers/tcp.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/readers/ws.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/exceptions.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/file.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/photo.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/static.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/fingerprint/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/formatting/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/auth.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/self.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/user.py +0 -0
- {maxapi_python-2.4.0/src/pymax/transport → maxapi_python-2.5.0/src/pymax/integrations}/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/logging.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/base.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/models.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/compression.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/framing.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/protocol.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/ws/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/ws/protocol.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/py.typed +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/routers.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/telemetry/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/telemetry/navigation.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/telemetry/payloads.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/telemetry/service.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/transport/base.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/transport/websocket.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/audio.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/file.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/photo.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/poll.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/share.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/sticker.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/unknown.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/auth.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/base.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/bots.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/chat.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/element.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/error.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/folder.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/handshake.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/login.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/member.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/name.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/presence.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/profile.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/session.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/sync.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/user.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/file.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/mark.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/message.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/presence.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/typing.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/video.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/voice.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/__init__.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/connection/test_connection.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/domain/test_login_models.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/domain/test_message_models.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/domain/test_user_models.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/protocol/test_protocols.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/telemetry/test_telemetry.py +0 -0
- {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/test_logging.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: maxapi-python
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.0
|
|
4
4
|
Summary: Python wrapper для API мессенджера Max
|
|
5
5
|
Project-URL: Homepage, https://github.com/MaxApiTeam/PyMax
|
|
6
6
|
Project-URL: Repository, https://github.com/MaxApiTeam/PyMax
|
|
@@ -32,6 +32,8 @@ Requires-Dist: python-socks[asyncio]>=2.8.1
|
|
|
32
32
|
Requires-Dist: qrcode>=8.2
|
|
33
33
|
Requires-Dist: websockets>=16.0
|
|
34
34
|
Requires-Dist: zstandard>=0.25.0
|
|
35
|
+
Provides-Extra: dishka
|
|
36
|
+
Requires-Dist: dishka>=1.10.1; extra == 'dishka'
|
|
35
37
|
Provides-Extra: video
|
|
36
38
|
Requires-Dist: tinytag>=2.2.1; extra == 'video'
|
|
37
39
|
Description-Content-Type: text/markdown
|
|
@@ -43,6 +45,7 @@ Python-библиотека для Max API.
|
|
|
43
45
|
[](https://www.python.org/)
|
|
44
46
|
[](LICENSE)
|
|
45
47
|
[](https://pypi.org/project/maxapi-python/)
|
|
48
|
+
[](https://pepy.tech/projects/maxapi-python)
|
|
46
49
|
|
|
47
50
|
> [!WARNING]
|
|
48
51
|
> PyMax использует неофициальный внутренний API Max. API может измениться без
|
|
@@ -61,11 +64,15 @@ WebSocket.
|
|
|
61
64
|
|
|
62
65
|
- Авторизация по телефону и SMS-коду через `Client`.
|
|
63
66
|
- QR-авторизация web-клиента через `WebClient`.
|
|
64
|
-
- Роутеры, фильтры, `on_start`, raw-события и typed events.
|
|
65
|
-
-
|
|
67
|
+
- Роутеры, составные фильтры, middleware, `on_start`, raw-события и typed events.
|
|
68
|
+
- FSM для диалогов и необязательная интеграция с Dishka.
|
|
69
|
+
- Сообщения: отправка и планирование, ответы, реакции, pin, read, delete и история.
|
|
70
|
+
- Комментарии к постам каналов и нажатия inline-кнопок ботов.
|
|
71
|
+
- Сторис: фото и видео, лента, реакции и статистика просмотров.
|
|
66
72
|
- Чаты, группы, участники, invite-ссылки и настройки групп.
|
|
67
73
|
- Пользователи, контакты, профиль, папки, активные сессии и 2FA.
|
|
68
|
-
- Вложения: `Photo`, `File`, `Video`.
|
|
74
|
+
- Вложения: `Photo`, `File`, `Video`, `Voice`, `VideoNote`.
|
|
75
|
+
- Выбор версии mobile-клиента с локальным или обновляемым каталогом fingerprints.
|
|
69
76
|
- SQLite-сессии, sync-state, reconnect и debug-логи.
|
|
70
77
|
- Pydantic-модели и удобные domain-объекты.
|
|
71
78
|
|
|
@@ -98,6 +105,7 @@ pip install git+https://github.com/MaxApiTeam/PyMax.git
|
|
|
98
105
|
import asyncio
|
|
99
106
|
|
|
100
107
|
from pymax import Client, Message
|
|
108
|
+
from pymax.filters import Command
|
|
101
109
|
|
|
102
110
|
client = Client(
|
|
103
111
|
phone="+79990000000",
|
|
@@ -112,7 +120,7 @@ async def on_start(client: Client) -> None:
|
|
|
112
120
|
print("Ваш ID:", client.me.contact.id if client.me else "unknown")
|
|
113
121
|
|
|
114
122
|
|
|
115
|
-
@client.on_message()
|
|
123
|
+
@client.on_message(Command("start"))
|
|
116
124
|
async def on_message(message: Message, client: Client) -> None:
|
|
117
125
|
print(message.chat_id, message.sender, message.text)
|
|
118
126
|
|
|
@@ -128,6 +136,8 @@ if __name__ == "__main__":
|
|
|
128
136
|
asyncio.run(main())
|
|
129
137
|
```
|
|
130
138
|
|
|
139
|
+
Отправьте `/start`, чтобы вызвать обработчик.
|
|
140
|
+
|
|
131
141
|
## WebClient
|
|
132
142
|
|
|
133
143
|
`WebClient` использует WebSocket и QR-авторизацию:
|
|
@@ -155,15 +165,12 @@ Handler всегда принимает событие и клиента: `(even
|
|
|
155
165
|
|
|
156
166
|
```python
|
|
157
167
|
from pymax import Client, ClientRouter, Message
|
|
168
|
+
from pymax.filters import Command
|
|
158
169
|
|
|
159
170
|
router = ClientRouter()
|
|
160
171
|
|
|
161
172
|
|
|
162
|
-
|
|
163
|
-
return message.text == "/start"
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
@router.on_message(is_start)
|
|
173
|
+
@router.on_message(Command("start"))
|
|
167
174
|
async def start(message: Message, client: Client) -> None:
|
|
168
175
|
await message.answer("Готово")
|
|
169
176
|
|
|
@@ -176,8 +183,11 @@ client.include_router(router)
|
|
|
176
183
|
|
|
177
184
|
- [Getting Started](docs/getting-started.rst) - первый запуск и сессии.
|
|
178
185
|
- [Client](docs/client.rst) - жизненный цикл клиента, reconnect и sync-state.
|
|
179
|
-
- [Router](docs/router.rst) - роутеры,
|
|
186
|
+
- [Router](docs/router.rst) - роутеры, фильтры, middleware и raw events.
|
|
187
|
+
- [FSM](docs/fsm.rst) - состояния и данные диалога.
|
|
188
|
+
- [DI и Dishka](docs/di.rst) - зависимости обработчиков.
|
|
180
189
|
- [Messages](docs/messages.rst) - сообщения, реакции, история и вложения.
|
|
190
|
+
- [Stories](docs/stories.rst) - публикация и чтение сторис.
|
|
181
191
|
- [Files](docs/files.rst) - отправка и скачивание файлов.
|
|
182
192
|
- [FAQ](docs/faq.rst) и [Troubleshooting](docs/troubleshooting.rst) - частые
|
|
183
193
|
проблемы.
|
|
@@ -5,6 +5,7 @@ Python-библиотека для Max API.
|
|
|
5
5
|
[](https://www.python.org/)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](https://pypi.org/project/maxapi-python/)
|
|
8
|
+
[](https://pepy.tech/projects/maxapi-python)
|
|
8
9
|
|
|
9
10
|
> [!WARNING]
|
|
10
11
|
> PyMax использует неофициальный внутренний API Max. API может измениться без
|
|
@@ -23,11 +24,15 @@ WebSocket.
|
|
|
23
24
|
|
|
24
25
|
- Авторизация по телефону и SMS-коду через `Client`.
|
|
25
26
|
- QR-авторизация web-клиента через `WebClient`.
|
|
26
|
-
- Роутеры, фильтры, `on_start`, raw-события и typed events.
|
|
27
|
-
-
|
|
27
|
+
- Роутеры, составные фильтры, middleware, `on_start`, raw-события и typed events.
|
|
28
|
+
- FSM для диалогов и необязательная интеграция с Dishka.
|
|
29
|
+
- Сообщения: отправка и планирование, ответы, реакции, pin, read, delete и история.
|
|
30
|
+
- Комментарии к постам каналов и нажатия inline-кнопок ботов.
|
|
31
|
+
- Сторис: фото и видео, лента, реакции и статистика просмотров.
|
|
28
32
|
- Чаты, группы, участники, invite-ссылки и настройки групп.
|
|
29
33
|
- Пользователи, контакты, профиль, папки, активные сессии и 2FA.
|
|
30
|
-
- Вложения: `Photo`, `File`, `Video`.
|
|
34
|
+
- Вложения: `Photo`, `File`, `Video`, `Voice`, `VideoNote`.
|
|
35
|
+
- Выбор версии mobile-клиента с локальным или обновляемым каталогом fingerprints.
|
|
31
36
|
- SQLite-сессии, sync-state, reconnect и debug-логи.
|
|
32
37
|
- Pydantic-модели и удобные domain-объекты.
|
|
33
38
|
|
|
@@ -60,6 +65,7 @@ pip install git+https://github.com/MaxApiTeam/PyMax.git
|
|
|
60
65
|
import asyncio
|
|
61
66
|
|
|
62
67
|
from pymax import Client, Message
|
|
68
|
+
from pymax.filters import Command
|
|
63
69
|
|
|
64
70
|
client = Client(
|
|
65
71
|
phone="+79990000000",
|
|
@@ -74,7 +80,7 @@ async def on_start(client: Client) -> None:
|
|
|
74
80
|
print("Ваш ID:", client.me.contact.id if client.me else "unknown")
|
|
75
81
|
|
|
76
82
|
|
|
77
|
-
@client.on_message()
|
|
83
|
+
@client.on_message(Command("start"))
|
|
78
84
|
async def on_message(message: Message, client: Client) -> None:
|
|
79
85
|
print(message.chat_id, message.sender, message.text)
|
|
80
86
|
|
|
@@ -90,6 +96,8 @@ if __name__ == "__main__":
|
|
|
90
96
|
asyncio.run(main())
|
|
91
97
|
```
|
|
92
98
|
|
|
99
|
+
Отправьте `/start`, чтобы вызвать обработчик.
|
|
100
|
+
|
|
93
101
|
## WebClient
|
|
94
102
|
|
|
95
103
|
`WebClient` использует WebSocket и QR-авторизацию:
|
|
@@ -117,15 +125,12 @@ Handler всегда принимает событие и клиента: `(even
|
|
|
117
125
|
|
|
118
126
|
```python
|
|
119
127
|
from pymax import Client, ClientRouter, Message
|
|
128
|
+
from pymax.filters import Command
|
|
120
129
|
|
|
121
130
|
router = ClientRouter()
|
|
122
131
|
|
|
123
132
|
|
|
124
|
-
|
|
125
|
-
return message.text == "/start"
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
@router.on_message(is_start)
|
|
133
|
+
@router.on_message(Command("start"))
|
|
129
134
|
async def start(message: Message, client: Client) -> None:
|
|
130
135
|
await message.answer("Готово")
|
|
131
136
|
|
|
@@ -138,8 +143,11 @@ client.include_router(router)
|
|
|
138
143
|
|
|
139
144
|
- [Getting Started](docs/getting-started.rst) - первый запуск и сессии.
|
|
140
145
|
- [Client](docs/client.rst) - жизненный цикл клиента, reconnect и sync-state.
|
|
141
|
-
- [Router](docs/router.rst) - роутеры,
|
|
146
|
+
- [Router](docs/router.rst) - роутеры, фильтры, middleware и raw events.
|
|
147
|
+
- [FSM](docs/fsm.rst) - состояния и данные диалога.
|
|
148
|
+
- [DI и Dishka](docs/di.rst) - зависимости обработчиков.
|
|
142
149
|
- [Messages](docs/messages.rst) - сообщения, реакции, история и вложения.
|
|
150
|
+
- [Stories](docs/stories.rst) - публикация и чтение сторис.
|
|
143
151
|
- [Files](docs/files.rst) - отправка и скачивание файлов.
|
|
144
152
|
- [FAQ](docs/faq.rst) и [Troubleshooting](docs/troubleshooting.rst) - частые
|
|
145
153
|
проблемы.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# PyMax TODO :3
|
|
2
|
+
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> This file is maintained by the project owner. Please do not edit it in pull requests.
|
|
5
|
+
|
|
6
|
+
Format:
|
|
7
|
+
- Refactoring / Bugs: `TEXT. PATH. PRIORITY`
|
|
8
|
+
- Features: `TEXT. TARGET. PRIORITY`
|
|
9
|
+
|
|
10
|
+
## Refactoring
|
|
11
|
+
|
|
12
|
+
- [ ] Перевести все аргументы, связанные со временем, на `DateTimeUnion`. `api/messages/service.py:65`. P: 50
|
|
13
|
+
- [ ] Перенести часть общих типов в `common`, например `SendAttachments`. -. P: 40
|
|
14
|
+
- [ ] Пересмотреть систему типов, возможно разбить её на более мелкие части. -. P: 70
|
|
15
|
+
|
|
16
|
+
## Bugs
|
|
17
|
+
|
|
18
|
+
- [X] Исправить голосовые/кружки. `api/upload/service.py`. P: 100
|
|
19
|
+
- [X] Исправить генерацию device_id. `src/pymax/base.py:111`. P: 80
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
- [ ] FSM. Почти готово. `2.5.0`. P: 80
|
|
24
|
+
- [ ] DI. `2.5.0`. P: 75
|
|
25
|
+
- [ ] Улучшенная система фильтров. Почти готово. `2.5.0`. P: 90
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# Autogenerated TODO. Please, dont touch it
|
|
29
|
+
- [ ] src/pymax/api/chats/payloads.py:100: ENUMM!!!
|
|
30
|
+
- [ ] src/pymax/api/chats/payloads.py:123: ENUMM!!!
|
|
31
|
+
- [ ] src/pymax/api/messages/payloads.py:40: enum?
|
|
32
|
+
- [ ] src/pymax/api/messages/service.py:137: TypeAlias
|
|
33
|
+
- [ ] src/pymax/api/uploads/service.py:68: ENUM!!!!
|
|
34
|
+
- [ ] src/pymax/api/uploads/service.py:85: enum maybe?
|
|
35
|
+
- [ ] src/pymax/api/uploads/service.py:291: Error handing (yes, with 200 status 💔)
|
|
36
|
+
- [ ] src/pymax/api/users/service.py:133: maybe also return phone mapping?
|
|
37
|
+
- [ ] src/pymax/config.py:52: delete maybe
|
|
38
|
+
- [ ] src/pymax/dispatch/dispatcher.py:79: make better comparison or just remove it
|
|
39
|
+
- [ ] src/pymax/dispatch/dispatcher.py:204: create iter_on_start_handlers
|
|
40
|
+
- [ ] src/pymax/protocol/tcp/payload.py:34: deprecate? idk
|
|
41
|
+
- [ ] src/pymax/transport/websocket.py:28: origin should be configurable
|
|
42
|
+
- [ ] src/pymax/types/domain/attachments/video.py:70: idk maybe | None = None better
|
|
43
|
+
- [ ] src/pymax/types/domain/user.py:14: move to another file
|
|
44
|
+
- [ ] src/pymax/types/events/message.py:49: impl it in the better way maybe
|
|
45
|
+
- [ ] src/pymax/versions/catalog.py:88: msg
|
|
@@ -129,9 +129,8 @@ login или ping:
|
|
|
129
129
|
-------------
|
|
130
130
|
|
|
131
131
|
``client.me`` равен ``None``
|
|
132
|
-
Login еще не
|
|
133
|
-
|
|
134
|
-
lifecycle.
|
|
132
|
+
Login еще не завершился. Читайте профиль внутри ``on_start`` или после
|
|
133
|
+
успешного ``await client.connect()``.
|
|
135
134
|
|
|
136
135
|
Фото профиля не обновилось
|
|
137
136
|
Если переданы и ``photo``, и ``photo_token``, PyMax загрузит ``photo`` и
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Session storage
|
|
2
|
+
===============
|
|
3
|
+
|
|
4
|
+
.. currentmodule:: pymax.session
|
|
5
|
+
|
|
6
|
+
``Client`` и ``WebClient`` используют этот контракт для token,
|
|
7
|
+
device/user-agent и sync-state. Выбор и lifecycle хранилища описаны в разделе
|
|
8
|
+
:ref:`client-session-guide`.
|
|
9
|
+
|
|
10
|
+
.. autoclass:: SessionInfo
|
|
11
|
+
:members:
|
|
12
|
+
|
|
13
|
+
.. autoclass:: StoreProtocol
|
|
14
|
+
:members:
|
|
15
|
+
|
|
16
|
+
.. autoclass:: SessionStore
|
|
17
|
+
:members:
|
|
18
|
+
|
|
19
|
+
.. autoclass:: InMemoryStore
|
|
20
|
+
:members:
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Version Catalog
|
|
2
|
+
===============
|
|
3
|
+
|
|
4
|
+
.. currentmodule:: pymax.versions
|
|
5
|
+
|
|
6
|
+
``VersionCatalog`` связывает версию Android-клиента с build number и
|
|
7
|
+
fingerprint, которые использует ``Client``.
|
|
8
|
+
|
|
9
|
+
.. autoclass:: VersionCatalog
|
|
10
|
+
:members:
|
|
11
|
+
|
|
12
|
+
.. autoclass:: VersionNotFoundError
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
Router API
|
|
2
|
+
==========
|
|
3
|
+
|
|
4
|
+
.. autoclass:: pymax.Router
|
|
5
|
+
:members:
|
|
6
|
+
:show-inheritance:
|
|
7
|
+
|
|
8
|
+
.. autoclass:: pymax.dispatch.ErrorScope
|
|
9
|
+
:members:
|
|
10
|
+
|
|
11
|
+
.. autoclass:: pymax.dispatch.ErrorContext
|
|
12
|
+
:members:
|
|
13
|
+
|
|
14
|
+
.. autodata:: pymax.ClientRouter
|
|
15
|
+
|
|
16
|
+
.. autodata:: pymax.WebRouter
|
|
17
|
+
|
|
18
|
+
Фильтры
|
|
19
|
+
-------
|
|
20
|
+
|
|
21
|
+
Примеры регистрации и объединения фильтров приведены в :doc:`/router`.
|
|
22
|
+
|
|
23
|
+
.. autoclass:: pymax.filters.Filter
|
|
24
|
+
:exclude-members: resolve_filter_result
|
|
25
|
+
|
|
26
|
+
.. autoclass:: pymax.filters.Command
|
|
27
|
+
|
|
28
|
+
.. autoclass:: pymax.filters.Reply
|
|
29
|
+
|
|
30
|
+
.. autoclass:: pymax.filters.Forwarded
|
|
31
|
+
|
|
32
|
+
.. autoclass:: pymax.filters.FromMe
|
|
33
|
+
|
|
34
|
+
.. autoclass:: pymax.filters.HasAttachment
|
|
35
|
+
|
|
36
|
+
Middleware
|
|
37
|
+
----------
|
|
38
|
+
|
|
39
|
+
.. autoclass:: pymax.dispatch.Middleware
|
|
40
|
+
|
|
41
|
+
.. autodata:: pymax.dispatch.MiddlewareNext
|
|
@@ -88,6 +88,30 @@ Provider нужен, когда код приходит не из консоли
|
|
|
88
88
|
Если provider вернет пустую строку или Max отклонит пароль, ``SmsAuthFlow``
|
|
89
89
|
попросит пароль снова.
|
|
90
90
|
|
|
91
|
+
Количество попыток можно ограничить через ``ExtraConfig``:
|
|
92
|
+
|
|
93
|
+
.. code-block:: python
|
|
94
|
+
|
|
95
|
+
from pymax import Client, ExtraConfig, PasswordAttemptsExceededError
|
|
96
|
+
|
|
97
|
+
client = Client(
|
|
98
|
+
phone="+79990000000",
|
|
99
|
+
password_provider=EnvPasswordProvider(),
|
|
100
|
+
extra_config=ExtraConfig(password_max_attempts=3),
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
await client.connect()
|
|
105
|
+
except PasswordAttemptsExceededError:
|
|
106
|
+
print("Пароль 2FA не принят")
|
|
107
|
+
|
|
108
|
+
``password_max_attempts=None`` означает неограниченное число попыток и
|
|
109
|
+
сохраняет прежнее поведение. Пустой пароль, ``ApiError``, ошибка в ответе Max
|
|
110
|
+
и ответ без login token расходуют одну попытку. При ``0`` или отрицательном
|
|
111
|
+
значении provider не вызывается, а ``PasswordAttemptsExceededError``
|
|
112
|
+
возникает сразу. Исключение наследуется напрямую от ``Exception``, поэтому
|
|
113
|
+
его нужно перехватывать отдельно от ``PyMaxError``.
|
|
114
|
+
|
|
91
115
|
Кастомный QR handler
|
|
92
116
|
--------------------
|
|
93
117
|
|
|
@@ -129,10 +129,13 @@ login/sync, а также методы для загрузки, создания
|
|
|
129
129
|
|
|
130
130
|
.. code-block:: python
|
|
131
131
|
|
|
132
|
+
from pymax import Photo
|
|
133
|
+
|
|
132
134
|
await client.change_group_profile(
|
|
133
135
|
chat_id=123456,
|
|
134
136
|
name="Новый заголовок",
|
|
135
137
|
description="Описание группы",
|
|
138
|
+
photo=Photo(path="group.jpg"),
|
|
136
139
|
)
|
|
137
140
|
|
|
138
141
|
await client.change_group_settings(
|
|
@@ -141,6 +144,11 @@ login/sync, а также методы для загрузки, создания
|
|
|
141
144
|
only_admin_can_call=True,
|
|
142
145
|
)
|
|
143
146
|
|
|
147
|
+
``name``, ``description`` и ``photo`` независимы: передавайте только поля,
|
|
148
|
+
которые нужно изменить. Значение ``None`` исключает поле из запроса. Перед
|
|
149
|
+
обновлением профиля PyMax автоматически загружает ``Photo`` и отправляет Max
|
|
150
|
+
полученный photo token.
|
|
151
|
+
|
|
144
152
|
Через объект ``Chat`` можно менять настройки и перевыпускать invite-ссылку:
|
|
145
153
|
|
|
146
154
|
.. code-block:: python
|
|
@@ -7,9 +7,9 @@ Client
|
|
|
7
7
|
``Client`` и ``WebClient`` - главные объекты библиотеки. Они держат соединение,
|
|
8
8
|
авторизацию, локальную сессию, кеш профиля/чатов и методы для API Max.
|
|
9
9
|
|
|
10
|
-
``Client`` не является обычным HTTP-wrapper-ом на один запрос. После
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
``Client`` не является обычным HTTP-wrapper-ом на один запрос. После запуска
|
|
11
|
+
он остается подключенным, слушает события Max, отвечает на ping и вызывает
|
|
12
|
+
ваши handler-ы.
|
|
13
13
|
|
|
14
14
|
Как выбрать клиента
|
|
15
15
|
-------------------
|
|
@@ -27,12 +27,32 @@ Client
|
|
|
27
27
|
|
|
28
28
|
1. Вы создаете ``Client`` или ``WebClient``.
|
|
29
29
|
2. Регистрируете handler-ы и подключаете роутеры.
|
|
30
|
-
3. Вызываете ``await client.start()``.
|
|
30
|
+
3. Вызываете ``await client.start()`` или ``await client.connect()``.
|
|
31
31
|
4. PyMax открывает соединение, делает handshake и login.
|
|
32
32
|
5. После login доступны ``client.me`` и ``client.chats``.
|
|
33
33
|
6. Вызывается ``on_start``.
|
|
34
34
|
7. Клиент слушает события до закрытия соединения или отмены задачи.
|
|
35
35
|
|
|
36
|
+
``start()`` - long-running режим с автоматическим reconnect. Метод не
|
|
37
|
+
возвращается, пока соединение не закрыто штатно или задача не отменена.
|
|
38
|
+
|
|
39
|
+
``connect()`` выполняет один цикл подключения и login, запускает
|
|
40
|
+
``on_start``-обработчики и возвращается, оставляя соединение открытым.
|
|
41
|
+
Обработчики выполняются в отдельных задачах: возврат из ``connect()`` не
|
|
42
|
+
означает, что они уже завершились. Приложение само выполняет работу и затем
|
|
43
|
+
вызывает ``stop()`` или ``close()``; reconnect loop этот метод не запускает.
|
|
44
|
+
|
|
45
|
+
.. code-block:: python
|
|
46
|
+
|
|
47
|
+
await client.connect()
|
|
48
|
+
try:
|
|
49
|
+
await client.send_message(chat_id=123456, text="Готово")
|
|
50
|
+
finally:
|
|
51
|
+
await client.close()
|
|
52
|
+
|
|
53
|
+
После успешного запуска состояние соединения доступно через
|
|
54
|
+
``client.is_connected``.
|
|
55
|
+
|
|
36
56
|
Если ``start()`` запущен отдельной задачей, ``stop()`` штатно закрывает
|
|
37
57
|
соединение и завершает эту задачу без ``CancelledError``:
|
|
38
58
|
|
|
@@ -51,7 +71,7 @@ Client
|
|
|
51
71
|
После успешного login клиент хранит несколько кешей, которые пришли от Max:
|
|
52
72
|
|
|
53
73
|
``client.me``
|
|
54
|
-
Профиль текущего
|
|
74
|
+
Профиль текущего аккаунта.
|
|
55
75
|
|
|
56
76
|
``client.chats``
|
|
57
77
|
Чаты из login/sync. Это не гарантированно полный список всех чатов.
|
|
@@ -106,7 +126,46 @@ Client
|
|
|
106
126
|
Имя файла сессии внутри ``work_dir``.
|
|
107
127
|
|
|
108
128
|
``extra_config``
|
|
109
|
-
Настройки соединения, логов, reconnect, token,
|
|
129
|
+
Настройки соединения, логов, reconnect, token, хранения сессии,
|
|
130
|
+
device/user-agent и sync.
|
|
131
|
+
|
|
132
|
+
``app_version``
|
|
133
|
+
Версия Android-клиента, которую ``Client`` использует для user-agent и
|
|
134
|
+
fingerprint. По умолчанию - версия, возвращаемая
|
|
135
|
+
``VersionCatalog.recommended()``.
|
|
136
|
+
|
|
137
|
+
``catalog``
|
|
138
|
+
Каталог fingerprints для ``app_version``. По умолчанию используется
|
|
139
|
+
встроенный каталог.
|
|
140
|
+
|
|
141
|
+
Версия mobile-клиента
|
|
142
|
+
---------------------
|
|
143
|
+
|
|
144
|
+
``Client`` связывает выбранную ``app_version`` с соответствующими build number
|
|
145
|
+
и fingerprint. Разрешение версии происходит при ``connect()`` или ``start()``,
|
|
146
|
+
а не при создании объекта клиента.
|
|
147
|
+
|
|
148
|
+
.. code-block:: python
|
|
149
|
+
|
|
150
|
+
from pymax import Client
|
|
151
|
+
from pymax.versions import VersionCatalog
|
|
152
|
+
|
|
153
|
+
client = Client(
|
|
154
|
+
phone="+79990000000",
|
|
155
|
+
app_version="26.28.0",
|
|
156
|
+
catalog=VersionCatalog(remote=True),
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
Обычный ``VersionCatalog()`` использует только данные, поставляемые вместе с
|
|
160
|
+
PyMax. При ``remote=True`` метод ``load()`` загружает свежий каталог с
|
|
161
|
+
``hashes.pymax.org`` и добавляет его записи поверх встроенных. Сетевые,
|
|
162
|
+
HTTP- и validation-ошибки удаленного каталога не скрываются и возникают во
|
|
163
|
+
время ``connect()``/``start()``.
|
|
164
|
+
|
|
165
|
+
Если выбранной версии нет в итоговом каталоге, PyMax выбрасывает
|
|
166
|
+
``VersionNotFoundError``. Пользовательский ``ExtraConfig.user_agent`` не
|
|
167
|
+
отменяет проверку ``app_version``: fingerprint для версии всё равно должен
|
|
168
|
+
существовать.
|
|
110
169
|
|
|
111
170
|
Тип устройства
|
|
112
171
|
---------------
|
|
@@ -209,6 +268,8 @@ Client
|
|
|
209
268
|
qr_provider=ConfirmQrWithClient(mobile_client),
|
|
210
269
|
)
|
|
211
270
|
|
|
271
|
+
.. _client-session-guide:
|
|
272
|
+
|
|
212
273
|
Сессия и sync-state
|
|
213
274
|
-------------------
|
|
214
275
|
|
|
@@ -218,6 +279,7 @@ Client
|
|
|
218
279
|
* ``device_id``;
|
|
219
280
|
* телефон;
|
|
220
281
|
* ``mt_instance_id``;
|
|
282
|
+
* device/user-agent;
|
|
221
283
|
* sync-маркеры ``chats_sync``, ``contacts_sync``, ``drafts_sync``,
|
|
222
284
|
``presence_sync`` и ``config_hash``.
|
|
223
285
|
|
|
@@ -225,11 +287,49 @@ Client
|
|
|
225
287
|
``session_name="account.db"`` это будет ``cache/account.db``. Если файл удалить,
|
|
226
288
|
PyMax потеряет token и попросит авторизацию снова.
|
|
227
289
|
|
|
290
|
+
Для автоматически создаваемого user-agent PyMax восстанавливает из сессии
|
|
291
|
+
модель устройства, версию ОС, экран, locale и timezone. ``app_version`` и build
|
|
292
|
+
number всегда берутся из конфигурации текущего запуска, поэтому смена версии
|
|
293
|
+
клиента не сбрасывает сохраненный профиль устройства. Явный
|
|
294
|
+
``ExtraConfig.user_agent`` имеет приоритет и заменяет значение из сессии.
|
|
295
|
+
|
|
296
|
+
Старый SQLite-файл обновляется автоматически: PyMax добавляет nullable-колонку
|
|
297
|
+
``user_agent`` и при первом успешном login сохраняет в нее текущий payload.
|
|
298
|
+
|
|
228
299
|
При login PyMax отправляет сохраненные маркеры серверу. Если маркер актуален,
|
|
229
300
|
сервер может вернуть только изменения. Поэтому повторный запуск отличается от
|
|
230
301
|
первого: первый запуск обычно использует ``-1`` и получает начальный sync,
|
|
231
302
|
а последующие запуски продолжают с сохраненного состояния.
|
|
232
303
|
|
|
304
|
+
Пользовательский ``StoreProtocol`` может возвращать
|
|
305
|
+
``SessionInfo.user_agent=None`` для совместимости, но тогда профиль устройства
|
|
306
|
+
не сохраняется между запусками. Чтобы получить стандартное поведение, храните и
|
|
307
|
+
возвращайте это необязательное поле вместе с остальными данными сессии.
|
|
308
|
+
|
|
309
|
+
Сессия только в памяти
|
|
310
|
+
----------------------
|
|
311
|
+
|
|
312
|
+
Чтобы не создавать и не обновлять SQLite-файл, передайте
|
|
313
|
+
``persist_session=False``:
|
|
314
|
+
|
|
315
|
+
.. code-block:: python
|
|
316
|
+
|
|
317
|
+
from pymax import Client, ExtraConfig
|
|
318
|
+
|
|
319
|
+
client = Client(
|
|
320
|
+
phone="+79990000000",
|
|
321
|
+
extra_config=ExtraConfig(
|
|
322
|
+
persist_session=False,
|
|
323
|
+
reconnect=False,
|
|
324
|
+
),
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
В этом режиме PyMax использует отдельный ``InMemoryStore``. Переданный
|
|
328
|
+
``ExtraConfig.store`` игнорируется. Сессия доступна только текущему runtime и
|
|
329
|
+
теряется при его пересоздании; reconnect без ``ExtraConfig.token`` поэтому снова
|
|
330
|
+
запускает SMS- или QR-авторизацию. Если автоматический reconnect в таком режиме
|
|
331
|
+
не нужен, отключите его как в примере.
|
|
332
|
+
|
|
233
333
|
Принудительный sync
|
|
234
334
|
-------------------
|
|
235
335
|
|
|
@@ -262,7 +362,7 @@ PyMax потеряет token и попросит авторизацию снов
|
|
|
262
362
|
|
|
263
363
|
await client.relogin()
|
|
264
364
|
|
|
265
|
-
``relogin()`` удаляет загруженную
|
|
365
|
+
``relogin()`` удаляет загруженную локальную сессию, закрывает соединение и
|
|
266
366
|
по умолчанию сразу запускает клиента снова. Если token был передан через
|
|
267
367
|
``ExtraConfig(token=...)``, он тоже сбрасывается; это можно отключить через
|
|
268
368
|
``drop_config_token=False``.
|
|
@@ -271,12 +371,17 @@ Reconnect
|
|
|
271
371
|
---------
|
|
272
372
|
|
|
273
373
|
По умолчанию reconnect включен. Если соединение падает из-за сетевой ошибки,
|
|
274
|
-
|
|
275
|
-
|
|
374
|
+
``start()`` закрывает соединение, ждет ``reconnect_delay`` секунд и повторяет
|
|
375
|
+
подключение с login.
|
|
376
|
+
|
|
377
|
+
Регистрации обработчиков и middleware, а также данные FSM в памяти
|
|
378
|
+
сохраняются при reconnect того же клиента. ``on_start`` вызывается после
|
|
379
|
+
каждого успешного подключения. Завершение процесса очищает FSM в памяти.
|
|
276
380
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
381
|
+
Если сервер отозвал login token, ``ExtraConfig(relogin=True)`` по умолчанию
|
|
382
|
+
сбрасывает текущую сессию и запускает авторизацию заново. Значение ``False``
|
|
383
|
+
отключает этот автоматический сброс. Если новый token тоже отклонен, ошибка
|
|
384
|
+
передается вызывающему коду без повторного автоматического запроса авторизации.
|
|
280
385
|
|
|
281
386
|
Перед повторным подключением можно зарегистрировать ``on_disconnect``:
|
|
282
387
|
|
|
@@ -325,6 +430,14 @@ Debug-логи показывают handshake, login, входящие собы
|
|
|
325
430
|
``delete_message()``, ``pin_message()``, ``read_message()``, реакции и
|
|
326
431
|
получение URL для входящих файлов/видео.
|
|
327
432
|
|
|
433
|
+
Комментарии
|
|
434
|
+
``send_comment()``, ``fetch_comments()``, редактирование, удаление,
|
|
435
|
+
реакции и подписка на ветку поста. Подробнее: :doc:`messages`.
|
|
436
|
+
|
|
437
|
+
Сторис
|
|
438
|
+
``send_story()``, ``get_stories_feed()``, ``get_stories()``, просмотр,
|
|
439
|
+
реакции и подробная статистика. Подробнее: :doc:`stories`.
|
|
440
|
+
|
|
328
441
|
Чаты
|
|
329
442
|
``get_chat()``, ``fetch_chats()``, создание групп, invite-ссылки,
|
|
330
443
|
участники, назначение администраторов, настройки групп, удаление чатов и
|