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

如何捕获Blitzortung.org动态变更端口的WebSocket实时雷电数据?

解决Blitzortung.org动态WebSocket端口连接问题

嘿,这个动态端口的问题确实有点烦人,但其实用个简单的端口遍历逻辑就能搞定。我之前做类似的实时数据捕获时,就是这么处理的,亲测有效。下面给你一步步拆解解决方案:

核心思路

Blitzortung的WebSocket端口在8050-8090之间动态分配,那我们就写个循环,逐个尝试这个区间内的端口,直到成功建立连接。一旦连接成功,就可以正常发送带地图密钥的请求并接收实时雷电数据了。

具体实现步骤

1. 先安装依赖库

确保你已经安装了websocket-client,如果没有的话,用pip安装:

pip install websocket-client

2. 遍历端口尝试连接

我们写一个循环,从8050到8090逐个调用ws.connect(),用try-except捕获连接失败的异常,直到找到可用端口。

3. 获取地图密钥

你提到的地图密钥,得从Blitzortung的网页里挖出来:

  • 打开Blitzortung官网,按F12打开开发者工具
  • 切换到「Network」标签,筛选「WS」(WebSocket)类型的请求
  • 找到已建立的WebSocket连接,查看它发送的初始消息,里面就包含需要的密钥(通常是类似map_xxxxxx的字符串)
  • 把这个密钥存到变量里,后续发送请求时用就行

4. 捕获实时JSON数据

连接成功后,发送包含密钥的订阅请求,然后持续监听WebSocket的消息,解析返回的JSON数据即可。

完整代码示例

import websocket
import json
from time import sleep

# 替换成你从网页获取的地图密钥
MAP_KEY = "your_map_key_here"
WS_BASE_URL = "ws://ws.blitzortung.org:{}"
PORT_RANGE = range(8050, 8091)  # 包含8090端口

def on_message(ws, message):
    # 解析并处理实时雷电JSON数据
    try:
        data = json.loads(message)
        print("收到雷电数据:", data)
        # 这里可以添加你的自定义处理逻辑,比如存入数据库、做数据分析等
    except json.JSONDecodeError:
        print("无法解析消息:", message)

def on_error(ws, error):
    print("WebSocket错误:", error)

def on_close(ws, close_status_code, close_msg):
    print("WebSocket连接关闭")

def on_open(ws):
    print("WebSocket连接成功!")
    # 发送带地图密钥的订阅请求
    request_msg = json.dumps({
        "command": "subscribe",
        "key": MAP_KEY
    })
    ws.send(request_msg)
    print("已发送订阅请求")

def connect_to_blitzortung():
    for port in PORT_RANGE:
        ws_url = WS_BASE_URL.format(port)
        print(f"尝试连接端口 {port}...")
        try:
            ws = websocket.WebSocketApp(
                ws_url,
                on_open=on_open,
                on_message=on_message,
                on_error=on_error,
                on_close=on_close
            )
            # 启动连接,run_forever会阻塞直到连接关闭
            ws.run_forever()
            # 连接成功运行后,跳出端口遍历循环
            break
        except Exception as e:
            print(f"端口 {port} 连接失败:{e}")
            # 失败后稍作等待再试下一个端口
            sleep(0.5)

if __name__ == "__main__":
    connect_to_blitzortung()

注意事项

  • 密钥有效性:地图密钥可能会随页面更新而变化,如果发现连接后收不到数据,记得重新去网页获取最新的密钥。
  • 重连逻辑:如果所有端口都连接失败,可以考虑添加整体重试逻辑,比如过几分钟再重新遍历端口。
  • 合规性:确保你的数据捕获行为符合Blitzortung的使用条款,不要过度请求给服务器造成压力。
  • 异常完善:代码里的异常处理可以根据你的需求进一步优化,比如处理连接中断后的自动重连。

内容的提问来源于stack exchange,提问作者Ape Toshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:01