101 lines
3.4 KiB
Python
101 lines
3.4 KiB
Python
import random
|
||
import threading
|
||
import time
|
||
import asyncio
|
||
import aiohttp
|
||
from loguru import logger
|
||
from concurrent.futures import ThreadPoolExecutor
|
||
|
||
from tonutils.client import TonapiClient, ToncenterV3Client
|
||
from tonutils.utils import to_amount
|
||
from tonutils.wallet import (
|
||
WalletV3R1,
|
||
WalletV3R2,
|
||
WalletV4R1,
|
||
WalletV4R2,
|
||
WalletV5R1,
|
||
HighloadWalletV2,
|
||
HighloadWalletV3,
|
||
)
|
||
|
||
# 配置日志文件输出
|
||
# 按天分割日志文件,文件名包含日期,保留所有日志文件
|
||
logger.add("wallet_log_{time:YYYY-MM-DD}.log", rotation="1 day", retention="9999 days")
|
||
|
||
# API key for accessing the Tonapi (obtainable from https://tonconsole.com)
|
||
API_KEY = "AFMEX4F23ZRPOUIAAAAPHGIE5QECWZA5M75E54VD72O5IJEGP5IW3LOTXO7Z4QOX7MV6JQQ"
|
||
|
||
# Set to True for test network, False for main network
|
||
IS_TESTNET = False
|
||
|
||
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',
|
||
}
|
||
|
||
|
||
async def get_ton_num_async(session, address):
|
||
for i in range(3):
|
||
try:
|
||
async with session.get(
|
||
f'https://tonapi.io/v2/accounts/{address}',
|
||
headers=headers
|
||
) as response:
|
||
data = await response.json()
|
||
return to_amount(int(data["balance"]))
|
||
except Exception as e:
|
||
await asyncio.sleep(random.random())
|
||
return False
|
||
|
||
|
||
async def main(i) -> None:
|
||
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:
|
||
balance = await get_ton_num_async(session, wallet.address.to_str(is_user_friendly=True, is_url_safe=True,
|
||
is_bounceable=False, is_test_only=False))
|
||
if balance:
|
||
logger.info(
|
||
f"余额:{balance} Address: {wallet.address.to_str(is_user_friendly=True, is_url_safe=True, is_bounceable=False, is_test_only=False)},D:{' '.join(mnemonic)},")
|
||
else:
|
||
|
||
print(
|
||
f"{i},余额:{balance} Address: {wallet.address.to_str(is_user_friendly=True, is_url_safe=True, is_bounceable=False, is_test_only=False)},D:{' '.join(mnemonic)},")
|
||
|
||
|
||
async def run_tasks():
|
||
tasks = []
|
||
|
||
n = 0
|
||
while True:
|
||
|
||
n += 1
|
||
|
||
task = asyncio.create_task(main(i=n))
|
||
tasks.append(task)
|
||
await asyncio.sleep(random.random())
|
||
# 可以根据实际情况设置任务数量上限,避免创建过多任务
|
||
if len(tasks) > 100:
|
||
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
|
||
tasks = list(pending)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(run_tasks())
|