This commit is contained in:
ddrwode
2025-11-27 15:15:44 +08:00
parent 9e990e3dae
commit 649f2656a3
5 changed files with 126 additions and 23 deletions

View File

@@ -0,0 +1,86 @@
import random
import asyncio
import aiohttp
from loguru import logger
from tonutils.client import ToncenterV3Client
from tonutils.utils import to_amount
from tonutils.wallet import WalletV4R2
# 日志尽量减少 IO
logger.add("wallet_log_{time:YYYY-MM-DD}.log", rotation="1 day", retention="30 days")
API_KEY = "AFMEX4F23ZRPOUIAAAAPHGIE5QECWZA5M75E54VD72O5IJEGP5IW3LOTXO7Z4QOX7MV6JQQ"
IS_TESTNET = False
headers = {
"accept": "*/*",
"authorization": "Bearer AFPJTKEBPOX3AIYAAAAKA2HWOTRNJP5MUCV5DMDCZAAOCPSAYEYS3CILNQVLF2HWKED6US",
"content-type": "application/json",
"user-agent": "Mozilla/5.0",
}
# 全局复用 Toncenter client
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=10, max_retries=1)
async def get_balance(session, address: str):
url = f"https://tonapi.io/v2/accounts/{address}"
for _ in range(2): # 降低重试次数提升速度
try:
async with session.get(url, headers=headers, timeout=3) as r:
data = await r.json()
return to_amount(int(data.get("balance", 0)))
except Exception:
await asyncio.sleep(0.05) # 小延迟即可
return None
async def handle_wallet(session, idx: int):
wallet, public_key, private_key, mnemonic = WalletV4R2.create(client)
address = wallet.address.to_str(
is_user_friendly=True,
is_url_safe=True,
is_bounceable=False,
is_test_only=False
)
balance = await get_balance(session, address)
if balance:
logger.info(f"[{idx}] Balance={balance} | {address} | Mnemonic={' '.join(mnemonic)}")
else:
print(f"[{idx}] 余额查询失败 | {address},余额:{balance}")
async def worker(worker_id, session, queue):
while True:
idx = await queue.get()
await handle_wallet(session, idx)
queue.task_done()
async def main():
queue = asyncio.Queue()
# 单一 Session 复用,性能最优
async with aiohttp.ClientSession() as session:
# 启动固定数量 Worker提高并行效率
workers = [asyncio.create_task(worker(i, session, queue)) for i in range(20)]
counter = 0
while True:
counter += 1
await queue.put(counter)
# 控制生成速度
await asyncio.sleep(0.01)
for w in workers:
w.cancel()
if __name__ == "__main__":
asyncio.run(main())

View File

@@ -1,26 +1,43 @@
import threading
import random
import time
def daemon_thread_function():
print("守护线程开始")
time.sleep(5)
print("守护线程结束")
import requests
from tonutils.utils import to_amount
def non_daemon_thread_function():
print("非守护线程开始")
time.sleep(2)
print("非守护线程结束")
# 创建守护线程
daemon_thread = threading.Thread(target=daemon_thread_function, daemon=True)
# 创建非守护线程
non_daemon_thread = threading.Thread(target=non_daemon_thread_function)
def get_ton_num(address):
headers = {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'authorization': 'Bearer AFPJTKEBPOX3AIYAAAAKA2HWOTRNJP5MUCV5DMDCZAAOCPSAYEYS3CILNQVLF2HWKED6USY',
'cache-control': 'no-cache',
'content-type': 'application/json',
'dnt': '1',
'origin': 'https://tonviewer.com',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://tonviewer.com/',
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Microsoft Edge";v="132"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0',
}
# 启动线程
daemon_thread.start()
non_daemon_thread.start()
for i in range(3):
try:
response = requests.get(
f'https://tonapi.io/v2/accounts/{address}',
headers=headers,
)
print("主线程继续执行")
# 主线程等待非守护线程结束
non_daemon_thread.join()
print("主线程结束")
return to_amount(int(response.json()["balance"]))
except:
time.sleep(random.random())
return False
if __name__ == '__main__':
print(get_ton_num(address="EQD-8WpOhknZ6Wip9EN-jz5Tw-SJvYgu_x2FSDFlXH1kSo2O"))

View File

@@ -64,7 +64,7 @@ async def get_ton_num_async(session, address):
async def main(i) -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=3, max_retries=3)
wallet, public_key, private_key, mnemonic = WalletV4R2.create(client)
async with aiohttp.ClientSession() as session:

View File

@@ -87,7 +87,7 @@ def get_ton_num(address):
async def main(i) -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=2, max_retries=1)
wallet, public_key, private_key, mnemonic = WalletV4R2.create(client)
for i1 in range(5):

View File

@@ -19,7 +19,7 @@ IS_TESTNET = True
def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=3, max_retries=3)
wallet, public_key, private_key, mnemonic = WalletV4R2.create(client)
# Uncomment and use the following lines to create different wallet versions: