chore: update examples and README for improved clarity and consistency; streamline print statements and descriptions

This commit is contained in:
bohd4nx
2026-03-25 18:18:40 +02:00
parent 3156160778
commit da2eb37a10
12 changed files with 30 additions and 84 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<h1 style="margin-top: 24px;">Fragment API</h1> <h1 style="margin-top: 24px;">Fragment API</h1>
<p style="font-size: 18px; margin-bottom: 24px;"> <p style="font-size: 18px; margin-bottom: 24px;">
<b>Async Python client for the Fragment.com API — buy Telegram Stars and Premium, run giveaways, top up TON, Ads balance, manage anonymous numbers, and search the marketplace for usernames, numbers, and gifts.</b> <b>Async Python client for the Fragment API — a unified toolkit to manage Telegram assets: purchase Stars and Premium, top up TON and Ads balances, run giveaways, manage anonymous numbers, and explore the marketplace for usernames, numbers, and gifts.</b>
</p> </p>
[![PyPI version](https://img.shields.io/pypi/v/pyfragment?style=flat&color=blue)](https://pypi.org/project/pyfragment/) [![PyPI version](https://img.shields.io/pypi/v/pyfragment?style=flat&color=blue)](https://pypi.org/project/pyfragment/)
+3 -8
View File
@@ -8,6 +8,7 @@ Use next_offset for pagination.
""" """
import asyncio import asyncio
import json
from pyfragment import FragmentClient, GiftsResult from pyfragment import FragmentClient, GiftsResult
@@ -28,16 +29,10 @@ FILTER = "" # "", "auction", "sale", "sold" — or omit
async def main() -> None: async def main() -> None:
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client: async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
result: GiftsResult = await client.search_gifts( result: GiftsResult = await client.search_gifts(QUERY, collection=COLLECTION, sort=SORT, filter=FILTER)
QUERY, collection=COLLECTION, sort=SORT, filter=FILTER
)
print(f"Found {len(result.items)} result(s):") print(f"Found {len(result.items)} result(s):")
for item in result.items: print(json.dumps(result.items, indent=2))
price = f"{item['price']} TON" if item["price"] else "n/a"
print(
f" {item['name']:30s} {item['status'] or '':15s} {price:12s} {item['date'] or ''}"
)
if result.next_offset: if result.next_offset:
print(f"\nMore results available — next page offset: {result.next_offset}") print(f"\nMore results available — next page offset: {result.next_offset}")
+4 -11
View File
@@ -7,6 +7,7 @@ Use next_offset_id for pagination.
""" """
import asyncio import asyncio
import json
from pyfragment import FragmentClient, NumbersResult from pyfragment import FragmentClient, NumbersResult
@@ -26,21 +27,13 @@ FILTER = "" # "", "auction", "sale", "sold" — or omit
async def main() -> None: async def main() -> None:
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client: async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
result: NumbersResult = await client.search_numbers( result: NumbersResult = await client.search_numbers(QUERY, sort=SORT, filter=FILTER)
QUERY, sort=SORT, filter=FILTER
)
print(f"Found {len(result.items)} result(s):") print(f"Found {len(result.items)} result(s):")
for item in result.items: print(json.dumps(result.items, indent=2))
price = f"{item['price']} TON" if item["price"] else "n/a"
print(
f" {item['name']:20s} {item['status'] or '':15s} {price:10s} {item['date'] or ''}"
)
if result.next_offset_id: if result.next_offset_id:
print( print(f"\nMore results available — next page offset: {result.next_offset_id}")
f"\nMore results available — next page offset: {result.next_offset_id}"
)
if __name__ == "__main__": if __name__ == "__main__":
+4 -11
View File
@@ -7,6 +7,7 @@ Use next_offset_id for pagination.
""" """
import asyncio import asyncio
import json
from pyfragment import FragmentClient, UsernamesResult from pyfragment import FragmentClient, UsernamesResult
@@ -26,21 +27,13 @@ FILTER = "auction" # "", "auction", "sale", "sold" — or omit
async def main() -> None: async def main() -> None:
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client: async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
result: UsernamesResult = await client.search_usernames( result: UsernamesResult = await client.search_usernames(QUERY, sort=SORT, filter=FILTER)
QUERY, sort=SORT, filter=FILTER
)
print(f"Found {len(result.items)} result(s):") print(f"Found {len(result.items)} result(s):")
for item in result.items: print(json.dumps(result.items, indent=2))
price = f"{item['price']} TON" if item["price"] else "n/a"
print(
f" {item['name']:20s} {item['status'] or '':15s} {price:10s} {item['date'] or ''}"
)
if result.next_offset_id: if result.next_offset_id:
print( print(f"\nMore results available — next page offset: {result.next_offset_id}")
f"\nMore results available — next page offset: {result.next_offset_id}"
)
if __name__ == "__main__": if __name__ == "__main__":
+3 -10
View File
@@ -27,21 +27,14 @@ async def main() -> None:
# Fetch the latest login code # Fetch the latest login code
result = await client.get_login_code(NUMBER) result = await client.get_login_code(NUMBER)
if result.code: if result.code:
print( print(f"Login code for {result.number}: {result.code} ({result.active_sessions} active session(s))")
f"Login code for {result.number}: {result.code} ({result.active_sessions} active session(s))"
)
else: else:
print( print(f"No pending login code for {result.number} ({result.active_sessions} active session(s))")
f"No pending login code for {result.number} ({result.active_sessions} active session(s))"
)
# Terminate all active sessions # Terminate all active sessions
try: try:
terminated = await client.terminate_sessions(NUMBER) terminated = await client.terminate_sessions(NUMBER)
print( print(f"Sessions terminated for {terminated.number}" + (f": {terminated.message}" if terminated.message else ""))
f"Sessions terminated for {terminated.number}"
+ (f": {terminated.message}" if terminated.message else "")
)
except AnonymousNumberError as e: except AnonymousNumberError as e:
print(f"Could not terminate sessions: {e}") print(f"Could not terminate sessions: {e}")
+2 -6
View File
@@ -30,9 +30,7 @@ AMOUNT = 10 # 11 000 000 000 TON
async def main() -> None: async def main() -> None:
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client: async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
try: try:
result: AdsRechargeResult = await client.recharge_ads( result: AdsRechargeResult = await client.recharge_ads(ACCOUNT, amount=AMOUNT)
ACCOUNT, amount=AMOUNT
)
except WalletError as e: except WalletError as e:
print(f"Wallet error — insufficient balance or misconfiguration: {e}") print(f"Wallet error — insufficient balance or misconfiguration: {e}")
return return
@@ -40,9 +38,7 @@ async def main() -> None:
print(f"Invalid argument: {e}") print(f"Invalid argument: {e}")
return return
print( print(f"{result.amount} TON recharged to Ads account {ACCOUNT} | tx: {result.transaction_id}")
f"{result.amount} TON recharged to Ads account {ACCOUNT} | tx: {result.transaction_id}"
)
if __name__ == "__main__": if __name__ == "__main__":
+2 -6
View File
@@ -26,13 +26,9 @@ MONTHS = 3 # 3, 6 or 12
async def main() -> None: async def main() -> None:
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client: async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
try: try:
result = await client.giveaway_premium( result = await client.giveaway_premium(CHANNEL, winners=WINNERS, months=MONTHS)
CHANNEL, winners=WINNERS, months=MONTHS
)
except UserNotFoundError: except UserNotFoundError:
print( print(f"Channel {CHANNEL} was not found on fragment.com — check the username and try again.")
f"Channel {CHANNEL} was not found on fragment.com — check the username and try again."
)
return return
except ConfigurationError as e: except ConfigurationError as e:
print(f"Invalid argument: {e}") print(f"Invalid argument: {e}")
+2 -6
View File
@@ -26,13 +26,9 @@ AMOUNT = 1000 # 5001 000 000 stars per winner
async def main() -> None: async def main() -> None:
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client: async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
try: try:
result = await client.giveaway_stars( result = await client.giveaway_stars(CHANNEL, winners=WINNERS, amount=AMOUNT)
CHANNEL, winners=WINNERS, amount=AMOUNT
)
except UserNotFoundError: except UserNotFoundError:
print( print(f"Channel {CHANNEL} was not found on fragment.com — check the username and try again.")
f"Channel {CHANNEL} was not found on fragment.com — check the username and try again."
)
return return
except ConfigurationError as e: except ConfigurationError as e:
print(f"Invalid argument: {e}") print(f"Invalid argument: {e}")
+3 -9
View File
@@ -25,21 +25,15 @@ MONTHS = 3 # 3, 6 or 12
async def main() -> None: async def main() -> None:
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client: async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
try: try:
result = await client.purchase_premium( result = await client.purchase_premium(USERNAME, months=MONTHS, show_sender=True)
USERNAME, months=MONTHS, show_sender=True
)
except UserNotFoundError: except UserNotFoundError:
print( print(f"User {USERNAME} was not found on fragment.com — check the username and try again.")
f"User {USERNAME} was not found on fragment.com — check the username and try again."
)
return return
except ConfigurationError as e: except ConfigurationError as e:
print(f"Invalid argument: {e}") print(f"Invalid argument: {e}")
return return
print( print(f"{result.amount} months of Premium successfully sent to {result.username} | tx: {result.transaction_id}")
f"{result.amount} months of Premium successfully sent to {result.username} | tx: {result.transaction_id}"
)
if __name__ == "__main__": if __name__ == "__main__":
+3 -9
View File
@@ -25,21 +25,15 @@ AMOUNT = 500 # 501 000 000 stars
async def main() -> None: async def main() -> None:
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client: async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
try: try:
result = await client.purchase_stars( result = await client.purchase_stars(USERNAME, amount=AMOUNT, show_sender=True)
USERNAME, amount=AMOUNT, show_sender=True
)
except UserNotFoundError: except UserNotFoundError:
print( print(f"User {USERNAME} was not found on fragment.com — check the username and try again.")
f"User {USERNAME} was not found on fragment.com — check the username and try again."
)
return return
except ConfigurationError as e: except ConfigurationError as e:
print(f"Invalid argument: {e}") print(f"Invalid argument: {e}")
return return
print( print(f"{result.amount} Stars successfully sent to {result.username} | tx: {result.transaction_id}")
f"{result.amount} Stars successfully sent to {result.username} | tx: {result.transaction_id}"
)
if __name__ == "__main__": if __name__ == "__main__":
+2 -6
View File
@@ -34,9 +34,7 @@ async def main() -> None:
try: try:
result = await client.topup_ton(USERNAME, amount=AMOUNT, show_sender=True) result = await client.topup_ton(USERNAME, amount=AMOUNT, show_sender=True)
except UserNotFoundError: except UserNotFoundError:
print( print(f"User {USERNAME} was not found on fragment.com — check the username and try again.")
f"User {USERNAME} was not found on fragment.com — check the username and try again."
)
return return
except WalletError as e: except WalletError as e:
print(f"Wallet error — insufficient balance or misconfiguration: {e}") print(f"Wallet error — insufficient balance or misconfiguration: {e}")
@@ -45,9 +43,7 @@ async def main() -> None:
print(f"Invalid argument: {e}") print(f"Invalid argument: {e}")
return return
print( print(f"{result.amount} TON successfully topped up for {result.username} | tx: {result.transaction_id}")
f"{result.amount} TON successfully topped up for {result.username} | tx: {result.transaction_id}"
)
if __name__ == "__main__": if __name__ == "__main__":
+1 -1
View File
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
[project] [project]
name = "pyfragment" name = "pyfragment"
version = "2026.0.2" version = "2026.0.2"
description = "Async Python client for the Fragment.com API — buy Telegram Stars and Premium, run giveaways, top up TON Ads balance, and manage anonymous numbers." description = "Async Python client for the Fragment API — a unified toolkit to manage Telegram assets: purchase Stars and Premium, top up TON and Ads balances, run giveaways, manage anonymous numbers, and explore the marketplace for usernames, numbers, and gifts."
readme = "README.md" readme = "README.md"
license = { text = "MIT" } license = { text = "MIT" }
requires-python = ">=3.12" requires-python = ">=3.12"