Cover photo

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

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

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

https://www.hammerspoon.org/

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

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

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

2023年1月5号