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

如何使用正则表达式解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:24:03