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

如何用Tcl结合Websocket获取指定足球赛事网站的实时赛事事件?

Tcl WebSocket 实现:监听 MaisFutebol 实时赛事事件

以下是适配Eggdrop机器人的Tcl脚本示例,替代原有的每分钟HTML轮询方案,通过WebSocket获取实时赛事事件并过滤标记为HOJE的内容:

依赖说明

确保你的Eggdrop环境已安装以下Tcl扩展:

  • websocket(用于WebSocket连接)
  • http(Eggdrop默认内置)
  • json(Eggdrop默认内置,用于解析响应)

完整代码示例

# 从赛事页面提取所需Cookie(iola、gig*系列)
proc get_match_cookies {match_url} {
    http::config -useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    set token [http::geturl $match_url -timeout 10000]
    set cookie_list [list]

    # 解析Set-Cookie头
    foreach header [http::meta $token] {
        if {[string match "Set-Cookie:*" $header]} {
            set cookie_str [string range $header 11 end]
            set cookie_name [lindex [split $cookie_str ";"] 0]
            # 筛选需要的Cookie类型
            if {[string match "iola=*" $cookie_name] || [string match "gig*=*" $cookie_name]} {
                lappend cookie_list $cookie_name
            }
        }
    }

    http::cleanup $token
    return [join $cookie_list "; "]
}

# WebSocket消息处理:解析JSON并过滤HOJE事件
proc handle_ws_message {msg} {
    if {[catch {json::json2dict $msg} json_dict]} {
        putlog "WebSocket消息解析失败: $json_dict"
        return
    }

    # 根据实际返回的JSON结构调整提取路径
    if {[dict exists $json_dict events]} {
        foreach event [dict get $json_dict events] {
            if {[dict exists $event tag] && [dict get $event tag] eq "HOJE"} {
                # 输出或处理事件内容(示例:打印到Eggdrop日志)
                set event_time [dict get $event time]
                set event_desc [dict get $event description]
                putlog "今日赛事事件 ($event_time): $event_desc"
            }
        }
    }
}

# 建立WebSocket连接并持续监听
proc connect_ws {match_url} {
    # 先获取页面Cookie
    set cookies [get_match_cookies $match_url]
    if {$cookies eq ""} {
        putlog "未能获取所需Cookie,无法建立WebSocket连接"
        return
    }

    # 从赛事URL提取赛事ID,构造WebSocket地址(需根据网站实际WS端点调整)
    regexp {/(\d+)$} $match_url -> match_id
    set ws_url "wss://ws.maisfutebol.iol.pt/match/$match_id/events"

    # 配置WebSocket连接参数
    set ws [websocket::open $ws_url \
        -headers [list "Cookie" $cookies] \
        -onmessage handle_ws_message \
        -onclose {putlog "WebSocket连接已关闭,将在30秒后重试"} \
        -onerror {putlog "WebSocket连接出错: [lindex $args 0]"}]

    # 连接断开后自动重试
    after 30000 [list connect_ws $match_url]
}

# 启动示例:传入目标赛事URL
# connect_ws "https://maisfutebol.iol.pt/jogo/aominuto/sporting/estoril/13817064"

关键部分说明

  1. Cookie获取:get_match_cookies函数通过HTTP请求赛事页面,从响应头的Set-Cookie中提取iola和以gig开头的Cookie,这是建立WebSocket连接的必要验证信息。
  2. WebSocket连接:connect_ws函数构造对应赛事的WebSocket地址(若地址有变化,可从赛事页面的JS代码或浏览器开发者工具中提取),携带Cookie建立长连接。
  3. 消息处理:handle_ws_message函数将WebSocket返回的JSON转为字典,筛选出标记为HOJE的事件,并输出到Eggdrop日志(可修改为发送到IRC频道等操作)。
  4. 自动重连:连接关闭或出错后,30秒后自动重试,保证监听的持续性。

注意事项

  • 若网站的WebSocket端点地址发生变化,需通过浏览器开发者工具(Network -> WS标签)抓取实际地址,调整ws_url的构造逻辑。
  • 可根据实际返回的JSON结构,修改handle_ws_message中的事件提取路径,确保能正确获取tag和事件详情。
  • 可调整useragent为符合当前主流浏览器的标识,避免被网站拦截。

内容的提问来源于stack exchange,提问作者Hugo Simões

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:23:18