ForcePilot/backend/package/yuxi/channel/extensions/bilibili/pairing.py
Kris 415d66d1c6 feat(bilibili): 新增B站渠道插件,支持直播弹幕和私信交互
该提交实现了完整的B站渠道插件,包含以下核心功能:
1.  支持B站直播弹幕监听与处理,包含弹幕、SC、礼物等多种直播间事件
2.  支持B站私信的轮询接收与发送
3.  内置WBI签名算法,适配B站API鉴权要求
4.  提供账号配对、黑白名单等弹幕私信权限控制
5.  集成速率限制与防风险机制,降低账号封禁风险
6.  完善的配置管理与状态监控能力
2026-05-21 10:40:04 +08:00

47 lines
1.2 KiB
Python

from __future__ import annotations
import logging
import random
import string
import time
logger = logging.getLogger(__name__)
_pairing_codes: dict[str, tuple[str, float]] = {}
_pairing_verified: set[str] = set()
CODE_TTL = 600
def generate_code(peer_id: str) -> str:
code = "".join(random.choices(string.digits, k=6))
_pairing_codes[peer_id] = (code, time.time())
logger.info("%s 生成配对码: %s", peer_id, code)
return code
def verify_code(peer_id: str, code: str) -> bool:
entry = _pairing_codes.get(peer_id)
if entry is None:
return False
stored_code, created_at = entry
if time.time() - created_at > CODE_TTL:
del _pairing_codes[peer_id]
return False
if stored_code == code:
del _pairing_codes[peer_id]
_pairing_verified.add(peer_id)
return True
return False
def check_pairing(sender_uid: str, account) -> bool:
if hasattr(account, "dm_allow_from"):
allow_from = account.dm_allow_from or []
if str(sender_uid) in allow_from:
return True
return sender_uid in _pairing_verified
def normalize_allow_entry(entry: str) -> str:
return entry.strip()