mirror of
https://github.com/vibe-existing/pyfragment.git
synced 2026-07-25 06:54:31 +00:00
chore: update examples and README for improved clarity and consistency; streamline print statements and descriptions
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
<h1 style="margin-top: 24px;">Fragment API</h1>
|
||||
|
||||
<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>
|
||||
|
||||
[](https://pypi.org/project/pyfragment/)
|
||||
|
||||
@@ -8,6 +8,7 @@ Use next_offset for pagination.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
|
||||
from pyfragment import FragmentClient, GiftsResult
|
||||
|
||||
@@ -28,16 +29,10 @@ FILTER = "" # "", "auction", "sale", "sold" — or omit
|
||||
|
||||
async def main() -> None:
|
||||
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
|
||||
result: GiftsResult = await client.search_gifts(
|
||||
QUERY, collection=COLLECTION, sort=SORT, filter=FILTER
|
||||
)
|
||||
result: GiftsResult = await client.search_gifts(QUERY, collection=COLLECTION, sort=SORT, filter=FILTER)
|
||||
|
||||
print(f"Found {len(result.items)} result(s):")
|
||||
for item in result.items:
|
||||
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 '—'}"
|
||||
)
|
||||
print(json.dumps(result.items, indent=2))
|
||||
|
||||
if result.next_offset:
|
||||
print(f"\nMore results available — next page offset: {result.next_offset}")
|
||||
|
||||
@@ -7,6 +7,7 @@ Use next_offset_id for pagination.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
|
||||
from pyfragment import FragmentClient, NumbersResult
|
||||
|
||||
@@ -26,21 +27,13 @@ FILTER = "" # "", "auction", "sale", "sold" — or omit
|
||||
|
||||
async def main() -> None:
|
||||
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
|
||||
result: NumbersResult = await client.search_numbers(
|
||||
QUERY, sort=SORT, filter=FILTER
|
||||
)
|
||||
result: NumbersResult = await client.search_numbers(QUERY, sort=SORT, filter=FILTER)
|
||||
|
||||
print(f"Found {len(result.items)} result(s):")
|
||||
for item in result.items:
|
||||
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 '—'}"
|
||||
)
|
||||
print(json.dumps(result.items, indent=2))
|
||||
|
||||
if result.next_offset_id:
|
||||
print(
|
||||
f"\nMore results available — next page offset: {result.next_offset_id}"
|
||||
)
|
||||
print(f"\nMore results available — next page offset: {result.next_offset_id}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -7,6 +7,7 @@ Use next_offset_id for pagination.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
|
||||
from pyfragment import FragmentClient, UsernamesResult
|
||||
|
||||
@@ -26,21 +27,13 @@ FILTER = "auction" # "", "auction", "sale", "sold" — or omit
|
||||
|
||||
async def main() -> None:
|
||||
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
|
||||
result: UsernamesResult = await client.search_usernames(
|
||||
QUERY, sort=SORT, filter=FILTER
|
||||
)
|
||||
result: UsernamesResult = await client.search_usernames(QUERY, sort=SORT, filter=FILTER)
|
||||
|
||||
print(f"Found {len(result.items)} result(s):")
|
||||
for item in result.items:
|
||||
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 '—'}"
|
||||
)
|
||||
print(json.dumps(result.items, indent=2))
|
||||
|
||||
if result.next_offset_id:
|
||||
print(
|
||||
f"\nMore results available — next page offset: {result.next_offset_id}"
|
||||
)
|
||||
print(f"\nMore results available — next page offset: {result.next_offset_id}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -27,21 +27,14 @@ async def main() -> None:
|
||||
# Fetch the latest login code
|
||||
result = await client.get_login_code(NUMBER)
|
||||
if result.code:
|
||||
print(
|
||||
f"Login code for {result.number}: {result.code} ({result.active_sessions} active session(s))"
|
||||
)
|
||||
print(f"Login code for {result.number}: {result.code} ({result.active_sessions} active session(s))")
|
||||
else:
|
||||
print(
|
||||
f"No pending login code for {result.number} ({result.active_sessions} active session(s))"
|
||||
)
|
||||
print(f"No pending login code for {result.number} ({result.active_sessions} active session(s))")
|
||||
|
||||
# Terminate all active sessions
|
||||
try:
|
||||
terminated = await client.terminate_sessions(NUMBER)
|
||||
print(
|
||||
f"Sessions terminated for {terminated.number}"
|
||||
+ (f": {terminated.message}" if terminated.message else "")
|
||||
)
|
||||
print(f"Sessions terminated for {terminated.number}" + (f": {terminated.message}" if terminated.message else ""))
|
||||
except AnonymousNumberError as e:
|
||||
print(f"Could not terminate sessions: {e}")
|
||||
|
||||
|
||||
@@ -30,9 +30,7 @@ AMOUNT = 10 # 1–1 000 000 000 TON
|
||||
async def main() -> None:
|
||||
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
|
||||
try:
|
||||
result: AdsRechargeResult = await client.recharge_ads(
|
||||
ACCOUNT, amount=AMOUNT
|
||||
)
|
||||
result: AdsRechargeResult = await client.recharge_ads(ACCOUNT, amount=AMOUNT)
|
||||
except WalletError as e:
|
||||
print(f"Wallet error — insufficient balance or misconfiguration: {e}")
|
||||
return
|
||||
@@ -40,9 +38,7 @@ async def main() -> None:
|
||||
print(f"Invalid argument: {e}")
|
||||
return
|
||||
|
||||
print(
|
||||
f"{result.amount} TON recharged to Ads account {ACCOUNT} | tx: {result.transaction_id}"
|
||||
)
|
||||
print(f"{result.amount} TON recharged to Ads account {ACCOUNT} | tx: {result.transaction_id}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -26,13 +26,9 @@ MONTHS = 3 # 3, 6 or 12
|
||||
async def main() -> None:
|
||||
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
|
||||
try:
|
||||
result = await client.giveaway_premium(
|
||||
CHANNEL, winners=WINNERS, months=MONTHS
|
||||
)
|
||||
result = await client.giveaway_premium(CHANNEL, winners=WINNERS, months=MONTHS)
|
||||
except UserNotFoundError:
|
||||
print(
|
||||
f"Channel {CHANNEL} was not found on fragment.com — check the username and try again."
|
||||
)
|
||||
print(f"Channel {CHANNEL} was not found on fragment.com — check the username and try again.")
|
||||
return
|
||||
except ConfigurationError as e:
|
||||
print(f"Invalid argument: {e}")
|
||||
|
||||
@@ -26,13 +26,9 @@ AMOUNT = 1000 # 500–1 000 000 stars per winner
|
||||
async def main() -> None:
|
||||
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
|
||||
try:
|
||||
result = await client.giveaway_stars(
|
||||
CHANNEL, winners=WINNERS, amount=AMOUNT
|
||||
)
|
||||
result = await client.giveaway_stars(CHANNEL, winners=WINNERS, amount=AMOUNT)
|
||||
except UserNotFoundError:
|
||||
print(
|
||||
f"Channel {CHANNEL} was not found on fragment.com — check the username and try again."
|
||||
)
|
||||
print(f"Channel {CHANNEL} was not found on fragment.com — check the username and try again.")
|
||||
return
|
||||
except ConfigurationError as e:
|
||||
print(f"Invalid argument: {e}")
|
||||
|
||||
@@ -25,21 +25,15 @@ MONTHS = 3 # 3, 6 or 12
|
||||
async def main() -> None:
|
||||
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
|
||||
try:
|
||||
result = await client.purchase_premium(
|
||||
USERNAME, months=MONTHS, show_sender=True
|
||||
)
|
||||
result = await client.purchase_premium(USERNAME, months=MONTHS, show_sender=True)
|
||||
except UserNotFoundError:
|
||||
print(
|
||||
f"User {USERNAME} was not found on fragment.com — check the username and try again."
|
||||
)
|
||||
print(f"User {USERNAME} was not found on fragment.com — check the username and try again.")
|
||||
return
|
||||
except ConfigurationError as e:
|
||||
print(f"Invalid argument: {e}")
|
||||
return
|
||||
|
||||
print(
|
||||
f"{result.amount} months of Premium successfully sent to {result.username} | tx: {result.transaction_id}"
|
||||
)
|
||||
print(f"{result.amount} months of Premium successfully sent to {result.username} | tx: {result.transaction_id}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -25,21 +25,15 @@ AMOUNT = 500 # 50–1 000 000 stars
|
||||
async def main() -> None:
|
||||
async with FragmentClient(seed=SEED, api_key=API_KEY, cookies=COOKIES) as client:
|
||||
try:
|
||||
result = await client.purchase_stars(
|
||||
USERNAME, amount=AMOUNT, show_sender=True
|
||||
)
|
||||
result = await client.purchase_stars(USERNAME, amount=AMOUNT, show_sender=True)
|
||||
except UserNotFoundError:
|
||||
print(
|
||||
f"User {USERNAME} was not found on fragment.com — check the username and try again."
|
||||
)
|
||||
print(f"User {USERNAME} was not found on fragment.com — check the username and try again.")
|
||||
return
|
||||
except ConfigurationError as e:
|
||||
print(f"Invalid argument: {e}")
|
||||
return
|
||||
|
||||
print(
|
||||
f"{result.amount} Stars successfully sent to {result.username} | tx: {result.transaction_id}"
|
||||
)
|
||||
print(f"{result.amount} Stars successfully sent to {result.username} | tx: {result.transaction_id}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -34,9 +34,7 @@ async def main() -> None:
|
||||
try:
|
||||
result = await client.topup_ton(USERNAME, amount=AMOUNT, show_sender=True)
|
||||
except UserNotFoundError:
|
||||
print(
|
||||
f"User {USERNAME} was not found on fragment.com — check the username and try again."
|
||||
)
|
||||
print(f"User {USERNAME} was not found on fragment.com — check the username and try again.")
|
||||
return
|
||||
except WalletError as e:
|
||||
print(f"Wallet error — insufficient balance or misconfiguration: {e}")
|
||||
@@ -45,9 +43,7 @@ async def main() -> None:
|
||||
print(f"Invalid argument: {e}")
|
||||
return
|
||||
|
||||
print(
|
||||
f"{result.amount} TON successfully topped up for {result.username} | tx: {result.transaction_id}"
|
||||
)
|
||||
print(f"{result.amount} TON successfully topped up for {result.username} | tx: {result.transaction_id}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
|
||||
[project]
|
||||
name = "pyfragment"
|
||||
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"
|
||||
license = { text = "MIT" }
|
||||
requires-python = ">=3.12"
|
||||
|
||||
Reference in New Issue
Block a user