请教 Hammerspoon 在获取 WIFI ssid 为 nil 问题

2025 年 12 月 10 日
 z1gui

最近痴迷用 Hammespoon 去简化自己的某些操作。用 chatgpt 写了个根据 Wifi ssid 切换网络位置的 lua 脚本。看代码是没啥问题的,但是在获取 Wifi ssid 时候为空,我以为是在切换过程中,可能先清空,然后再连接,但是用了 10s 轮询也不行。看了 chatgpt 回答的可能原因有权限问题,也可能是中国地区禁用 hs.wifi.currentNetwork() 获取 ssid 。请问有人遇到这个问题么,该如何解决

- WiFi SSID 与 macOS 网络位置的映射
local locationMap = {
    ["xxxxx"] = "office",
    ["xxxxx"]    = "home",
}

local defaultLocation = "Automatic"

---------------------------------------------------------------------
-- Debug 输出函数
---------------------------------------------------------------------
local function debugLog(msg)
    print("[WiFi-Location-Debug] " .. msg)
end

---------------------------------------------------------------------
-- 获取当前 macOS 网络位置
---------------------------------------------------------------------
local function getCurrentLocation()
    local output = hs.execute("scselect")
    debugLog("scselect 输出: \n" .. output)

    -- 只匹配带 * 的那一行,并从括号中取出名称
    local current = output:match("%*.-%((.-)%)")
    if current then
        debugLog("解析到当前位置: " .. current)
    else
        debugLog("未能从 scselect 中解析出当前位置")
    end
    return current or "Unknown"
end

---------------------------------------------------------------------
-- 切换网络位置
---------------------------------------------------------------------
local function switchLocation(newLocation)
    debugLog("准备切换网络位置到: " .. newLocation)
    local result = hs.execute('scselect "' .. newLocation .. '"')
    debugLog("执行 scselect 后返回: \n" .. result)
end

---------------------------------------------------------------------
-- WiFi 变化事件回调
---------------------------------------------------------------------
local function ssidChanged()
    local ssid = hs.wifi.currentNetwork()
    debugLog("检测到 WiFi 变化,当前 SSID: " .. tostring(ssid))

    local targetLocation

    if ssid and locationMap[ssid] then
        targetLocation = locationMap[ssid]
        debugLog("SSID 匹配映射表,将切换到位置: " .. targetLocation)
    else
        targetLocation = defaultLocation
        debugLog("SSID 未匹配映射表,切换到默认位置: " .. targetLocation)
    end

    -- 执行切换
    switchLocation(targetLocation)

    -- 延时读取切换后的实际位置
    hs.timer.doAfter(0.3, function()
        local loc = getCurrentLocation()
        hs.alert.show("当前网络位置:" .. loc)
        debugLog("最终确认当前网络位置:" .. loc)
    end)
end

---------------------------------------------------------------------
-- 启动 WiFi watcher
---------------------------------------------------------------------
wifiWatcher = hs.wifi.watcher.new(ssidChanged)
wifiWatcher:start()

debugLog("WiFi watcher 已启动")
hs.alert.show("WiFi 自动切换网络位置( Debug 版)已启动")  
2944 次点击
所在节点    编程
1 条回复
z1gui
2025 年 12 月 11 日
结贴: https://github.com/Hammerspoon/hammerspoon/issues/3537#issuecomment-1743870568
如果类似情况,可以看一下上面这个链接可以解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1177935

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX