# MacOS下实现自动切换QuickQ的代理线路

By [松松的程序世界](https://paragraph.com/@websong) · 2023-01-05

---

QuickQ等vpn工具都有提供了很多的代理线路，日常在批量参与一些活动的时候，就希望可以自动切换线路来获取不同的ip，把这些ip资源充分利用起来。

因为是mac系统，所以这里选择了Hammerspoon，一个使用lua脚本自动化操作mac系统功能的工具：

[https://www.hammerspoon.org/](https://www.hammerspoon.org/)

Hammerspoon实现了很多系统功能的api，比如可以快速控制窗口的位置，可以模拟鼠标键盘的点击，可以和菜单交互，支持applescript等等，可以一览他们的API手册：

[https://www.hammerspoon.org/docs/index.html](https://www.hammerspoon.org/docs/index.html)

Hammerspoon的使用很简单，安装后，在用户目录下的.hammerspoon文件夹里创建一个init.lua文件，就可以编写脚本了：

我们通过一个组合键，发找到QuickQ的窗口，然后将它移动到屏幕的边缘便于进行鼠标点击的控制， 完整实现的代码如下：

    hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Q", function()
    
        local windows = hs.window.allWindows()
        for _, win in pairs(windows) do -- 在Lua中遍历表的方法
    
          local app = win:application()
          local bundleID = app:bundleID()
    
          --  hs.alert.show(bundleID)
          --  hs.alert.show(app:name())
          --  if bundleID == "com.google.Chrome" then
    
          if app:name() == "QuickQ" then
    
            win:focus()
    
            local f = win:frame()
    
            if f.x ~= 0 and f.y ~= 0 then
              local screen = win:screen()
              local max = screen:frame()
            
              f.x = 0 --max.x
              f.y = 0 --max.y
              f.w = max.w / 2
              f.h = max.h
              win:setFrame(f) 
            end
              
            -- 屏幕 1
            local point = { x = 205.0, y = 598.0 }
            local point2 = { x = 168.0, y = 292.0 }
    
            -- 屏幕 2
            -- local point = { x = 1822.0, y = 128.0 }
            -- local point2 = { x = 1779.0, y = -179.0 }
            
            -- hs.alert.show(hs.mouse.getAbsolutePosition().x)
            -- hs.alert.show(hs.mouse.getAbsolutePosition().y)
    
            hs.timer.doAfter(1, function()
              hs.eventtap.leftClick(point)
            end)
    
            hs.timer.doAfter(2, function()
              hs.eventtap.leftClick(point2)
            end)
    
           end
        end
    end)
    

编写中发现win:setFrame()之后可能会丢失窗口的focus，其实是mac下窗口移动需要一个动画时间的，而如果后面的click速度太快，就激活了其他窗口，解决办法就是调用hs.timer.doAfter方法来给后面的click做一个延时触发。

坐标的位置如果有差异可以自行通过hs.alert.show(hs.mouse.getAbsolutePosition().x)来捕获下。

源码也可以到我的github上查看：

[https://gist.github.com/logix/dbe4f0cdcba2c1e5a1bb6ab2fed75ff5](https://gist.github.com/logix/dbe4f0cdcba2c1e5a1bb6ab2fed75ff5)

这样在Hammerspoon开启的情况下，通过热键⌘+⌥+ctrl+Q，就可以实现线路的切换了，接下来把热键的触发集成到批量操作的脚本里，就可以在批量参加的活动的时候实现更换IP了。

2023年1月5号

---

*Originally published on [松松的程序世界](https://paragraph.com/@websong/macos-quickq)*
