fragment-ton-api 0.1.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.
- fragment_ton_api-0.1.0/.gitignore +10 -0
- fragment_ton_api-0.1.0/LICENSE +21 -0
- fragment_ton_api-0.1.0/PKG-INFO +292 -0
- fragment_ton_api-0.1.0/README.md +254 -0
- fragment_ton_api-0.1.0/pyproject.toml +27 -0
- fragment_ton_api-0.1.0/src/fragment_api/__init__.py +23 -0
- fragment_ton_api-0.1.0/src/fragment_api/catalog.py +100 -0
- fragment_ton_api-0.1.0/src/fragment_api/client.py +759 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 FRAGA
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fragment-ton-api
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Unofficial async client for Fragment.com, TON payments and Telegram gifts
|
|
5
|
+
Author: FRAGA
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 FRAGA
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Classifier: Framework :: AsyncIO
|
|
29
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
30
|
+
Classifier: Programming Language :: Python :: 3
|
|
31
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
32
|
+
Requires-Python: >=3.10
|
|
33
|
+
Requires-Dist: aiohttp>=3.9
|
|
34
|
+
Requires-Dist: pynacl>=1.5
|
|
35
|
+
Requires-Dist: pytoniq>=0.1.40
|
|
36
|
+
Requires-Dist: tonsdk>=1.0.15
|
|
37
|
+
Description-Content-Type: text/markdown
|
|
38
|
+
|
|
39
|
+
# fragment-ton-api
|
|
40
|
+
|
|
41
|
+
Неофициальный асинхронный Python-клиент для Fragment.com и TON. Клиент подписывает TON-транзакции локально: мнемоника не отправляется на Fragment или сторонний сервер.
|
|
42
|
+
|
|
43
|
+
## Установка
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pip install fragment-ton-api
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Подключение
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
import asyncio
|
|
53
|
+
from fragment_api import FragmentClient
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
async def main():
|
|
57
|
+
client = FragmentClient(
|
|
58
|
+
mnemonic="слово1 слово2 ... слово24",
|
|
59
|
+
toncenter_api_key="API_KEY или None",
|
|
60
|
+
fragment_cookies="stel_ssid=...; stel_token=...",
|
|
61
|
+
)
|
|
62
|
+
try:
|
|
63
|
+
await client.connect_wallet()
|
|
64
|
+
# операции Fragment здесь
|
|
65
|
+
finally:
|
|
66
|
+
await client.close()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
asyncio.run(main())
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Параметры `FragmentClient`:
|
|
73
|
+
|
|
74
|
+
- `mnemonic` — ровно 24 слова TON-кошелька;
|
|
75
|
+
- `toncenter_api_key` — необязательный ключ TonCenter, нужен для некоторых операций кошелька v4r2;
|
|
76
|
+
- `wallet_version` — `"v5r1"` по умолчанию или `"v4r2"`;
|
|
77
|
+
- `fragment_cookies` — cookie авторизованной Telegram-сессии на fragment.com. Без неё Fragment иногда возвращает `need_verify`.
|
|
78
|
+
|
|
79
|
+
## 1. Покупка Telegram Stars
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
result = await client.buy_stars(
|
|
83
|
+
username="@username",
|
|
84
|
+
quantity=50,
|
|
85
|
+
anonymous=True,
|
|
86
|
+
)
|
|
87
|
+
print(result)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Параметры:
|
|
91
|
+
|
|
92
|
+
- `username` — Telegram username получателя, с `@` или без него;
|
|
93
|
+
- `quantity` — количество Stars;
|
|
94
|
+
- `anonymous=True` — получатель не увидит отправителя;
|
|
95
|
+
- `anonymous=False` — отправитель будет виден.
|
|
96
|
+
|
|
97
|
+
Успешный ответ:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"success": true,
|
|
102
|
+
"error": null
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Ответ с ошибкой:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"success": false,
|
|
111
|
+
"error": "описание ошибки Fragment"
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Метод находит пользователя, создаёт платёж, подписывает TON-транзакцию, отправляет её в сеть и подтверждает платёж в Fragment.
|
|
116
|
+
|
|
117
|
+
## 2. Покупка Premium-подарка
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
result = await client.buy_premium_gift(
|
|
121
|
+
username="@username",
|
|
122
|
+
months=3,
|
|
123
|
+
anonymous=True,
|
|
124
|
+
)
|
|
125
|
+
print(result)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Параметры:
|
|
129
|
+
|
|
130
|
+
- `username` — получатель Premium;
|
|
131
|
+
- `months` — обычно `3`, `6` или `12` месяцев;
|
|
132
|
+
- `anonymous` — показывать ли отправителя подарка.
|
|
133
|
+
|
|
134
|
+
Ответ имеет такой же формат:
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
{
|
|
138
|
+
"success": true,
|
|
139
|
+
"error": null
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 3. Получение списка коллекций и подарков
|
|
144
|
+
|
|
145
|
+
Для каталога кошелёк не нужен:
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
from fragment_api import FragmentCatalog
|
|
149
|
+
|
|
150
|
+
catalog = FragmentCatalog()
|
|
151
|
+
collections = await catalog.list_collections()
|
|
152
|
+
print(collections)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Коллекции:
|
|
156
|
+
|
|
157
|
+
```json
|
|
158
|
+
[
|
|
159
|
+
{
|
|
160
|
+
"slug": "lol-pop",
|
|
161
|
+
"name": "Lol Pop",
|
|
162
|
+
"url": "https://fragment.com/gifts/lol-pop"
|
|
163
|
+
}
|
|
164
|
+
]
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Получение доступных подарков с фиксированной ценой:
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
gifts = await catalog.list_gifts(
|
|
171
|
+
collection_slug="lol-pop",
|
|
172
|
+
limit=20,
|
|
173
|
+
sort="price",
|
|
174
|
+
)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Каждый подарок:
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"slug": "lol-pop-12345",
|
|
182
|
+
"collection": "lol-pop",
|
|
183
|
+
"number": 12345,
|
|
184
|
+
"name": "Gift name",
|
|
185
|
+
"price_ton": 1.5,
|
|
186
|
+
"image_url": "https://fragment.com/file/preview.png",
|
|
187
|
+
"url": "https://fragment.com/gift/lol-pop-12345",
|
|
188
|
+
"status": "for_sale"
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Именно значение `slug` передаётся в методы покупки и передачи. Сейчас каталог возвращает доступные fixed-price лоты, а не аукционные лоты.
|
|
193
|
+
|
|
194
|
+
## 4. Покупка NFT-подарка по item_slug
|
|
195
|
+
|
|
196
|
+
```python
|
|
197
|
+
result = await client.buy_gift(
|
|
198
|
+
item_slug="lol-pop-12345",
|
|
199
|
+
bid_amount="1.5",
|
|
200
|
+
)
|
|
201
|
+
print(result)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Параметры:
|
|
205
|
+
|
|
206
|
+
- `item_slug` — slug конкретного лота из `list_gifts()`;
|
|
207
|
+
- `bid_amount` — цена покупки в TON, лучше передавать строкой.
|
|
208
|
+
|
|
209
|
+
Пример ответа:
|
|
210
|
+
|
|
211
|
+
```json
|
|
212
|
+
{
|
|
213
|
+
"success": true,
|
|
214
|
+
"error": null
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
После успешной покупки подарок поступает на кошелёк, подключённый к `FragmentClient`.
|
|
219
|
+
|
|
220
|
+
## 5. Передача купленного подарка пользователю
|
|
221
|
+
|
|
222
|
+
```python
|
|
223
|
+
result = await client.transfer_gift(
|
|
224
|
+
owned_item_slug="lol-pop-12345",
|
|
225
|
+
recipient_username="@username",
|
|
226
|
+
anonymous=True,
|
|
227
|
+
)
|
|
228
|
+
print(result)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Параметры:
|
|
232
|
+
|
|
233
|
+
- `owned_item_slug` — slug уже купленного подарка;
|
|
234
|
+
- `recipient_username` — Telegram username получателя;
|
|
235
|
+
- `anonymous` — скрыть или показать отправителя.
|
|
236
|
+
|
|
237
|
+
Метод сначала находит получателя в Fragment, затем создаёт транзакцию передачи, подписывает её TON-кошельком и подтверждает передачу.
|
|
238
|
+
|
|
239
|
+
## 6. Покупка и последующая передача одним методом
|
|
240
|
+
|
|
241
|
+
```python
|
|
242
|
+
result = await client.buy_and_deliver_gift(
|
|
243
|
+
item_slug="lol-pop-12345",
|
|
244
|
+
bid_amount="1.5",
|
|
245
|
+
recipient_username="@username",
|
|
246
|
+
anonymous=True,
|
|
247
|
+
)
|
|
248
|
+
print(result)
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Метод выполняет два шага:
|
|
252
|
+
|
|
253
|
+
1. покупает подарок на подключённый кошелёк;
|
|
254
|
+
2. передаёт этот подарок указанному Telegram-пользователю.
|
|
255
|
+
|
|
256
|
+
Если покупка прошла, а передача не прошла, метод вернёт ошибку передачи. В таком случае подарок может уже находиться на кошельке отправителя — повторную покупку делать нельзя, сначала проверь передачу через `transfer_gift()`.
|
|
257
|
+
|
|
258
|
+
## 7. Проверка баланса TON
|
|
259
|
+
|
|
260
|
+
```python
|
|
261
|
+
balance, error = await client.get_balance_ton()
|
|
262
|
+
|
|
263
|
+
if error:
|
|
264
|
+
print("Ошибка:", error)
|
|
265
|
+
else:
|
|
266
|
+
print("Баланс:", balance, "TON")
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Успешный результат:
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
(12.345, None)
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
При ошибке:
|
|
276
|
+
|
|
277
|
+
```python
|
|
278
|
+
(None, "описание ошибки")
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Перед покупками нужно проверить, что баланса хватает не только на цену подарка, но и на комиссии сети TON.
|
|
282
|
+
|
|
283
|
+
## Важная безопасность
|
|
284
|
+
|
|
285
|
+
Никогда не публикуйте в GitHub, README или исходниках:
|
|
286
|
+
|
|
287
|
+
- 24 слова TON-мнемоники;
|
|
288
|
+
- Fragment cookies;
|
|
289
|
+
- TonCenter API key;
|
|
290
|
+
- `.env` и базы данных.
|
|
291
|
+
|
|
292
|
+
Клиент использует web-endpoint'ы Fragment, а не официальный стабильный публичный API. Fragment может изменить HTML, методы или требования к авторизации.
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# fragment-ton-api
|
|
2
|
+
|
|
3
|
+
Неофициальный асинхронный Python-клиент для Fragment.com и TON. Клиент подписывает TON-транзакции локально: мнемоника не отправляется на Fragment или сторонний сервер.
|
|
4
|
+
|
|
5
|
+
## Установка
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install fragment-ton-api
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Подключение
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
import asyncio
|
|
15
|
+
from fragment_api import FragmentClient
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
async def main():
|
|
19
|
+
client = FragmentClient(
|
|
20
|
+
mnemonic="слово1 слово2 ... слово24",
|
|
21
|
+
toncenter_api_key="API_KEY или None",
|
|
22
|
+
fragment_cookies="stel_ssid=...; stel_token=...",
|
|
23
|
+
)
|
|
24
|
+
try:
|
|
25
|
+
await client.connect_wallet()
|
|
26
|
+
# операции Fragment здесь
|
|
27
|
+
finally:
|
|
28
|
+
await client.close()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
asyncio.run(main())
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Параметры `FragmentClient`:
|
|
35
|
+
|
|
36
|
+
- `mnemonic` — ровно 24 слова TON-кошелька;
|
|
37
|
+
- `toncenter_api_key` — необязательный ключ TonCenter, нужен для некоторых операций кошелька v4r2;
|
|
38
|
+
- `wallet_version` — `"v5r1"` по умолчанию или `"v4r2"`;
|
|
39
|
+
- `fragment_cookies` — cookie авторизованной Telegram-сессии на fragment.com. Без неё Fragment иногда возвращает `need_verify`.
|
|
40
|
+
|
|
41
|
+
## 1. Покупка Telegram Stars
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
result = await client.buy_stars(
|
|
45
|
+
username="@username",
|
|
46
|
+
quantity=50,
|
|
47
|
+
anonymous=True,
|
|
48
|
+
)
|
|
49
|
+
print(result)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Параметры:
|
|
53
|
+
|
|
54
|
+
- `username` — Telegram username получателя, с `@` или без него;
|
|
55
|
+
- `quantity` — количество Stars;
|
|
56
|
+
- `anonymous=True` — получатель не увидит отправителя;
|
|
57
|
+
- `anonymous=False` — отправитель будет виден.
|
|
58
|
+
|
|
59
|
+
Успешный ответ:
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"success": true,
|
|
64
|
+
"error": null
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Ответ с ошибкой:
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"success": false,
|
|
73
|
+
"error": "описание ошибки Fragment"
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Метод находит пользователя, создаёт платёж, подписывает TON-транзакцию, отправляет её в сеть и подтверждает платёж в Fragment.
|
|
78
|
+
|
|
79
|
+
## 2. Покупка Premium-подарка
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
result = await client.buy_premium_gift(
|
|
83
|
+
username="@username",
|
|
84
|
+
months=3,
|
|
85
|
+
anonymous=True,
|
|
86
|
+
)
|
|
87
|
+
print(result)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Параметры:
|
|
91
|
+
|
|
92
|
+
- `username` — получатель Premium;
|
|
93
|
+
- `months` — обычно `3`, `6` или `12` месяцев;
|
|
94
|
+
- `anonymous` — показывать ли отправителя подарка.
|
|
95
|
+
|
|
96
|
+
Ответ имеет такой же формат:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"success": true,
|
|
101
|
+
"error": null
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 3. Получение списка коллекций и подарков
|
|
106
|
+
|
|
107
|
+
Для каталога кошелёк не нужен:
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
from fragment_api import FragmentCatalog
|
|
111
|
+
|
|
112
|
+
catalog = FragmentCatalog()
|
|
113
|
+
collections = await catalog.list_collections()
|
|
114
|
+
print(collections)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Коллекции:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
[
|
|
121
|
+
{
|
|
122
|
+
"slug": "lol-pop",
|
|
123
|
+
"name": "Lol Pop",
|
|
124
|
+
"url": "https://fragment.com/gifts/lol-pop"
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Получение доступных подарков с фиксированной ценой:
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
gifts = await catalog.list_gifts(
|
|
133
|
+
collection_slug="lol-pop",
|
|
134
|
+
limit=20,
|
|
135
|
+
sort="price",
|
|
136
|
+
)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Каждый подарок:
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"slug": "lol-pop-12345",
|
|
144
|
+
"collection": "lol-pop",
|
|
145
|
+
"number": 12345,
|
|
146
|
+
"name": "Gift name",
|
|
147
|
+
"price_ton": 1.5,
|
|
148
|
+
"image_url": "https://fragment.com/file/preview.png",
|
|
149
|
+
"url": "https://fragment.com/gift/lol-pop-12345",
|
|
150
|
+
"status": "for_sale"
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Именно значение `slug` передаётся в методы покупки и передачи. Сейчас каталог возвращает доступные fixed-price лоты, а не аукционные лоты.
|
|
155
|
+
|
|
156
|
+
## 4. Покупка NFT-подарка по item_slug
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
result = await client.buy_gift(
|
|
160
|
+
item_slug="lol-pop-12345",
|
|
161
|
+
bid_amount="1.5",
|
|
162
|
+
)
|
|
163
|
+
print(result)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Параметры:
|
|
167
|
+
|
|
168
|
+
- `item_slug` — slug конкретного лота из `list_gifts()`;
|
|
169
|
+
- `bid_amount` — цена покупки в TON, лучше передавать строкой.
|
|
170
|
+
|
|
171
|
+
Пример ответа:
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"success": true,
|
|
176
|
+
"error": null
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
После успешной покупки подарок поступает на кошелёк, подключённый к `FragmentClient`.
|
|
181
|
+
|
|
182
|
+
## 5. Передача купленного подарка пользователю
|
|
183
|
+
|
|
184
|
+
```python
|
|
185
|
+
result = await client.transfer_gift(
|
|
186
|
+
owned_item_slug="lol-pop-12345",
|
|
187
|
+
recipient_username="@username",
|
|
188
|
+
anonymous=True,
|
|
189
|
+
)
|
|
190
|
+
print(result)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Параметры:
|
|
194
|
+
|
|
195
|
+
- `owned_item_slug` — slug уже купленного подарка;
|
|
196
|
+
- `recipient_username` — Telegram username получателя;
|
|
197
|
+
- `anonymous` — скрыть или показать отправителя.
|
|
198
|
+
|
|
199
|
+
Метод сначала находит получателя в Fragment, затем создаёт транзакцию передачи, подписывает её TON-кошельком и подтверждает передачу.
|
|
200
|
+
|
|
201
|
+
## 6. Покупка и последующая передача одним методом
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
result = await client.buy_and_deliver_gift(
|
|
205
|
+
item_slug="lol-pop-12345",
|
|
206
|
+
bid_amount="1.5",
|
|
207
|
+
recipient_username="@username",
|
|
208
|
+
anonymous=True,
|
|
209
|
+
)
|
|
210
|
+
print(result)
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Метод выполняет два шага:
|
|
214
|
+
|
|
215
|
+
1. покупает подарок на подключённый кошелёк;
|
|
216
|
+
2. передаёт этот подарок указанному Telegram-пользователю.
|
|
217
|
+
|
|
218
|
+
Если покупка прошла, а передача не прошла, метод вернёт ошибку передачи. В таком случае подарок может уже находиться на кошельке отправителя — повторную покупку делать нельзя, сначала проверь передачу через `transfer_gift()`.
|
|
219
|
+
|
|
220
|
+
## 7. Проверка баланса TON
|
|
221
|
+
|
|
222
|
+
```python
|
|
223
|
+
balance, error = await client.get_balance_ton()
|
|
224
|
+
|
|
225
|
+
if error:
|
|
226
|
+
print("Ошибка:", error)
|
|
227
|
+
else:
|
|
228
|
+
print("Баланс:", balance, "TON")
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Успешный результат:
|
|
232
|
+
|
|
233
|
+
```python
|
|
234
|
+
(12.345, None)
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
При ошибке:
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
(None, "описание ошибки")
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Перед покупками нужно проверить, что баланса хватает не только на цену подарка, но и на комиссии сети TON.
|
|
244
|
+
|
|
245
|
+
## Важная безопасность
|
|
246
|
+
|
|
247
|
+
Никогда не публикуйте в GitHub, README или исходниках:
|
|
248
|
+
|
|
249
|
+
- 24 слова TON-мнемоники;
|
|
250
|
+
- Fragment cookies;
|
|
251
|
+
- TonCenter API key;
|
|
252
|
+
- `.env` и базы данных.
|
|
253
|
+
|
|
254
|
+
Клиент использует web-endpoint'ы Fragment, а не официальный стабильный публичный API. Fragment может изменить HTML, методы или требования к авторизации.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "fragment-ton-api"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Unofficial async client for Fragment.com, TON payments and Telegram gifts"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = { file = "LICENSE" }
|
|
12
|
+
authors = [{ name = "FRAGA" }]
|
|
13
|
+
dependencies = [
|
|
14
|
+
"aiohttp>=3.9",
|
|
15
|
+
"tonsdk>=1.0.15",
|
|
16
|
+
"pytoniq>=0.1.40",
|
|
17
|
+
"pynacl>=1.5",
|
|
18
|
+
]
|
|
19
|
+
classifiers = [
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
22
|
+
"License :: OSI Approved :: MIT License",
|
|
23
|
+
"Framework :: AsyncIO",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[tool.hatch.build.targets.wheel]
|
|
27
|
+
packages = ["src/fragment_api"]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Unofficial asynchronous client for Fragment.com and TON payments."""
|
|
2
|
+
|
|
3
|
+
from .client import (
|
|
4
|
+
FRAGMENT_BASE,
|
|
5
|
+
TONCENTER_API,
|
|
6
|
+
WALLET_V4R2,
|
|
7
|
+
WALLET_V5R1,
|
|
8
|
+
FragmentClient,
|
|
9
|
+
FragmentError,
|
|
10
|
+
)
|
|
11
|
+
from .catalog import FragmentCatalog
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"FragmentClient",
|
|
15
|
+
"FragmentError",
|
|
16
|
+
"FRAGMENT_BASE",
|
|
17
|
+
"TONCENTER_API",
|
|
18
|
+
"WALLET_V4R2",
|
|
19
|
+
"WALLET_V5R1",
|
|
20
|
+
"FragmentCatalog",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
__version__ = "0.1.0"
|