Передача NFT в подарок через Aiogram и бизнес бота в Telegram
Хочу себе такие же кнопкиСодержимое статьи:
Эта статья расскажет, как реализовать функцию передачи NFT в подарок с использованием библиотеки Aiogram для создания Telegram-бота и интеграции с бизнес-логикой бота. Мы рассмотрим основные шаги и концепции, необходимые для реализации этой функциональности.
Подготовка
Прежде чем начать, убедитесь, что у вас есть следующее:
- Установленный Python (версия 3.7 и выше).
- Установленные библиотеки:
aiogrampython-dotenv(для хранения токенов и ключей)- Библиотека для взаимодействия с вашим блокчейном (например,
web3.pyдля Ethereum)
Установите их с помощью pip:
pip install aiogram python-dotenv web3 - Аккаунт разработчика Telegram и полученный API токен для вашего бота.
- Доступ к API вашего NFT-контракта.
- Приватный ключ аккаунта, с которого будут отправляться NFT. Важно: Храните приватный ключ в безопасном месте и никогда не коммитьте его в репозиторий!
Шаги реализации
- Настройка окружения:
- Создайте файл
.envдля хранения конфиденциальной информации:
TELEGRAM_TOKEN=YOUR_TELEGRAM_BOT_TOKEN
PRIVATE_KEY=YOUR_PRIVATE_KEY
CONTRACT_ADDRESS=YOUR_NFT_CONTRACT_ADDRESS
NETWORK_RPC_URL=YOUR_NETWORK_RPC_URL (например, Infura) - Загрузите переменные окружения в ваш скрипт Python:
from dotenv import load_dotenv
import os
load_dotenv()
TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")
PRIVATE_KEY = os.getenv("PRIVATE_KEY")
CONTRACT_ADDRESS = os.getenv("CONTRACT_ADDRESS")
NETWORK_RPC_URL = os.getenv("NETWORK_RPC_URL")- Инициализация Aiogram бота:
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
bot = Bot(token=TELEGRAM_TOKEN)
dp = Dispatcher(bot) - Инициализация Web3:
from web3 import Web3
from web3.middleware import geth_poa_middleware
w3 = Web3(Web3.HTTPProvider(NETWORK_RPC_URL))
# Для сетей Proof-of-Authority (PoA), таких как Polygon, добавьте middleware
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
# Загрузите ABI контракта (Application Binary Interface)
with open('path/to/your/contract_abi.json', 'r') as f:
contract_abi = json.load(f)
contract = w3.eth.contract(address=CONTRACT_ADDRESS, abi=contract_abi)Важно: Замените
path/to/your/contract_abi.jsonна фактический путь к вашему файлу ABI. ABI описывает функции и структуру вашего NFT-контракта. - Создание обработчика команды /gift:
@dp.message_handler(commands=['gift'])
async def gift_nft(message: types.Message):
# Получаем ID NFT и ID пользователя, которому отправляем.
# Ожидаем команду в формате: /gift <nft_id> <@username>
try:
args = message.get_args().split()
nft_id = int(args[0])
recipient_username = args[1]
# Проверяем валидность введенных данных.
if not recipient_username.startswith('@'):
await message.reply("Укажите имя пользователя получателя, начиная с @.")
return
# Получаем ID получателя из имени пользователя.
# Внимание: Этот метод требует, чтобы у бота были права на получение информации о пользователе.
recipient_id = None
try:
recipient = await bot.get_chat_member(message.chat.id, message.from_user.id)
# Поиск пользователя в списке участников чата
async for chat_member in bot.get_chat_members(message.chat.id):
if chat_member.user.username == recipient_username[1:]:
recipient_id = chat_member.user.id
break
except Exception as e:
await message.reply(f"Не удалось найти пользователя {recipient_username}. Убедитесь, что он находится в этом чате. Ошибка: {e}")
return
if recipient_id is None:
await message.reply(f"Не удалось найти пользователя {recipient_username}. Убедитесь, что он находится в этом чате.")
return
# Внимание: Дальнейшая логика предполагает наличие метода получения адреса кошелька пользователя по его ID в Telegram.
recipient_address = await get_wallet_address_from_telegram_id(recipient_id)
if recipient_address is None:
await message.reply("Не удалось получить адрес кошелька получателя. Проверьте, зарегистрирован ли пользователь в вашей системе.")
return
# Транзакция передачи NFT.
try:
tx_hash = await transfer_nft(nft_id, recipient_address)
await message.reply(f"NFT (ID: {nft_id}) успешно отправлен пользователю {recipient_username}.\nТранзакция: {tx_hash}")
except Exception as e:
await message.reply(f"Произошла ошибка при отправке NFT: {e}")
except (ValueError, IndexError):
await message.reply("Неверный формат команды. Используйте: /gift <nft_id> <@username>") - Функция для получения адреса кошелька пользователя по Telegram ID:
# Пример функции, которую нужно реализовать в соответствии с вашей бизнес-логикой.
async def get_wallet_address_from_telegram_id(telegram_id: int) -> str:
# Здесь должна быть логика получения адреса кошелька из вашей базы данных или API.
# Например:
# user = await User.get(telegram_id=telegram_id)
# return user.wallet_address
#
# Важно: Если пользователь не зарегистрирован в вашей системе и у него нет кошелька, функция должна возвращать None.
# В данном примере возвращаем None, чтобы показать необходимость реализации.
return None - Функция для передачи NFT:
async def transfer_nft(nft_id: int, recipient_address: str) -> str:
"""Переводит NFT с указанным ID на указанный адрес."""
# Получаем nonce для отправителя.
nonce = w3.eth.get_transaction_count(w3.eth.account.from_key(PRIVATE_KEY).address)
# Создаем транзакцию для передачи NFT.
# Предполагается наличие функции safeTransferFrom в вашем контракте.
# Подробную реализацию safeTransferFrom надо смотреть в вашем NFT контракте.
transfer_function = contract.functions.safeTransferFrom(
w3.eth.account.from_key(PRIVATE_KEY).address, # Отправитель
recipient_address, # Получатель
nft_id, # ID токена
1 # Количество (обычно 1 для NFT)
)
# Строим транзакцию.
transaction = transfer_function.build_transaction({
'nonce': nonce,
'gas': 200000, # Примерное значение gas limit. Его нужно подобрать.
})
# Подписываем транзакцию приватным ключом.
signed_transaction = w3.eth.account.sign_transaction(transaction, PRIVATE_KEY)
# Отправляем транзакцию.
transaction_hash = w3.eth.send_raw_transaction(signed_transaction.rawTransaction)
return transaction_hash.hex() - Запуск бота:
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)Дополнительные замечания
- Инициализация Aiogram бота:
- Безопасность: Крайне важно безопасно хранить приватный ключ. Используйте переменные окружения, KMS (Key Management Service) или другие безопасные методы хранения. Никогда не коммитьте приватный ключ в репозиторий.
- Обработка ошибок: Необходимо предусмотреть обработку ошибок в каждом шаге, особенно при взаимодействии с блокчейном.
- Газ: Подбор gas limit - важная задача. Недостаточный gas limit приведет к неудачной транзакции. Избыточный gas приведет к переплате.
- Асинхронность: Aiogram использует асинхронность. Убедитесь, что все операции, взаимодействующие с сетью, также асинхронные.
- Бизнес-логика: Представленный код - это базовый пример. Реальная бизнес-логика (например, проверка наличия NFT у отправителя, интеграция с базой данных пользователей) должна быть реализована в соответствии с требованиями вашего проекта.
Альтернативные варианты
- Использование токенов ERC-1155 - дает возможность отправлять более 1 NFT за раз.
- Использование pre-signed transactions - позволяет пользователям отправлять NFT, не имея ETH на балансе.
Академия MAED: онлайн-курсы интернет-маркетинга
Azino Mobile казино: слоты онлайн, бонусы и быстрый вывод денег
CamZamZam - онлайн снимки с веб камеры и блюром
Чат рулетка 2026: будущее случайного общения
Что делать, если нейросеть не создаёт видео правильно
Декодирование QR-кодов онлайн
Гайд по веткам тяжелых танков какие направления выбрать и как играть
Как избежать багов при использовании нейросетевых видеогенераторов
Как измерить поведенческие факторы своего сайта: метрики и нормы
Как монетизировать группу Vkontakte
Как оптимизировать создание видео с нейросетями для социальных сетей
Как выбрать хостинг для мобильного сайта
Кассовое оборудование для гостиниц
Лучшие практики создания видео с помощью нейросети в 2023 году
Онлайн-обмен
Партнёрская программа без блога: как получать доход через Telegram
Популярные игры Cartoon Network на мобильных устройствах
Практические советы по использованию нейросетевых инструментов для создания видео
Ready or Not обзор сурового тактического шутера без поблажек и пафоса
Ready or Not обзор сурового тактического шутера без поблажек и пафоса
Регистрация ИП в Москве с получением выписки из ЕГРЮЛ
Ремонт старого дома
Специалист по анализу доменных рынков
Сравнение функций нейросетевых видеогенераторов: профессиональные рекомендации
Сравнение видео-редакторов: Canva против нейросетей
Стильные сумки с вышивкой
Технологии строительства пешеходных дорожек
Узбекские фильмы 2023
Видео рандомный собеседник
Видеорегистраторы с функцией GPS
Витрина кукол Лол
Выбор лучшего нейросетевого видеогенератора: обзор и сравнение
WordPress блог для начинающих
Заболевания горла: симптомы и лечение


Follow Gidin on Twitter!