QuickQ等vpn工具都有提供了很多的代理线路,日常在批量参与一些活动的时候,就希望可以自动切换线路来获取不同的ip,把这些ip资源充分利用起来。
因为是mac系统,所以这里选择了Hammerspoon,一个使用lua脚本自动化操作mac系统功能的工具:
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号

