## 背景说明
如果顾客每天反复询问价格、营业时间和订单进度,最省事的做法不是让机器人回答所有问题,而是把高频问题变成一组一键入口:顾客点“查订单”“看价格”或“联系人工”,机器人立即给出对应指引。这样比要求用户记住命令或输入完整句子更快捷,也能减少答非所问。
下面以小型网店客服为例,演示如何用 Telegram Bot API 做一个轻量版自动对话。它包括菜单按钮、关键词触发和订单号收集提示。注意:示例不会读取真实订单数据库;如需自动查单,还要连接你的订单系统或客服平台。
第一步:创建机器人并保存访问令牌
- 在 Telegram 搜索官方账号
@BotFather,打开对话后发送/newbot。 - 按提示填写机器人显示名称和用户名。用户名通常需要以
bot结尾。 - 创建成功后,BotFather 会提供一串 Bot Token。它相当于机器人的访问密码,先保存在安全位置,不要发到群聊、网页或公开代码仓库。
这一步只创建机器人身份,不会自动产生对话逻辑。想让机器人按按钮或关键词作答,还需要配置流程并运行程序。
第二步:准备运行环境并安装组件
在电脑或服务器上安装 Python 3.10 及以上版本,然后打开终端执行:
python -m pip install python-telegram-bot建议把 Token 设置为环境变量,而不是直接写在代码里。Linux 或 macOS 终端可执行:
export TELEGRAM_BOT_TOKEN='替换为BotFather给你的Token'Windows PowerShell 可执行:
$env:TELEGRAM_BOT_TOKEN='替换为BotFather给你的Token'每次打开新的终端时,可能需要重新设置环境变量。若使用托管平台运行,则在平台的环境变量设置页面添加同名变量。
第三步:设置三键菜单和自动回复规则
新建 bot.py 文件,将下面代码复制进去。示例把常见问题做成按钮,同时为“价格”“营业时间”“人工”等文字设置快捷回复;选择查订单后,机器人会提示用户发送订单号,并说明后续需要人工核对。
import os
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, MessageHandler, ContextTypes, filters
TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
if not TOKEN:
raise RuntimeError('请先设置 TELEGRAM_BOT_TOKEN 环境变量')
def main_keyboard():
return InlineKeyboardMarkup([
[InlineKeyboardButton('查订单', callback_data='order'), InlineKeyboardButton('看价格', callback_data='price')],
[InlineKeyboardButton('营业时间', callback_data='hours'), InlineKeyboardButton('联系人工', callback_data='human')]
])
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
context.user_data['waiting_order'] = False
await update.message.reply_text('你好,请点选常见问题,少打字也能快速找到答案。', reply_markup=main_keyboard())
async def button_reply(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
if query.data == 'order':
context.user_data['waiting_order'] = True
text = '请发送订单号。我会记录你的咨询提示;当前示例不连接订单系统,订单状态需由客服核对。'
elif query.data == 'price':
text = '常见商品价格请查看店铺商品页。如需批量报价,请发送商品名称和数量。'
elif query.data == 'hours':
text = '客服时间:周一至周五 09:00–18:00。非工作时间可留言,客服上班后处理。'
else:
text = '请发送你的问题和相关订单号,客服会按队列回复。'
await query.edit_message_text(text, reply_markup=main_keyboard())
async def text_reply(update: Update, context: ContextTypes.DEFAULT_TYPE):
text = update.message.text.strip()
if context.user_data.get('waiting_order'):
context.user_data['waiting_order'] = False
await update.message.reply_text('已收到你提交的内容。此演示机器人不会查询真实订单,请通过菜单联系人工核对。', reply_markup=main_keyboard())
elif any(word in text for word in ('价格', '多少钱', '报价')):
await update.message.reply_text('价格请查看商品页;批量购买请发送商品名称和数量。', reply_markup=main_keyboard())
elif any(word in text for word in ('时间', '营业', '几点')):
await update.message.reply_text('客服时间:周一至周五 09:00–18:00。', reply_markup=main_keyboard())
elif any(word in text for word in ('人工', '客服', '真人')):
await update.message.reply_text('请点菜单中的“联系人工”,并附上问题和订单号。', reply_markup=main_keyboard())
else:
await update.message.reply_text('暂时没有匹配到快捷答案,请点选菜单,或发送“价格”“营业时间”“人工”。', reply_markup=main_keyboard())
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler('start', start))
app.add_handler(CallbackQueryHandler(button_reply))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, text_reply))
app.run_polling()把回复文案里的营业时间、商品说明改成自己的实际信息。代码最后一行的 & 是 HTML 中表示“与”的写法;如果你从网页复制代码,粘贴到 Python 文件后应改成普通的 & 字符(即 Python 的位运算符),不能保留 HTML 实体形式。
第四步:启动机器人并测试对话
在保存 bot.py 的目录打开终端,运行:
python bot.py回到 Telegram,搜索刚创建的机器人并发送 /start。依次点击“看价格”“营业时间”和“查订单”,再测试发送“人工”“多少钱”等关键词。检查机器人是否给出预期回复;如果没有响应,先确认程序仍在运行、Token 设置正确,并查看终端中的错误信息。
本示例使用轮询方式接收消息,适合本地试运行和低流量场景。正式部署时,可将程序放到持续运行的服务器或应用托管平台,并按部署环境配置 Token;不要同时启动多个相同轮询实例,以免出现冲突。
第五步:把快捷对话变成可维护的流程
建议把菜单控制在三到五个高频选项,按钮名称直接写用户熟悉的说法,例如“查订单”而不是“订单模块”。关键词也要覆盖常见表达:价格可以匹配“多少钱”“报价”,营业时间可以匹配“几点营业”“什么时候有人”。每次新增规则后都用几种不同说法测试,避免只测自己预想的一句话。
如果订单查询需要自动显示物流状态,下一步应在查单分支中调用店铺后台接口,并校验用户身份及订单权限。不要仅凭任何人输入的订单号就泄露地址、电话等个人信息。
注意事项
- 保护 Token:不要把令牌贴到公开群组或截图中。若意外泄露,可通过 BotFather 撤销并重新生成。
- 区分演示与真实业务:示例中的订单提示只是收集咨询意图,并不会访问订单数据。对用户应明确说明哪些环节需要人工处理。
- 避免关键词误触发:关键词尽量具体,回复也应提供下一步操作;对未识别内容设置清晰的兜底菜单。
- 注意隐私和权限:收集订单号前说明用途;接入后台接口时做好身份验证、权限检查和日志保护。
- 保持程序在线:本地电脑关机后机器人就会停止回复。需要持续服务时,应部署到可靠的运行环境并监控进程。
常见问题
问:只用 BotFather 能添加自动对话吗?
答:BotFather 主要用于创建和管理机器人资料,本身不负责配置完整的关键词回复流程。自动回复需要代码、机器人搭建平台或其他自动化服务。
问:用户必须输入 /start 才能用吗?
答:用户通常需要先打开机器人并开始对话,才能向它发送私聊消息。之后可以使用菜单按钮和你设置的关键词。
问:机器人能不能直接查订单?
答:可以,但需要连接订单系统或物流服务的接口,并按业务要求验证用户身份。上面的示例没有接入这些服务,因此不能返回真实订单状态。
问:按钮点了没反应怎么办?
答:确认程序正在运行,检查是否注册了回调处理器,并查看终端报错。若机器人部署在服务器上,还要确认服务没有休眠或退出。