bili 的 songmid 形如「BV号|cid」,与回调 data 的分隔符撞车:拆段 从 5 变 6,handle_button 判为非本 bot 按钮直接丢弃,且发生在回应 互动之前——客户端按钮一直转圈、日志无任何记录,表象即「点歌卡死」。 _song_data 给歌曲 id 一并 % 转义(_q),_song_of_data 对应 unquote; 旧按钮 id 不含 %,unquote 幂等不受影响。附 bili 往返回归测试。
This commit is contained in:
1 parent
c364506925
commit
bb60137ac7
2 files changed
+27
-5
No files matched your search
+8
-5
@@ -534,10 +534,11 @@ async def _swap_message(
|
||||
|
||||
|
||||
def _song_data(action: str, song: Song) -> str:
|
||||
"""回调按钮携带的歌曲数据:自包含(歌名/歌手/封面 % 转义,避免撞上
|
||||
分隔符),bot 收到回调直接还原 Song,无需记忆菜单快照。"""
|
||||
"""回调按钮携带的歌曲数据:自包含(歌曲 id/歌名/歌手/封面 % 转义,
|
||||
避免撞上分隔符),bot 收到回调直接还原 Song,无需记忆菜单快照。
|
||||
id 也要转义:bili 的 songmid 是「BV号|cid」,裸拼会把 data 拆散。"""
|
||||
return (
|
||||
f"音乐|{action}|{song.source}|{song.song_id}"
|
||||
f"音乐|{action}|{song.source}|{_q(song.song_id)}"
|
||||
f"|{_q(song.name)}|{_q(song.singer)}|{_q(song.img or '')}"
|
||||
)
|
||||
|
||||
@@ -545,12 +546,14 @@ def _song_data(action: str, song: Song) -> str:
|
||||
def _song_of_data(args: list[str]) -> Song:
|
||||
"""从回调 data 的 [source, song_id, name, singer, img?] 还原 Song。
|
||||
|
||||
img 段是后加的:旧按钮的 data 只有 4 段,缺省按无封面处理。"""
|
||||
img 段是后加的:旧按钮的 data 只有 4 段,缺省按无封面处理。
|
||||
song_id 段的 % 转义也是后加的(bili songmid 带 |):旧按钮 id 不含
|
||||
%,unquote 幂等,直接解不影响。"""
|
||||
source, song_id, name, singer = args[:4]
|
||||
img = unquote(args[4]) if len(args) > 4 and args[4] else None
|
||||
return Song(
|
||||
source=source,
|
||||
song_id=song_id,
|
||||
song_id=unquote(song_id),
|
||||
name=unquote(name),
|
||||
singer=unquote(singer),
|
||||
img=img,
|
||||
|
||||
Reference in new issue
Block a user