如何用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"
关键部分说明
- Cookie获取:
get_match_cookies函数通过HTTP请求赛事页面,从响应头的Set-Cookie中提取iola和以gig开头的Cookie,这是建立WebSocket连接的必要验证信息。 - WebSocket连接:
connect_ws函数构造对应赛事的WebSocket地址(若地址有变化,可从赛事页面的JS代码或浏览器开发者工具中提取),携带Cookie建立长连接。 - 消息处理:
handle_ws_message函数将WebSocket返回的JSON转为字典,筛选出标记为HOJE的事件,并输出到Eggdrop日志(可修改为发送到IRC频道等操作)。 - 自动重连:连接关闭或出错后,30秒后自动重试,保证监听的持续性。
注意事项
- 若网站的WebSocket端点地址发生变化,需通过浏览器开发者工具(Network -> WS标签)抓取实际地址,调整
ws_url的构造逻辑。 - 可根据实际返回的JSON结构,修改
handle_ws_message中的事件提取路径,确保能正确获取tag和事件详情。 - 可调整
useragent为符合当前主流浏览器的标识,避免被网站拦截。
内容的提问来源于stack exchange,提问作者Hugo Simões
相关产品推荐
相关产品推荐

