介绍
电报(Telegram)提供了强大的API,允许开发者创建各种功能的机器人。本文将介绍如何使用Python和Pyrogram库开发一个红包扫雷机器人。红包扫雷是一种有趣的游戏,用户可以在群组中发送红包,其他用户可以抢红包并有机会中雷。
效果展示如下:
准备工作
在开始开发之前,我们需要完成以下准备工作:
申请Telegram机器人:在Telegram中搜索@BotFather,创建一个新机器人并获取API Token。 创建电报机器人的教程请参考: 电报申请机器人教程
安装必要的库: pip install pyrogram pip install tgcrypto
环境配置
在开始编写代码之前,我们需要配置开发环境。确保你已经安装了Python 3.10或更高版本,并且已经安装了上述必要的库。
机器人初始化
首先,创建一个Python文件(例如bot.py),并初始化机器人:
from pyrogram import Client, filters
app = Client("hongbao_bot", api_id="YOUR_API_ID", api_hash="YOUR_API_HASH", bot_token="YOUR_BOT_TOKEN")
@app.on_message(filters.command("start"))
async def start(client, message):
await message.reply("欢迎使用红包扫雷机器人!")
app.run()
在上面的代码中,我们使用Pyrogram库初始化了一个Telegram机器人,并定义了一个简单的/start命令来欢迎用户。
用户注册与管理
为了管理用户,我们需要在用户加入群组时自动注册用户信息:
@app.on_message(filters.group & filters.new_chat_members)
async def welcome(client, message):
telegram_userid = message.from_user.id
group_id = message.chat.id
telegram_username = message.from_user.username
# 记录用户信息
await client.send_message(chat_id=message.chat.id, text="欢迎加入!")
在这里,我们使用filters.new_chat_members过滤器来检测新成员加入群组的事件,并记录用户信息。
红包功能实现
识别红包指令
我们需要识别用户发送的红包指令,并处理发包逻辑:
import re
@app.on_message(filters.group & filters.text)
async def gamecomm(client, message):
if (mat := re.match(r'(\d+)-(\d+)', message.text)):
if int(mat.group(2)) <= 0:
return await message.reply_text('雷的数字范围为:[1-9]', quote=True)
await send_lucky_message(client, message, mat)
async def send_lucky_message(client, message, mat):
# 处理发包逻辑
await client.send_message(chat_id=message.chat.id, text=f"红包金额: {mat.group(1)}U, 中雷数: {mat.group(2)}")
在这里,我们使用正则表达式来匹配红包指令,并调用send_lucky_message函数来处理发包逻辑。
发包逻辑
将红包信息发送到群组:
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton
async def show_lucky(client, chatid, luckyinfo):
caption = (
"**# 红包信息**\n"
f"[{luckyinfo['username']}] 发出了一个红包\n"
f"红包金额: {luckyinfo['usdtCount']}U\n"
f"中雷数: {luckyinfo['lei']}\n"
)
button = InlineKeyboardMarkup([[InlineKeyboardButton('✋ 抢红包', callback_data='grab')]])
await client.send_message(chat_id=chatid, text=caption, reply_markup=button)
在这里,我们使用InlineKeyboardMarkup和InlineKeyboardButton来创建一个抢红包的按钮,并将红包信息发送到群组。
抢红包逻辑
处理用户点击抢红包按钮的逻辑:
@app.on_callback_query(filters.regex("grab"))
async def grab_redpack(client, callback_query):
# 处理抢红包逻辑
await callback_query.answer("你抢到了一个红包!")
在这里,我们使用filters.regex过滤器来检测用户点击抢红包按钮的事件,并处理抢红包逻辑。
结果统计与发送
统计结果并发送给用户:
async def send_results(client, chatid, results):
caption = (
"**# 红包结果**\n"
f"总金额: {results['total']}U\n"
f"中奖用户: {results['winners']}\n"
)
await client.send_message(chat_id=chatid, text=caption)
在这里,我们统计红包结果并将结果发送到群组。
高级功能
数据库集成 为了持久化存储用户和红包信息,我们可以将数据库集成到机器人中。这里以SQLite为例:
import sqlite3
# 创建数据库连接
conn = sqlite3.connect('hongbao.db')
c = conn.cursor()
# 创建用户表
c.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY, telegram_userid INTEGER, username TEXT)''')
# 创建红包表
c.execute('''CREATE TABLE IF NOT EXISTS hongbao
(id INTEGER PRIMARY KEY, amount INTEGER, lei INTEGER, user_id INTEGER)''')
conn.commit()
# 插入用户信息
def insert_user(telegram_userid, username):
c.execute("INSERT INTO users (telegram_userid, username) VALUES (?, ?)", (telegram_userid, username))
conn.commit()
# 插入红包信息
def insert_hongbao(amount, lei, user_id):
c.execute("INSERT INTO hongbao (amount, lei, user_id) VALUES (?, ?, ?)", (amount, lei, user_id))
conn.commit()
在这里,我们创建了一个SQLite数据库,并定义了用户表和红包表。
日志记录
为了更好地调试和维护机器人,我们可以添加日志记录功能:
import logging
# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
@app.on_message(filters.command("start"))
async def start(client, message):
logger.info(f"User {message.from_user.id} started the bot.")
await message.reply("欢迎使用红包扫雷机器人!")
在这里,我们使用Python的logging模块来记录日志信息。
错误处理
为了提高机器人的稳定性,我们需要处理可能出现的错误:
@app.on_message(filters.command("start"))
async def start(client, message):
try:
await message.reply("欢迎使用红包扫雷机器人!")
except Exception as e:
logger.error(f"Error in start command: {e}")
await message.reply("发生错误,请稍后再试。")
在这里,我们使用try-except块来捕获并处理可能出现的错误。
部署与维护
在开发完成后,我们需要将机器人部署到服务器上,并进行日常维护。这里以Heroku为例:
创建Procfile: worker: python bot.py
创建requirements.txt: pyrogram tgcrypto sqlite3
部署到Heroku: heroku create git add . git commit -m “Initial commit” git push heroku master heroku ps:scale worker=1
结论
通过以上步骤,你已经成功开发并部署了一个功能完善的电报红包扫雷机器人。你可以根据需要进一步扩展和优化机器人的功能,例如添加更多的游戏玩法、集成更多的数据库类型、优化性能等。