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>
|
<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>
|
||||||
|
|
||||||
[](https://pypi.org/project/pyfragment/)
|
[](https://pypi.org/project/pyfragment/)
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|||||||
@@ -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__":
|
||||||
|
|||||||
@@ -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__":
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|
||||||
|
|||||||
@@ -30,9 +30,7 @@ AMOUNT = 10 # 1–1 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__":
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|||||||
@@ -26,13 +26,9 @@ AMOUNT = 1000 # 500–1 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}")
|
||||||
|
|||||||
@@ -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__":
|
||||||
|
|||||||
@@ -25,21 +25,15 @@ AMOUNT = 500 # 50–1 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__":
|
||||||
|
|||||||
@@ -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
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user