如何使用正则表达式解析Twitch频道TCP连接返回的聊天响应
Twitch IRC聊天消息TCP响应解析方案
你现有的按两个冒号分割的思路存在缺陷:如果用户发送的聊天内容本身包含冒号,会导致拆分错误。Twitch聊天底层遵循IRC协议,所有消息都以\r\n(CRLF)作为结束标识,按这个规则拆分是最可靠的方案。
核心实现步骤
- 第一步:处理TCP粘包,维护接收缓冲区
TCP是流式协议,收到的响应可能包含半条消息或者多条消息,你需要把每次从套接字读到的内容先拼接到全局缓冲区,再按\r\n拆分缓冲区内容:- 拆分出的完整消息直接进入下一步解析
- 最后一段不完整的内容保留在缓冲区,和下一次收到的新数据拼接
- 第二步:过滤并解析PRIVMSG聊天消息
你需要的聊天消息都是PRIVMSG命令类型,单条消息的标准结构为::<发送者标识> PRIVMSG <频道名> :<聊天内容>,可以用正则或者字符串分割提取字段。 - 第三步:丢弃非聊天消息(可选)
Twitch还会推送PING、JOIN、PART等其他类型的IRC消息,不需要的话直接过滤即可。
代码示例(Python)
import re from typing import List, Dict # 缓冲区,全局维护 recv_buffer = "" # PRIVMSG匹配正则,适配内容中带冒号的情况 privmsg_pattern = re.compile(r'^:(?P<username>[^!]+)!.* PRIVMSG (?P<channel>#\w+) :(?P<content>.*)$') def parse_twitch_response(new_data: str) -> List[Dict]: global recv_buffer # 新数据拼接到缓冲区 recv_buffer += new_data # 按行拆分 lines = recv_buffer.split("\r\n") # 最后一段不完整的留在缓冲区 recv_buffer = lines.pop() result = [] for line in lines: # 跳过Response标识行(如果是你自己添加的测试标记,实际TCP响应无此行可删除该判断) if line.startswith("Response ----") or not line.strip(): continue match = privmsg_pattern.match(line) if match: result.append(match.groupdict()) return result # 测试用例,用你给出的示例数据可直接验证 test_data = """:clonek1ng!clonek1ng@clonek1ng.tmi.twitch.tv PRIVMSG #xqcow :ring them up :bungus!bungus@bungus.tmi.twitch.tv PRIVMSG #xqcow :karma for laughing at the dancing guy FeelsBadMan :ayaannnk!ayaannnk@ayaannnk.tmi.twitch.tv PRIVMSG #xqcow :!emotes bttv :534mus!534mus@534mus.tmi.twitch.tv PRIVMSG #xqcow :CiGrip """ print(parse_twitch_response(test_data))
内容的提问来源于stack exchange,提问作者frankied003
相关产品推荐
相关产品推荐

