You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Telethon机器人中实现自定义昵称全局调用(含内联按钮需求)

Telethon机器人自定义昵称实现方案

1. 替换全局变量:用数据库持久化存储用户昵称

全局变量无法区分不同用户,且机器人重启后数据会丢失,直接用SQLite数据库存储每个用户ID与对应昵称是最可靠的方案。

初始化数据库与工具函数

import sqlite3
from telethon import TelegramClient, events, Button

# 初始化数据库连接
conn = sqlite3.connect('user_nicknames.db')
cursor = conn.cursor()

# 创建用户昵称表(不存在则自动创建)
cursor.execute('''
CREATE TABLE IF NOT EXISTS nicknames (
    user_id INTEGER PRIMARY KEY,
    nickname TEXT
)
''')
conn.commit()

# 封装昵称存储与读取函数
def save_nickname(user_id, nickname):
    cursor.execute('REPLACE INTO nicknames (user_id, nickname) VALUES (?, ?)', (user_id, nickname))
    conn.commit()

def get_nickname(user_id):
    cursor.execute('SELECT nickname FROM nicknames WHERE user_id = ?', (user_id,))
    result = cursor.fetchone()
    return result[0] if result else None

2. 用内联按钮触发昵称设置流程

去掉前缀命令,实现点击按钮后直接输入昵称的交互:

  • 发送带内联按钮的触发消息
  • 捕获按钮点击事件,提示用户输入昵称
  • 监听用户输入,存入数据库并反馈结果

完整功能代码

# 假设你已完成TelegramClient的初始化:bot = TelegramClient(...)

# 存储正在等待输入昵称的用户ID(避免多用户冲突)
waiting_users = set()

@bot.on(events.NewMessage(pattern='/start'))
async def start(event):
    await event.respond(
        '欢迎使用!点击下方按钮设置你的自定义昵称:',
        buttons=[Button.inline('设置昵称', b'set_nickname')]
    )

# 处理内联按钮点击事件
@bot.on(events.CallbackQuery(data=b'set_nickname'))
async def handle_set_nickname(event):
    await event.respond('请输入你的自定义昵称:')
    waiting_users.add(event.sender_id)

# 处理用户输入的昵称
@bot.on(events.NewMessage(func=lambda e: e.sender_id in waiting_users))
async def save_user_nickname(event):
    nickname = event.text.strip()
    save_nickname(event.sender_id, nickname)
    await event.respond(f'你的昵称已设置为:{nickname},以后我会用这个称呼你~')
    waiting_users.remove(event.sender_id)

# 示例:在其他功能中调用昵称
@bot.on(events.NewMessage(pattern='/hello'))
async def say_hello(event):
    user_id = event.sender_id
    nickname = get_nickname(user_id)
    if nickname:
        await event.respond(f'你好呀,{nickname}!')
    else:
        await event.respond(
            '你好呀!还没设置昵称的话,点击下方按钮设置吧~',
            buttons=[Button.inline('设置昵称', b'set_nickname')]
        )

补充说明

  • waiting_users集合用于临时跟踪需要处理昵称输入的用户,避免多用户操作时的消息捕获冲突
  • SQLite数据库会持久化存储昵称,机器人重启后数据不会丢失
  • 如果需要更复杂的状态管理,可扩展为用字典存储用户当前操作阶段,但上述方案足以覆盖基础需求

内容的提问来源于stack exchange,提问作者Лиза Goodbye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:22:43