-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathtele_bot.py
More file actions
131 lines (110 loc) · 4.83 KB
/
tele_bot.py
File metadata and controls
131 lines (110 loc) · 4.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import asyncio
import httpx
import uuid
import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes
from src.utils.data import ordered_sum
from src.utils.crypto import sign_message
from src.models.tx import check_valid_key
import json
# Настройка логирования
logging.basicConfig(
level=logging.WARNING,
format='%(asctime)s - %(levelname)s - %(message)s'
)
#logging.getLogger('telegram').setLevel(logging.WARNING)
#logging.getLogger('httpx').setLevel(logging.WARNING)
logger = logging.getLogger(__name__)
# Конфигурация
HOST = "https://yat.io"
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Обработчик команды /start"""
await update.message.reply_text(
"Привет! Я бот для отправки транзакций. Используй /faucet <address> для получения 1 монеты на указанный адрес."
)
async def send_transaction(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Обработчик команды /faucet для отправки транзакции"""
if not context.args:
await update.message.reply_text("Ошибка: укажи адрес! Пример: /faucet <address>")
return
debit_address = context.args[0]
# Валидация адреса получателя
try:
check_valid_key(debit_address)
except ValueError as e:
await update.message.reply_text(f"Ошибка: неверный формат адреса! {str(e)}")
return
async with httpx.AsyncClient() as client:
try:
credit = "Hm4GGGtBGiLzHoVSTvXqz5JoV9JXqJWiYrZvXp6GCy4L"
priv = "2kh7tB5iN6B8tvgz92jAsbonSqRXiaZFdaJ99uLyKnCL"
# Проверка, что адрес не совпадает с отправителем
if debit_address == credit:
await update.message.reply_text("Ошибка: нельзя отправить транзакцию самому себе!")
return
# Формирование транзакции
amount = 1_000_000
uniq = str(uuid.uuid4())
msg = "Удачного тестирования!"
# Получение пула родителей
p = await client.get(f'{HOST}/pool')
parents = p.json().get("nodes", [])
tx = {
"parents": parents,
"debit": debit_address,
"credit": credit,
"amount": amount,
"uniq": uniq,
"msg": msg
}
message = ordered_sum(tx)
signature = sign_message(priv, message)
tx_data = {
"content": tx,
"sign": signature
}
logger.info(f"Sending transaction: {json.dumps(tx_data, indent=2)}")
response = await client.post(f'{HOST}/send', data=json.dumps(tx_data))
logger.info(f"Response: {response.text}")
if response.status_code == 200:
await update.message.reply_text(f"Транзакция отправлена! Uniq: {uniq}")
print(f"SEND to {debit_address}")
else:
await update.message.reply_text(f"Ошибка при отправке: {response.text}")
except Exception as e:
logger.error(f"Error in send_transaction: {e}")
await update.message.reply_text(f"Ошибка: {str(e)}")
async def main():
"""Основная функция для запуска бота"""
bot_token = "TOKEN"
application = Application.builder().token(bot_token).build()
# Регистрация обработчиков команд
application.add_handler(CommandHandler("start", start))
application.add_handler(CommandHandler("faucet", send_transaction))
# Запуск бота
logger.info("Starting Telegram bot...")
try:
await application.initialize()
await application.start()
await application.updater.start_polling(allowed_updates=Update.ALL_TYPES)
# Держим цикл событий открытым
await asyncio.Event().wait()
finally:
await application.updater.stop()
await application.stop()
await application.shutdown()
def run():
"""Запуск бота в текущем цикле событий или создание нового"""
try:
loop = asyncio.get_running_loop()
except RuntimeError:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(main())
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()
if __name__ == "__main__":
run()