gengineapi 0.2.1__tar.gz → 0.2.2__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.
Files changed (23) hide show
  1. {gengineapi-0.2.1/src/gengineapi.egg-info → gengineapi-0.2.2}/PKG-INFO +42 -1
  2. gengineapi-0.2.1/PKG-INFO → gengineapi-0.2.2/README.md +311 -280
  3. {gengineapi-0.2.1 → gengineapi-0.2.2}/pyproject.toml +1 -1
  4. gengineapi-0.2.1/README.md → gengineapi-0.2.2/src/gengineapi.egg-info/PKG-INFO +321 -270
  5. {gengineapi-0.2.1 → gengineapi-0.2.2}/setup.cfg +0 -0
  6. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/__init__.py +0 -0
  7. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/client.py +0 -0
  8. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/config.py +0 -0
  9. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/exceptions.py +0 -0
  10. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/farm.py +0 -0
  11. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/http.py +0 -0
  12. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/modules/__init__.py +0 -0
  13. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/modules/auth.py +0 -0
  14. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/modules/base.py +0 -0
  15. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/modules/currencies.py +0 -0
  16. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/modules/finances.py +0 -0
  17. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/modules/payments.py +0 -0
  18. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/modules/transactions.py +0 -0
  19. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi/modules/users.py +0 -0
  20. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi.egg-info/SOURCES.txt +0 -0
  21. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi.egg-info/dependency_links.txt +0 -0
  22. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi.egg-info/requires.txt +0 -0
  23. {gengineapi-0.2.1 → gengineapi-0.2.2}/src/gengineapi.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gengineapi
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: G-Engine API Client
5
5
  Requires-Python: >=3.13
6
6
  Description-Content-Type: text/markdown
@@ -39,6 +39,47 @@ pip install aiohttp-socks
39
39
 
40
40
  ## Использование
41
41
 
42
+ ### Быстрый старт
43
+
44
+ ```python
45
+ import os
46
+ import asyncio
47
+ import logging
48
+ from gengineapi import ClientFarm
49
+ from dotenv import load_dotenv
50
+
51
+ load_dotenv()
52
+
53
+ GTOKEN = os.getenv("GTOKEN")
54
+
55
+ # Настройка логирования
56
+ logging.basicConfig(
57
+ level=logging.INFO,
58
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
59
+ )
60
+ logger = logging.getLogger("gengine")
61
+
62
+ gfarm = ClientFarm(logger=logger)
63
+
64
+ gfarm.create_config(name="base",
65
+ base_url="https://b2b-api.ggsel.com/api/v2",
66
+ jwt_token=GTOKEN,
67
+ timeout=60,
68
+ max_retries=5,
69
+ proxy="socks5://username:password@host:port") # Прокси опциональные
70
+
71
+ async def main():
72
+ client = await gfarm.get_client("base")
73
+
74
+ async with client:
75
+ me = await client.users.get_me()
76
+
77
+ logger.info(me)
78
+
79
+
80
+ if __name__ == "__main__":
81
+ asyncio.run(main())
82
+ ```
42
83
  ### Инициализация с существующим токеном
43
84
 
44
85
  ```python
@@ -1,280 +1,311 @@
1
- Metadata-Version: 2.4
2
- Name: gengineapi
3
- Version: 0.2.1
4
- Summary: G-Engine API Client
5
- Requires-Python: >=3.13
6
- Description-Content-Type: text/markdown
7
- Requires-Dist: aiohttp>=3.8.0
8
- Requires-Dist: typing-extensions>=4.0.0
9
- Requires-Dist: aiohttp-socks>=0.7.1
10
-
11
- # GEngineAPI
12
-
13
- Асинхронный модульный клиент для взаимодействия с API G-Engine.
14
-
15
- ## Особенности
16
-
17
- - Полностью асинхронный интерфейс на базе `aiohttp` и `asyncio`
18
- - Модульная структура с разделением по доменам API
19
- - Детальная обработка ошибок и исключений
20
- - Автоматические повторные попытки для временных ошибок
21
- - Поддержка JWT-аутентификации
22
- - Поддержка прокси, включая SOCKS5
23
- - Ферма клиентов с балансировкой нагрузки и стратегиями ротации
24
- - Подробное логирование
25
- - Строгая типизация с помощью аннотаций типов
26
- - Класс-конфигурация для централизованной настройки и повторного использования
27
-
28
- ## Установка
29
-
30
- ```bash
31
- pip install gengineapi
32
- ```
33
-
34
- Для поддержки SOCKS5 прокси убедитесь, что установлен пакет `aiohttp-socks`:
35
-
36
- ```bash
37
- pip install aiohttp-socks
38
- ```
39
-
40
- ## Использование
41
-
42
- ### Инициализация с существующим токеном
43
-
44
- ```python
45
- import asyncio
46
- from gengineapi import GEngineClient
47
-
48
- async def main():
49
- # Создаем клиент с существующим токеном
50
- async with GEngineClient(
51
- base_url="https://api.example.com/api/v2",
52
- jwt_token="your-jwt-token",
53
- timeout=30,
54
- max_retries=3
55
- ) as client:
56
- # Используем API
57
- user_info = await client.users.get_me()
58
- print(f"Текущий пользователь: {user_info['login']}")
59
-
60
- asyncio.run(main())
61
- ```
62
-
63
- ### Получение нового токена
64
-
65
- ```python
66
- import asyncio
67
- from gengineapi import GEngineClient
68
-
69
- async def main():
70
- # Создаем клиент без токена
71
- async with GEngineClient(
72
- base_url="https://api.example.com/api/v2",
73
- timeout=30,
74
- max_retries=3
75
- ) as client:
76
- # Аутентифицируемся и получаем токен
77
- token_info = await client.auth.login(
78
- login="user@example.com",
79
- password="secure_password"
80
- )
81
-
82
- # Получаем токен
83
- token = token_info["access_token"]
84
- print(f"Получен токен: {token}")
85
-
86
- # Обновляем токен в клиенте
87
- client.update_token(token)
88
-
89
- # Используем API
90
- user_info = await client.users.get_me()
91
- print(f"Текущий пользователь: {user_info['login']}")
92
-
93
- asyncio.run(main())
94
- ```
95
-
96
- ### Использование прокси
97
-
98
- Клиент поддерживает работу через прокси, включая SOCKS5:
99
-
100
- ```python
101
- import asyncio
102
- from gengineapi import GEngineClient
103
-
104
- async def main():
105
- # Создаем клиент с использованием SOCKS5 прокси
106
- async with GEngineClient(
107
- base_url="https://api.example.com/api/v2",
108
- jwt_token="your-jwt-token",
109
- timeout=60, # Увеличиваем таймаут для прокси
110
- max_retries=5, # Увеличиваем количество повторных попыток
111
- proxy="socks5://user:pass@host:port" # Адрес SOCKS5 прокси
112
- ) as client:
113
- # Используем API через прокси
114
- user_info = await client.users.get_me()
115
- print(f"Текущий пользователь: {user_info['login']}")
116
-
117
- # Можно изменить настройки прокси на лету
118
- client.update_proxy("socks5://another-host:port")
119
-
120
- # Или отключить прокси
121
- client.update_proxy(None)
122
-
123
- asyncio.run(main())
124
- ```
125
-
126
- ### Использование класса-конфигурации
127
-
128
- Класс-конфигурация позволяет настроить параметры клиента один раз и затем использовать их многократно:
129
-
130
- ```python
131
- import asyncio
132
- from gengineapi import GEngineConfig
133
-
134
- async def main():
135
- # Настройка параметров клиента
136
- GEngineConfig.setup(
137
- base_url="https://api.example.com/api/v2",
138
- jwt_token="your-jwt-token",
139
- timeout=30,
140
- max_retries=3,
141
- proxy="socks5://127.0.0.1:9050" # Опционально - прокси
142
- )
143
-
144
- # Получение глобального экземпляра клиента
145
- client = await GEngineConfig.get_client()
146
-
147
- # Использование клиента
148
- user_info = await client.users.get_me()
149
- print(f"Текущий пользователь: {user_info['login']}")
150
-
151
- # Не нужно закрывать клиент при каждом использовании,
152
- # так как он хранится глобально
153
-
154
- # В другой части приложения
155
- # Получение того же экземпляра клиента
156
- client = await GEngineConfig.get_client()
157
-
158
- # Использование клиента
159
- balance = await client.users.get_balance()
160
- print(f"Баланс: {balance['balance']} {balance['currency']}")
161
-
162
- # Обновление настройки прокси в конфигурации
163
- await GEngineConfig.update_proxy(None) # Отключение прокси
164
-
165
- # При завершении приложения
166
- await GEngineConfig.reset() # Закрывает глобальный клиент
167
-
168
- asyncio.run(main())
169
- ```
170
-
171
- ### Использование фермы клиентов
172
-
173
- Ферма клиентов позволяет управлять множеством клиентов с разными конфигурациями и стратегиями ротации:
174
-
175
- ```python
176
- import asyncio
177
- from gengineapi import ClientFarm
178
-
179
- async def main():
180
- # Создаем ферму клиентов
181
- farm = ClientFarm()
182
-
183
- # Добавляем несколько конфигураций с разными прокси
184
- farm.create_config(
185
- name="client1",
186
- base_url="https://api.example.com/api/v2",
187
- jwt_token="token1",
188
- proxy="socks5://user1:pass1@host1:port1",
189
- tags=["group1", "production"]
190
- )
191
-
192
- farm.create_config(
193
- name="client2",
194
- base_url="https://api.example.com/api/v2",
195
- jwt_token="token2",
196
- proxy="socks5://user2:pass2@host2:port2",
197
- tags=["group1", "backup"]
198
- )
199
-
200
- # Устанавливаем стратегию выбора клиента
201
- farm.set_selection_strategy("round_robin") # или "random", "least_errors", "least_recently_used"
202
-
203
- # Получаем клиент по имени
204
- client1 = await farm.get_client("client1")
205
- await client1.users.get_me()
206
-
207
- # Получаем следующий клиент согласно стратегии
208
- client = await farm.get_next_client()
209
- await client.currencies.get_rate(source="cb_rf", pair="USD:RUB")
210
-
211
- # Получаем клиент по тегу
212
- client = await farm.get_next_client(tag="production")
213
- await client.transactions.get_transactions(limit=5)
214
-
215
- # При завершении работы закрываем все клиенты
216
- await farm.close_all()
217
-
218
- asyncio.run(main())
219
- ```
220
-
221
- ### Работа с платежами
222
-
223
- ```python
224
- import asyncio
225
- import uuid
226
- from decimal import Decimal
227
- from gengineapi import GEngineClient
228
-
229
- async def main():
230
- async with GEngineClient(
231
- base_url="https://api.example.com/api/v2",
232
- jwt_token="your-jwt-token"
233
- ) as client:
234
- # Генерируем уникальный идентификатор транзакции
235
- transaction_id = str(uuid.uuid4())
236
-
237
- # Создаем и верифицируем платеж
238
- payment = await client.payments.verify(
239
- transaction_id=transaction_id,
240
- service_id=1,
241
- account="user123",
242
- amount=Decimal("10.99"),
243
- currency="USD"
244
- )
245
- print(f"Создан платеж: {payment['transaction_id']}")
246
-
247
- # Выполняем платеж
248
- result = await client.payments.execute(transaction_id=transaction_id)
249
- print(f"Статус платежа: {result['status_code']}")
250
-
251
- # Получаем статус платежа
252
- status = await client.payments.get_status(transaction_id=transaction_id)
253
- print(f"Текущий статус платежа: {status['status_code']}")
254
-
255
- asyncio.run(main())
256
- ```
257
-
258
- ## Доступные модули API
259
-
260
- - `payments` - создание и выполнение платежей
261
- - `finances` - работа с финансовыми данными
262
- - `auth` - аутентификация и управление токенами
263
- - `users` - работа с пользователями и их балансами
264
- - `transactions` - работа с транзакциями
265
- - `currencies` - работа с курсами валют
266
-
267
- ## Дополнительная документация
268
-
269
- Ручки, которые дергаем - https://b2b-api.ggsel.com/api/v2/docs#
270
-
271
- ## Зависимости
272
-
273
- - Python 3.7+
274
- - aiohttp >= 3.8.0
275
- - typing-extensions >= 4.0.0
276
- - aiohttp-socks >= 0.7.1 (опционально, для поддержки SOCKS5 прокси)
277
-
278
- ## Лицензия
279
-
280
- MIT
1
+ # GEngineAPI
2
+
3
+ Асинхронный модульный клиент для взаимодействия с API G-Engine.
4
+
5
+ ## Особенности
6
+
7
+ - Полностью асинхронный интерфейс на базе `aiohttp` и `asyncio`
8
+ - Модульная структура с разделением по доменам API
9
+ - Детальная обработка ошибок и исключений
10
+ - Автоматические повторные попытки для временных ошибок
11
+ - Поддержка JWT-аутентификации
12
+ - Поддержка прокси, включая SOCKS5
13
+ - Ферма клиентов с балансировкой нагрузки и стратегиями ротации
14
+ - Подробное логирование
15
+ - Строгая типизация с помощью аннотаций типов
16
+ - Класс-конфигурация для централизованной настройки и повторного использования
17
+
18
+ ## Установка
19
+
20
+ ```bash
21
+ pip install gengineapi
22
+ ```
23
+
24
+ Для поддержки SOCKS5 прокси убедитесь, что установлен пакет `aiohttp-socks`:
25
+
26
+ ```bash
27
+ pip install aiohttp-socks
28
+ ```
29
+
30
+ ## Использование
31
+
32
+ ### Быстрый старт
33
+
34
+ ```python
35
+ import os
36
+ import asyncio
37
+ import logging
38
+ from gengineapi import ClientFarm
39
+ from dotenv import load_dotenv
40
+
41
+ load_dotenv()
42
+
43
+ GTOKEN = os.getenv("GTOKEN")
44
+
45
+ # Настройка логирования
46
+ logging.basicConfig(
47
+ level=logging.INFO,
48
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
49
+ )
50
+ logger = logging.getLogger("gengine")
51
+
52
+ gfarm = ClientFarm(logger=logger)
53
+
54
+ gfarm.create_config(name="base",
55
+ base_url="https://b2b-api.ggsel.com/api/v2",
56
+ jwt_token=GTOKEN,
57
+ timeout=60,
58
+ max_retries=5,
59
+ proxy="socks5://username:password@host:port") # Прокси опциональные
60
+
61
+ async def main():
62
+ client = await gfarm.get_client("base")
63
+
64
+ async with client:
65
+ me = await client.users.get_me()
66
+
67
+ logger.info(me)
68
+
69
+
70
+ if __name__ == "__main__":
71
+ asyncio.run(main())
72
+ ```
73
+ ### Инициализация с существующим токеном
74
+
75
+ ```python
76
+ import asyncio
77
+ from gengineapi import GEngineClient
78
+
79
+ async def main():
80
+ # Создаем клиент с существующим токеном
81
+ async with GEngineClient(
82
+ base_url="https://api.example.com/api/v2",
83
+ jwt_token="your-jwt-token",
84
+ timeout=30,
85
+ max_retries=3
86
+ ) as client:
87
+ # Используем API
88
+ user_info = await client.users.get_me()
89
+ print(f"Текущий пользователь: {user_info['login']}")
90
+
91
+ asyncio.run(main())
92
+ ```
93
+
94
+ ### Получение нового токена
95
+
96
+ ```python
97
+ import asyncio
98
+ from gengineapi import GEngineClient
99
+
100
+ async def main():
101
+ # Создаем клиент без токена
102
+ async with GEngineClient(
103
+ base_url="https://api.example.com/api/v2",
104
+ timeout=30,
105
+ max_retries=3
106
+ ) as client:
107
+ # Аутентифицируемся и получаем токен
108
+ token_info = await client.auth.login(
109
+ login="user@example.com",
110
+ password="secure_password"
111
+ )
112
+
113
+ # Получаем токен
114
+ token = token_info["access_token"]
115
+ print(f"Получен токен: {token}")
116
+
117
+ # Обновляем токен в клиенте
118
+ client.update_token(token)
119
+
120
+ # Используем API
121
+ user_info = await client.users.get_me()
122
+ print(f"Текущий пользователь: {user_info['login']}")
123
+
124
+ asyncio.run(main())
125
+ ```
126
+
127
+ ### Использование прокси
128
+
129
+ Клиент поддерживает работу через прокси, включая SOCKS5:
130
+
131
+ ```python
132
+ import asyncio
133
+ from gengineapi import GEngineClient
134
+
135
+ async def main():
136
+ # Создаем клиент с использованием SOCKS5 прокси
137
+ async with GEngineClient(
138
+ base_url="https://api.example.com/api/v2",
139
+ jwt_token="your-jwt-token",
140
+ timeout=60, # Увеличиваем таймаут для прокси
141
+ max_retries=5, # Увеличиваем количество повторных попыток
142
+ proxy="socks5://user:pass@host:port" # Адрес SOCKS5 прокси
143
+ ) as client:
144
+ # Используем API через прокси
145
+ user_info = await client.users.get_me()
146
+ print(f"Текущий пользователь: {user_info['login']}")
147
+
148
+ # Можно изменить настройки прокси на лету
149
+ client.update_proxy("socks5://another-host:port")
150
+
151
+ # Или отключить прокси
152
+ client.update_proxy(None)
153
+
154
+ asyncio.run(main())
155
+ ```
156
+
157
+ ### Использование класса-конфигурации
158
+
159
+ Класс-конфигурация позволяет настроить параметры клиента один раз и затем использовать их многократно:
160
+
161
+ ```python
162
+ import asyncio
163
+ from gengineapi import GEngineConfig
164
+
165
+ async def main():
166
+ # Настройка параметров клиента
167
+ GEngineConfig.setup(
168
+ base_url="https://api.example.com/api/v2",
169
+ jwt_token="your-jwt-token",
170
+ timeout=30,
171
+ max_retries=3,
172
+ proxy="socks5://127.0.0.1:9050" # Опционально - прокси
173
+ )
174
+
175
+ # Получение глобального экземпляра клиента
176
+ client = await GEngineConfig.get_client()
177
+
178
+ # Использование клиента
179
+ user_info = await client.users.get_me()
180
+ print(f"Текущий пользователь: {user_info['login']}")
181
+
182
+ # Не нужно закрывать клиент при каждом использовании,
183
+ # так как он хранится глобально
184
+
185
+ # В другой части приложения
186
+ # Получение того же экземпляра клиента
187
+ client = await GEngineConfig.get_client()
188
+
189
+ # Использование клиента
190
+ balance = await client.users.get_balance()
191
+ print(f"Баланс: {balance['balance']} {balance['currency']}")
192
+
193
+ # Обновление настройки прокси в конфигурации
194
+ await GEngineConfig.update_proxy(None) # Отключение прокси
195
+
196
+ # При завершении приложения
197
+ await GEngineConfig.reset() # Закрывает глобальный клиент
198
+
199
+ asyncio.run(main())
200
+ ```
201
+
202
+ ### Использование фермы клиентов
203
+
204
+ Ферма клиентов позволяет управлять множеством клиентов с разными конфигурациями и стратегиями ротации:
205
+
206
+ ```python
207
+ import asyncio
208
+ from gengineapi import ClientFarm
209
+
210
+ async def main():
211
+ # Создаем ферму клиентов
212
+ farm = ClientFarm()
213
+
214
+ # Добавляем несколько конфигураций с разными прокси
215
+ farm.create_config(
216
+ name="client1",
217
+ base_url="https://api.example.com/api/v2",
218
+ jwt_token="token1",
219
+ proxy="socks5://user1:pass1@host1:port1",
220
+ tags=["group1", "production"]
221
+ )
222
+
223
+ farm.create_config(
224
+ name="client2",
225
+ base_url="https://api.example.com/api/v2",
226
+ jwt_token="token2",
227
+ proxy="socks5://user2:pass2@host2:port2",
228
+ tags=["group1", "backup"]
229
+ )
230
+
231
+ # Устанавливаем стратегию выбора клиента
232
+ farm.set_selection_strategy("round_robin") # или "random", "least_errors", "least_recently_used"
233
+
234
+ # Получаем клиент по имени
235
+ client1 = await farm.get_client("client1")
236
+ await client1.users.get_me()
237
+
238
+ # Получаем следующий клиент согласно стратегии
239
+ client = await farm.get_next_client()
240
+ await client.currencies.get_rate(source="cb_rf", pair="USD:RUB")
241
+
242
+ # Получаем клиент по тегу
243
+ client = await farm.get_next_client(tag="production")
244
+ await client.transactions.get_transactions(limit=5)
245
+
246
+ # При завершении работы закрываем все клиенты
247
+ await farm.close_all()
248
+
249
+ asyncio.run(main())
250
+ ```
251
+
252
+ ### Работа с платежами
253
+
254
+ ```python
255
+ import asyncio
256
+ import uuid
257
+ from decimal import Decimal
258
+ from gengineapi import GEngineClient
259
+
260
+ async def main():
261
+ async with GEngineClient(
262
+ base_url="https://api.example.com/api/v2",
263
+ jwt_token="your-jwt-token"
264
+ ) as client:
265
+ # Генерируем уникальный идентификатор транзакции
266
+ transaction_id = str(uuid.uuid4())
267
+
268
+ # Создаем и верифицируем платеж
269
+ payment = await client.payments.verify(
270
+ transaction_id=transaction_id,
271
+ service_id=1,
272
+ account="user123",
273
+ amount=Decimal("10.99"),
274
+ currency="USD"
275
+ )
276
+ print(f"Создан платеж: {payment['transaction_id']}")
277
+
278
+ # Выполняем платеж
279
+ result = await client.payments.execute(transaction_id=transaction_id)
280
+ print(f"Статус платежа: {result['status_code']}")
281
+
282
+ # Получаем статус платежа
283
+ status = await client.payments.get_status(transaction_id=transaction_id)
284
+ print(f"Текущий статус платежа: {status['status_code']}")
285
+
286
+ asyncio.run(main())
287
+ ```
288
+
289
+ ## Доступные модули API
290
+
291
+ - `payments` - создание и выполнение платежей
292
+ - `finances` - работа с финансовыми данными
293
+ - `auth` - аутентификация и управление токенами
294
+ - `users` - работа с пользователями и их балансами
295
+ - `transactions` - работа с транзакциями
296
+ - `currencies` - работа с курсами валют
297
+
298
+ ## Дополнительная документация
299
+
300
+ Ручки, которые дергаем - https://b2b-api.ggsel.com/api/v2/docs#
301
+
302
+ ## Зависимости
303
+
304
+ - Python 3.7+
305
+ - aiohttp >= 3.8.0
306
+ - typing-extensions >= 4.0.0
307
+ - aiohttp-socks >= 0.7.1 (опционально, для поддержки SOCKS5 прокси)
308
+
309
+ ## Лицензия
310
+
311
+ MIT