Telegram不仅是一款即时通讯工具,还内置了强大的游戏平台。借助机器人API,开发者可以创建HTML5游戏并直接嵌入聊天界面,用户无需离开Telegram即可畅玩。本文将从零开始,教你如何开发一个支持邀请功能的Telegram游戏机器人,涵盖游戏创建、消息发送、回调处理以及邀请机制,并给出可运行的Python代码实例。
什么是Telegram机器人的HTML5游戏?
Telegram的HTML5游戏是一种基于网页技术的轻量级游戏,通过机器人发送游戏卡片(Game Card)展示给用户。用户点击卡片即可全屏启动游戏,完成后可提交分数,并与好友比较排名。机器人通过sendGame方法发送游戏,同时利用内联查询(Inline Query)和分享按钮实现邀请对手或好友加入游戏,极大提升了社交互动性。
准备工作:创建机器人与获取Token
在开始之前,请确保你已完成以下步骤:
- 在Telegram中向@BotFather发送
/newbot创建机器人,并获取API Token。 - 准备一个已经部署到公网的HTML5游戏URL(HTTPS),并支持通过URL参数传递玩家信息和游戏数据。
- 安装Python环境及
python-telegram-bot库:pip install python-telegram-bot
通过BotFather配置游戏
Telegram要求游戏必须先通过BotFather注册。操作步骤如下:
- 向@BotFather发送
/newgame,根据提示选择你的机器人。 - 输入游戏名称(英文短名)和游戏描述。
- 上传游戏图标(640x360像素的静态图片或动画GIF)。
- 设置游戏URL,即你的HTML5游戏部署地址。
配置完成后,BotFather会返回游戏的short_name,这就是后续调用API所需的重要参数。
开发机器人发送游戏邀请
使用sendGame方法可以向指定聊天发送游戏卡片。下面是一个基于python-telegram-bot的完整示例,机器人监听/game命令并发送游戏邀请:
import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes
TOKEN = "YOUR_BOT_TOKEN"
GAME_SHORT_NAME = "my_awesome_game"
async def game(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.effective_chat.id
await context.bot.send_game(
chat_id=chat_id,
game_short_name=GAME_SHORT_NAME
)
def main():
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("game", game))
app.run_polling()
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
main()
运行机器人后,在聊天中输入/game,用户将看到游戏卡片,点击即可游玩。
处理游戏回调与得分
用户玩完游戏后,你的HTML5游戏会通过Telegram的JavaScript SDK将得分发送到机器人。机器人需要处理CallbackQuery,并通过answerCallbackQuery回复成绩。同时,还需调用setGameScore更新排行榜。
以下代码展示了如何处理游戏回调并更新分数:
from telegram import Update, InlineQueryResultGame, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import CallbackQueryHandler, Application
async def game_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
user_id = query.from_user.id
chat_id = query.message.chat_id
message_id = query.message.message_id
# 从回调数据中获取分数(假设你的游戏通过callback_data传递score)
score = int(query.data.split(":")[1])
# 更新玩家得分
await context.bot.set_game_score(
user_id=user_id,
score=score,
chat_id=chat_id,
message_id=message_id,
force=True
)
await query.answer(text="分数已保存!")
app.add_handler(CallbackQueryHandler(game_callback, pattern="^game_score:"))
邀请功能实现:内联查询与分享按钮
为了让玩家邀请好友,Telegram支持两种核心机制:
1. 内联查询(Inline Query)
用户可以通过输入机器人用户名和游戏名,以内联方式直接发送游戏邀请。只需实现inline_query处理器并返回InlineQueryResultGame:
from telegram import InlineQueryResultGame
from telegram.ext import InlineQueryHandler
async def inline_query(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.inline_query.query
# 假设用户输入的游戏短名匹配
if query == GAME_SHORT_NAME:
result = InlineQueryResultGame(
id="1",
game_short_name=GAME_SHORT_NAME,
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("挑战好友", callback_data="challenge")]])
)
await update.inline_query.answer([result])
app.add_handler(InlineQueryHandler(inline_query))
2. 分享按钮与挑战好友
游戏卡片支持InlineKeyboardButton,可以添加“分享给好友”或“挑战”按钮。当用户点击按钮时,机器人会生成一条带有游戏链接的分享消息。你可以通过switch_inline_query或url属性实现:
# 在游戏卡片中加入分享按钮
button = InlineKeyboardButton(
text="邀请好友挑战",
switch_inline_query=GAME_SHORT_NAME
)
reply_markup = InlineKeyboardMarkup([[button]])
# 修改send_game调用,附加reply_markup
await context.bot.send_game(
chat_id=chat_id,
game_short_name=GAME_SHORT_NAME,
reply_markup=reply_markup
)
最佳实践与注意事项
- HTTPS必选:游戏URL必须使用HTTPS,否则Telegram拒绝加载。
- 短名唯一:游戏短名在机器人内唯一,创建后不可修改,请谨慎命名。
- 处理未保存的分数:当用户在私聊中玩游戏,没有关联的聊天消息时,
set_game_score可能会失败,需做好错误处理。 - 使用Webhook提高响应速度:生产环境建议使用Webhook替代长轮询。
- 安全验证:通过HTTP头中的
X-Telegram-Bot-Api-Secret-Token验证请求来源,防止伪造回调。
总结
通过上述步骤,你已经掌握了Telegram机器人HTML5游戏邀请功能的开发方法。从BotFather配置到sendGame发送,再到内联邀请和分数处理,这一完整的闭环能为用户提供流畅的社交游戏体验。继续探索官方API文档,你还可以扩展更多功能,如多人实时对战、排行榜等。现在,动手创建属于你的游戏机器人吧!