新增 Tlon 渠道扩展,支持在 Yuxi 平台中集成 Tlon/Urbit 去中心化通讯平台。 包含以下功能模块: - tlon_api: Tlon API 客户端封装 - config: 渠道配置管理 - gateway: SSE/WebSocket 网关接入 - sse_client: SSE 客户端 - outbound: 外发消息管理 - send: 消息发送 - security: 安全校验 - auth: 认证管理 - monitor: 渠道状态监控 - status: 会话状态管理 - session: 会话管理 - approval: 审批流程 - channel_mgmt: 频道管理 - channel_ops: 频道操作 - contacts: 联系人管理 - discovery: 服务发现 - doctor: 健康诊断 - expose: 服务暴露 - gallery: 图库管理 - history: 历史记录 - hooks: 钩子管理 - media: 媒体资源处理 - notebook: 笔记本功能 - settings_store: 设置存储 - setup: 初始化设置 - story: 故事功能 - targets: 目标管理 - cite_parser: 引用解析 - utils: 工具函数 - types: 类型定义
30 lines
943 B
Python
30 lines
943 B
Python
import httpx
|
|
from urllib.parse import urljoin
|
|
|
|
from yuxi.channel.extensions.tlon.errors import UrbitAuthError
|
|
|
|
|
|
async def authenticate(ship_url: str, code: str, *,
|
|
dangerously_allow_private_network: bool = False,
|
|
timeout: float = 15.0) -> str:
|
|
login_url = urljoin(ship_url, "/~/login")
|
|
|
|
async with httpx.AsyncClient(
|
|
timeout=timeout,
|
|
max_redirects=3,
|
|
follow_redirects=True,
|
|
) as client:
|
|
response = await client.post(
|
|
login_url,
|
|
headers={"Content-Type": "application/x-www-form-urlencoded"},
|
|
content=f"password={code}",
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
raise UrbitAuthError(f"Auth failed: HTTP {response.status_code}")
|
|
|
|
cookie = response.headers.get("set-cookie")
|
|
if not cookie:
|
|
raise UrbitAuthError("missing_cookie: Auth succeeded but no cookie")
|
|
|
|
return cookie.split(";")[0] |