带有自己余额的机器人
在本文中,我们将创建一个简单的Telegram机器人,用于接收TON支付。
🦄 外观
机器人将如下所示:
源代码
源代码可在GitHub上获得:
📖 你将学到什么
你将学会:
- 使用Aiogram在Python3中创建一个Telegram机器人
- 使用SQLITE数据库
- 使用公共TON API
✍️ 开始之前你需要
如果还没有安装Python,请先安装。
还需要以下PyPi库:
- aiogram
- requests
你可以在终端中用一条命令安装它们。
pip install aiogram==2.21 requests
🚀 开始吧!
为我们的机器人创建一个目录,其中包含四个文件:
bot.py
—运行Telegram机器人的程序config.py
—配置文件db.py
—与sqlite3数据库交互的模块ton.py
—处理TON支付的模块
目录应该看起来像这样:
my_bot
├── bot.py
├── config.py
├── db.py
└── ton.py
现在,让我们开始编写代码吧!
配置
我们先从config.py
开始,因为它是最小的一个。我们只需要在其中设置一些参数。
config.py
BOT_TOKEN = 'YOUR BOT TOKEN'
DEPOSIT_ADDRESS = 'YOUR DEPOSIT ADDRESS'
API_KEY = 'YOUR API KEY'
RUN_IN_MAINNET = True # Switch True/False to change mainnet to testnet
if RUN_IN_MAINNET:
API_BASE_URL = 'https://toncenter.com'
else:
API_BASE_URL = 'https://testnet.toncenter.com'
这里你需要在前三行填入值:
BOT_TOKEN
是你的Telegram机器人令牌,可以在创建机器人后获得。DEPOSIT_ADDRESS
是你的项目钱包地址,将接受所有支付。你可以简单地创建一个新的TON钱包并复制其地址。API_KEY
是你从TON Center获得的API密钥,可以在这个机器人中获得。
你还可以选择你的机器人是运行在测试网上还是主网上(第4行)。
配置文件就是这些了,我们可以继续向前了!
数据库
现在让我们编辑db.py
文件,该文件将处理我们机器人的数据库。
导入sqlite3库。
import sqlite3
初始化数据库连接和游标(你可以选择任何文件名,而不仅限于db.sqlite
)。
con = sqlite3.connect('db.sqlite')
cur = con.cursor()
为了存储关于用户的信息(在我们的案例中是他们的余额),创建一个名为"Users"的表,包含用户ID和余额行。
cur.execute('''CREATE TABLE IF NOT EXISTS Users (
uid INTEGER,
balance INTEGER
)''')
con.commit()
现在我们需要声明一些函数来处理数据库。
add_user
函数将用于将新用户插入数据库。
def add_user(uid):
# new user always has balance = 0
cur.execute(f'INSERT INTO Users VALUES ({uid}, 0)')
con.commit()
check_user
函数将用于检查用户是否存在于数据库中。
def check_user(uid):
cur.execute(f'SELECT * FROM Users WHERE uid = {uid}')
user = cur.fetchone()
if user:
return True
return False
add_balance
函数将用于增加用户的余额。
def add_balance(uid, amount):
cur.execute(f'UPDATE Users SET balance = balance + {amount} WHERE uid = {uid}')
con.commit()
get_balance
函数将用于检索用户的余额。
def get_balance(uid):
cur.execute(f'SELECT balance FROM Users WHERE uid = {uid}')
balance = cur.fetchone()[0]
return balance
db.py
文件的内容就这些了!
现在,我们可以在机器人的其他组件中使用这四个函数来处理数据库。
TON Center API
在ton.py
文件中,我们将声明一个函数,该函数将处理所有新的存款,增加用户余额,并通知用户。
getTransactions 方法
我们将使用TON Center API。他们的文档在这里: https://toncenter.com/api/v2/
我们需要getTransactions方法来获取某个账户最新交易的信息。
让我们看看这个方法作为输入参数需要什么以及它返回了什么。
只有一个必填的输入字段address
,但我们还需要limit
字段来指定我们想要返回多少个交易。
现在让我们尝试在TON Center 网站上运行这个方法,使用任何一个已存在的钱包地址,以了解我们应该从输出中得到什么。
{
"ok": true,
"result": [
{
...
},
{
...
}
]
}
好的,所以当一切正常时,ok
字段被设置为true
,并且我们有一个数组result
,列出了limit
最近的交易。现在让我们看看单个交易:
{
"@type": "raw.transaction",
"utime": 1666648337,
"data": "...",
"transaction_id": {
"@type": "internal.transactionId",
"lt": "32294193000003",
"hash": "ez3LKZq4KCNNLRU/G4YbUweM74D9xg/tWK0NyfuNcxA="
},
"fee": "105608",
"storage_fee": "5608",
"other_fee": "100000",
"in_msg": {
"@type": "raw.message",
"source": "EQBIhPuWmjT7fP-VomuTWseE8JNWv2q7QYfsVQ1IZwnMk8wL",
"destination": "EQBKgXCNLPexWhs2L79kiARR1phGH1LwXxRbNsCFF9doc2lN",
"value": "100000000",
"fwd_fee": "666672",
"ihr_fee": "0",
"created_lt": "32294193000002",
"body_hash": "tDJM2A4YFee5edKRfQWLML5XIJtb5FLq0jFvDXpv0xI=",
"msg_data": {
"@type": "msg.dataText",
"text": "SGVsbG8sIHdvcmxkIQ=="
},
"message": "Hello, world!"
},
"out_msgs": []
}
我们可以看到可以帮助我们识别确切交易的信息存储在transaction_id
字段中。我们需要从中获取lt
字段,以了解哪个交易先发生,哪个后发生。
关于coin转移的信息在in_msg
字段中。我们需要从中获取value
和message
。
现在我们准备好创建支付处理程序了。