marzban 0.3.3__tar.gz → 0.4.1__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.
- {marzban-0.3.3 → marzban-0.4.1}/PKG-INFO +18 -2
- {marzban-0.3.3 → marzban-0.4.1}/README.md +5 -0
- {marzban-0.3.3 → marzban-0.4.1}/marzban/__init__.py +5 -3
- {marzban-0.3.3 → marzban-0.4.1}/marzban/api.py +40 -3
- {marzban-0.3.3 → marzban-0.4.1}/marzban/models.py +23 -7
- {marzban-0.3.3 → marzban-0.4.1}/marzban.egg-info/PKG-INFO +18 -2
- {marzban-0.3.3 → marzban-0.4.1}/marzban.egg-info/requires.txt +1 -0
- {marzban-0.3.3 → marzban-0.4.1}/setup.py +3 -2
- {marzban-0.3.3 → marzban-0.4.1}/LICENSE +0 -0
- {marzban-0.3.3 → marzban-0.4.1}/marzban.egg-info/SOURCES.txt +0 -0
- {marzban-0.3.3 → marzban-0.4.1}/marzban.egg-info/dependency_links.txt +0 -0
- {marzban-0.3.3 → marzban-0.4.1}/marzban.egg-info/top_level.txt +0 -0
- {marzban-0.3.3 → marzban-0.4.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: marzban
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.4.1
|
4
4
|
Summary: Асинхронная библиотека Python для взаимодействия с MarzbanAPI | Поддерживает работу через HTTPS/SSH
|
5
5
|
Home-page: https://github.com/sm1ky/marzban_api
|
6
6
|
Author: Artem
|
@@ -20,6 +20,17 @@ Requires-Dist: httpx>=0.23.0
|
|
20
20
|
Requires-Dist: pydantic>=1.10.0
|
21
21
|
Requires-Dist: paramiko>=3.5.0
|
22
22
|
Requires-Dist: sshtunnel>=0.4.0
|
23
|
+
Requires-Dist: datetime>=5.5
|
24
|
+
Dynamic: author
|
25
|
+
Dynamic: author-email
|
26
|
+
Dynamic: classifier
|
27
|
+
Dynamic: description
|
28
|
+
Dynamic: description-content-type
|
29
|
+
Dynamic: home-page
|
30
|
+
Dynamic: project-url
|
31
|
+
Dynamic: requires-dist
|
32
|
+
Dynamic: requires-python
|
33
|
+
Dynamic: summary
|
23
34
|
|
24
35
|
|
25
36
|
# MarzbanAPI Client
|
@@ -30,8 +41,13 @@ Requires-Dist: sshtunnel>=0.4.0
|
|
30
41
|
[](https://pypi.python.org/pypi/marzban)
|
31
42
|
[](https://pypi.python.org/pypi/marzban)
|
32
43
|
[](https://pypi.python.org/pypi/marzban)
|
44
|
+
[](https://github.com/Gozargah/Marzban)
|
45
|
+
|
33
46
|
|
34
47
|
**MarzbanAPI Client** is an asynchronous Python library designed for interacting with [Marzban](https://github.com/Gozargah/Marzban). It provides comprehensive methods for managing administrators, users, nodes, and system statistics.
|
48
|
+
It supports **Marzban version 0.8.0**, providing comprehensive methods for managing administrators, users, nodes, and system statistics.
|
49
|
+
|
50
|
+
To see the list of supported Marzban versions and corresponding API compatibility, check out our [Supported Versions](https://github.com/sm1ky/marzban_api/blob/production/.readme/supported_version.md) file.
|
35
51
|
|
36
52
|
## Installation
|
37
53
|
|
@@ -7,8 +7,13 @@
|
|
7
7
|
[](https://pypi.python.org/pypi/marzban)
|
8
8
|
[](https://pypi.python.org/pypi/marzban)
|
9
9
|
[](https://pypi.python.org/pypi/marzban)
|
10
|
+
[](https://github.com/Gozargah/Marzban)
|
11
|
+
|
10
12
|
|
11
13
|
**MarzbanAPI Client** is an asynchronous Python library designed for interacting with [Marzban](https://github.com/Gozargah/Marzban). It provides comprehensive methods for managing administrators, users, nodes, and system statistics.
|
14
|
+
It supports **Marzban version 0.8.0**, providing comprehensive methods for managing administrators, users, nodes, and system statistics.
|
15
|
+
|
16
|
+
To see the list of supported Marzban versions and corresponding API compatibility, check out our [Supported Versions](https://github.com/sm1ky/marzban_api/blob/production/.readme/supported_version.md) file.
|
12
17
|
|
13
18
|
## Installation
|
14
19
|
|
@@ -27,7 +27,8 @@ from .models import (
|
|
27
27
|
HTTPValidationError,
|
28
28
|
ValidationError,
|
29
29
|
SubscriptionUserResponse,
|
30
|
-
SystemStats
|
30
|
+
SystemStats,
|
31
|
+
NextPlanModel
|
31
32
|
)
|
32
33
|
|
33
34
|
__all__ = (
|
@@ -60,7 +61,8 @@ __all__ = (
|
|
60
61
|
"HTTPValidationError",
|
61
62
|
"ValidationError",
|
62
63
|
"SubscriptionUserResponse",
|
63
|
-
"SystemStats"
|
64
|
+
"SystemStats",
|
65
|
+
"NextPlanModel"
|
64
66
|
)
|
65
67
|
|
66
|
-
__version__ = "0.
|
68
|
+
__version__ = "0.4.1"
|
@@ -2,10 +2,9 @@ import httpx
|
|
2
2
|
import paramiko
|
3
3
|
from paramiko.ssh_exception import SSHException
|
4
4
|
from sshtunnel import SSHTunnelForwarder
|
5
|
-
|
5
|
+
from datetime import datetime
|
6
6
|
from .models import *
|
7
|
-
|
8
|
-
|
7
|
+
from typing import Optional
|
9
8
|
class MarzbanAPI:
|
10
9
|
def __init__(self,
|
11
10
|
base_url: str, *,
|
@@ -166,6 +165,24 @@ class MarzbanAPI:
|
|
166
165
|
response = await self._request("GET", url, token, params=params)
|
167
166
|
return [Admin(**admin) for admin in response.json()]
|
168
167
|
|
168
|
+
async def disable_all_users_admin(self, username: str, token: str) -> None:
|
169
|
+
url = f"/api/admin/{username}/users/disable"
|
170
|
+
await self._request("POST", url, token)
|
171
|
+
|
172
|
+
async def activate_all_users_admin(self, username: str, token: str) -> None:
|
173
|
+
url = f"/api/admin/{username}/users/activate"
|
174
|
+
await self._request("POST", url, token)
|
175
|
+
|
176
|
+
async def reset_admin_usage(self, username: str, token: str) -> Admin:
|
177
|
+
url = f"/api/admin/usage/reset/{username}"
|
178
|
+
response = await self._request("POST", url, token)
|
179
|
+
return Admin(**response.json())
|
180
|
+
|
181
|
+
async def get_admin_usage(self, username: str, token: str) -> Admin:
|
182
|
+
url = f"/api/admin/usage/{username}"
|
183
|
+
response = await self._request("GET", url, token)
|
184
|
+
return response.json()
|
185
|
+
|
169
186
|
async def get_system_stats(self, token: str) -> SystemStats:
|
170
187
|
url = "/api/system"
|
171
188
|
response = await self._request("GET", url, token)
|
@@ -219,6 +236,11 @@ class MarzbanAPI:
|
|
219
236
|
url = f"/api/user/{username}"
|
220
237
|
response = await self._request("PUT", url, token, data=user)
|
221
238
|
return UserResponse(**response.json())
|
239
|
+
|
240
|
+
async def activate_next_plan(self, username: str, token: str) -> UserResponse:
|
241
|
+
url = f"/api/user/{username}/active-next"
|
242
|
+
response = await self._request("POST", url, token)
|
243
|
+
return UserResponse(**response.json())
|
222
244
|
|
223
245
|
async def remove_user(self, username: str, token: str) -> None:
|
224
246
|
url = f"/api/user/{username}"
|
@@ -245,6 +267,21 @@ class MarzbanAPI:
|
|
245
267
|
async def reset_users_data_usage(self, token: str) -> None:
|
246
268
|
url = "/api/users/reset"
|
247
269
|
await self._request("POST", url, token)
|
270
|
+
|
271
|
+
async def get_user_data_usage(self, username: str, token: str, start_date: Optional[datetime] = None, end_date: Optional[datetime] = None) -> UserUsagesResponse:
|
272
|
+
if isinstance(start_date, str):
|
273
|
+
start_date = datetime.fromisoformat(start_date)
|
274
|
+
if isinstance(end_date, str):
|
275
|
+
end_date = datetime.fromisoformat(end_date)
|
276
|
+
|
277
|
+
params = {
|
278
|
+
"start": start_date.isoformat(timespec="seconds") if start_date else None,
|
279
|
+
"end": end_date.isoformat(timespec="seconds") if end_date else None
|
280
|
+
}
|
281
|
+
params = {k: v for k, v in params.items() if v is not None}
|
282
|
+
url = f"/api/user/{username}/usage"
|
283
|
+
response = await self._request("GET", url, token, params=params)
|
284
|
+
return UserUsagesResponse(**response.json())
|
248
285
|
|
249
286
|
async def set_owner(self, username: str, admin_username: str, token: str) -> UserResponse:
|
250
287
|
url = f"/api/user/{username}/set-owner?admin_username={admin_username}"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
from pydantic import BaseModel, field_validator, ValidationInfo, AfterValidator, ValidationError
|
2
|
-
from typing import Optional, List, Dict, Any, ClassVar, Annotated
|
2
|
+
from typing import Optional, List, Dict, Any, ClassVar, Annotated, Literal
|
3
3
|
|
4
4
|
|
5
5
|
class Token(BaseModel):
|
@@ -12,6 +12,7 @@ class Admin(BaseModel):
|
|
12
12
|
is_sudo: bool
|
13
13
|
telegram_id: Optional[int] = None
|
14
14
|
discord_webhook: Optional[str] = None
|
15
|
+
users_usage: Optional[int] = None
|
15
16
|
|
16
17
|
|
17
18
|
class AdminCreate(Admin):
|
@@ -23,6 +24,7 @@ class AdminModify(BaseModel):
|
|
23
24
|
password: Optional[str] = None
|
24
25
|
telegram_id: Optional[int] = None
|
25
26
|
discord_webhook: Optional[str] = None
|
27
|
+
users_usage: Optional[int] = None
|
26
28
|
|
27
29
|
|
28
30
|
class HTTPValidationError(BaseModel):
|
@@ -33,6 +35,17 @@ class ProxySettings(BaseModel):
|
|
33
35
|
id: Optional[str] = None
|
34
36
|
flow: Optional[str] = None
|
35
37
|
|
38
|
+
class NextPlanModel(BaseModel):
|
39
|
+
add_remaining_traffic: bool = False
|
40
|
+
data_limit: Optional[int] = 0
|
41
|
+
expire: Optional[int] = 0
|
42
|
+
fire_on_either: bool = True
|
43
|
+
|
44
|
+
@field_validator("data_limit", mode="before")
|
45
|
+
def validate_data_limit(cls, value):
|
46
|
+
if value is not None and value < 0:
|
47
|
+
raise ValueError("Data limit in the next plan must be 0 or greater")
|
48
|
+
return value
|
36
49
|
|
37
50
|
class UserCreate(BaseModel):
|
38
51
|
username: str
|
@@ -47,7 +60,8 @@ class UserCreate(BaseModel):
|
|
47
60
|
online_at: Optional[str] = None
|
48
61
|
on_hold_expire_duration: Optional[int] = 0
|
49
62
|
on_hold_timeout: Optional[str] = None
|
50
|
-
status:
|
63
|
+
status: Literal["active", "on_hold"] = "active"
|
64
|
+
next_plan: Optional[NextPlanModel] = None
|
51
65
|
|
52
66
|
|
53
67
|
class UserResponse(BaseModel):
|
@@ -63,15 +77,16 @@ class UserResponse(BaseModel):
|
|
63
77
|
online_at: Optional[str] = None
|
64
78
|
on_hold_expire_duration: Optional[int] = None
|
65
79
|
on_hold_timeout: Optional[str] = None
|
66
|
-
status:
|
67
|
-
admin: Optional[Admin] = None
|
80
|
+
status: Literal["active", "disabled", "limited", "expired", "on_hold"] = "active"
|
68
81
|
used_traffic: Optional[int] = None
|
69
82
|
lifetime_used_traffic: Optional[int] = None
|
70
|
-
created_at: Optional[str] = None
|
71
83
|
links: Optional[List[str]] = []
|
72
84
|
subscription_url: Optional[str] = None
|
73
85
|
subscription_token: Optional[str] = None
|
74
86
|
excluded_inbounds: Optional[Dict[str, List[str]]] = None
|
87
|
+
next_plan: Optional[NextPlanModel] = None
|
88
|
+
admin: Optional[Admin] = None
|
89
|
+
created_at: Optional[str] = None
|
75
90
|
|
76
91
|
def __init__(self, **data):
|
77
92
|
super().__init__(**data)
|
@@ -152,7 +167,7 @@ class UserModify(BaseModel):
|
|
152
167
|
proxies: Optional[Dict[str, ProxySettings]] = {}
|
153
168
|
expire: Optional[int] = None
|
154
169
|
data_limit: Optional[int] = None
|
155
|
-
data_limit_reset_strategy: Optional[
|
170
|
+
data_limit_reset_strategy: Optional[Literal["no_reset", "day", "week", "month", "year"]] = None
|
156
171
|
inbounds: Optional[Dict[str, List[str]]] = None
|
157
172
|
note: Optional[str] = None
|
158
173
|
sub_updated_at: Optional[str] = None
|
@@ -160,7 +175,8 @@ class UserModify(BaseModel):
|
|
160
175
|
online_at: Optional[str] = None
|
161
176
|
on_hold_expire_duration: Optional[int] = None
|
162
177
|
on_hold_timeout: Optional[str] = None
|
163
|
-
status: Optional[
|
178
|
+
status: Optional[Literal["active", "disabled", "limited", "expired", "on_hold"]] = None
|
179
|
+
next_plan: Optional[NextPlanModel] = None
|
164
180
|
|
165
181
|
|
166
182
|
class UserTemplateCreate(BaseModel):
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: marzban
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.4.1
|
4
4
|
Summary: Асинхронная библиотека Python для взаимодействия с MarzbanAPI | Поддерживает работу через HTTPS/SSH
|
5
5
|
Home-page: https://github.com/sm1ky/marzban_api
|
6
6
|
Author: Artem
|
@@ -20,6 +20,17 @@ Requires-Dist: httpx>=0.23.0
|
|
20
20
|
Requires-Dist: pydantic>=1.10.0
|
21
21
|
Requires-Dist: paramiko>=3.5.0
|
22
22
|
Requires-Dist: sshtunnel>=0.4.0
|
23
|
+
Requires-Dist: datetime>=5.5
|
24
|
+
Dynamic: author
|
25
|
+
Dynamic: author-email
|
26
|
+
Dynamic: classifier
|
27
|
+
Dynamic: description
|
28
|
+
Dynamic: description-content-type
|
29
|
+
Dynamic: home-page
|
30
|
+
Dynamic: project-url
|
31
|
+
Dynamic: requires-dist
|
32
|
+
Dynamic: requires-python
|
33
|
+
Dynamic: summary
|
23
34
|
|
24
35
|
|
25
36
|
# MarzbanAPI Client
|
@@ -30,8 +41,13 @@ Requires-Dist: sshtunnel>=0.4.0
|
|
30
41
|
[](https://pypi.python.org/pypi/marzban)
|
31
42
|
[](https://pypi.python.org/pypi/marzban)
|
32
43
|
[](https://pypi.python.org/pypi/marzban)
|
44
|
+
[](https://github.com/Gozargah/Marzban)
|
45
|
+
|
33
46
|
|
34
47
|
**MarzbanAPI Client** is an asynchronous Python library designed for interacting with [Marzban](https://github.com/Gozargah/Marzban). It provides comprehensive methods for managing administrators, users, nodes, and system statistics.
|
48
|
+
It supports **Marzban version 0.8.0**, providing comprehensive methods for managing administrators, users, nodes, and system statistics.
|
49
|
+
|
50
|
+
To see the list of supported Marzban versions and corresponding API compatibility, check out our [Supported Versions](https://github.com/sm1ky/marzban_api/blob/production/.readme/supported_version.md) file.
|
35
51
|
|
36
52
|
## Installation
|
37
53
|
|
@@ -5,13 +5,14 @@ with open("README.md", "r", encoding="utf-8") as fh:
|
|
5
5
|
|
6
6
|
setup(
|
7
7
|
name="marzban",
|
8
|
-
version="0.
|
8
|
+
version="0.4.1",
|
9
9
|
packages=find_packages(),
|
10
10
|
install_requires=[
|
11
11
|
"httpx>=0.23.0",
|
12
12
|
"pydantic>=1.10.0",
|
13
13
|
"paramiko>=3.5.0",
|
14
|
-
"sshtunnel>=0.4.0"
|
14
|
+
"sshtunnel>=0.4.0",
|
15
|
+
"datetime>=5.5",
|
15
16
|
],
|
16
17
|
author="Artem",
|
17
18
|
author_email="contant@sm1ky.com",
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|