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

如何在前端实现与Python终端交互式程序的交互操作

前端对接Telethon交互式认证的实现方案

你原来用的Client.start()默认绑定终端标准输入输出,没法直接对接Web前端,需要把认证流程拆成独立的请求步骤,适配前后端交互逻辑:

后端(Django侧)改造

首先重写Telethon的默认交互逻辑,把认证过程拆成4个独立接口,用缓存(推荐Redis)存储每个用户的认证上下文,避免跨用户会话串权:

from telethon import TelegramClient
from telethon.errors import SessionPasswordNeededError
from django.core.cache import cache
from django.http import JsonResponse

# 接口1:发起Telegram认证流程
def start_tg_auth(request):
    user_id = request.user.id
    # 每个用户生成独立的session文件,避免权限混淆
    client = TelegramClient(f"tg_session_{user_id}", YOUR_API_ID, YOUR_API_HASH)
    client.connect()
    # 临时存储客户端实例到缓存,有效期5分钟
    cache.set(f"tg_client_{user_id}", client, timeout=300)
    return JsonResponse({"status": "await_phone"})

# 接口2:提交手机号,请求发送验证码
def submit_phone(request):
    user_id = request.user.id
    client = cache.get(f"tg_client_{user_id}")
    if not client:
        return JsonResponse({"error": "认证会话已过期,请重新发起"}, status=400)
    
    phone = request.POST.get("phone")
    sent_code_info = client.send_code_request(phone)
    # 存储验证码请求上下文,后续校验要用
    cache.set(f"tg_code_info_{user_id}", sent_code_info, timeout=300)
    cache.set(f"tg_phone_{user_id}", phone, timeout=300)
    return JsonResponse({"status": "await_code"})

# 接口3:提交验证码
def submit_verify_code(request):
    user_id = request.user.id
    client = cache.get(f"tg_client_{user_id}")
    sent_code_info = cache.get(f"tg_code_info_{user_id}")
    phone = cache.get(f"tg_phone_{user_id}")
    
    if not all([client, sent_code_info, phone]):
        return JsonResponse({"error": "认证会话已过期,请重新发起"}, status=400)
    
    code = request.POST.get("verify_code")
    try:
        client.sign_in(phone, code, phone_code_hash=sent_code_info.phone_code_hash)
        cache.set(f"tg_auth_success_{user_id}", True, timeout=86400)
        return JsonResponse({"status": "success"})
    except SessionPasswordNeededError:
        # 账号开启了2FA,需要额外输入密码
        return JsonResponse({"status": "await_2fa"})

# 接口4:提交2FA密码
def submit_2fa_pwd(request):
    user_id = request.user.id
    client = cache.get(f"tg_client_{user_id}")
    if not client:
        return JsonResponse({"error": "认证会话已过期,请重新发起"}, status=400)
    
    pwd = request.POST.get("2fa_password")
    client.sign_in(password=pwd)
    cache.set(f"tg_auth_success_{user_id}", True, timeout=86400)
    return JsonResponse({"status": "success"})

注意:如果用Django默认的数据库/文件会话无法序列化Telethon客户端实例,必须用Redis等支持序列化对象的缓存中间件

前端(React侧)适配

根据后端返回的状态渲染对应输入组件即可:

  • 首次进入认证页调用start_tg_auth接口,返回await_phone时渲染手机号输入表单
  • 提交手机号后返回await_code时,渲染验证码输入表单
  • 提交验证码后返回await_2fa时,渲染2FA密码输入表单
  • 任意步骤返回错误要提示用户重新发起认证,返回success则跳转业务页面

注意事项

  • 所有认证参数传输必须走HTTPS,避免敏感信息泄露
  • 每个用户的Telegram session文件要单独存储,不要共用
  • 如果采用ASGI部署Django,可以把Telethon的异步逻辑和Django异步视图结合,性能会更好

内容的提问来源于stack exchange,提问作者Jeff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:45:01