使用AutoHotKey编写转发知识星球邀请小程序

  • 7 分钟阅读

前言

  • 一年前创建了一个知识星球用于保存微信群聊天中的一些文档,但是创建免费的需要邀请码,而官方在每个季度会送100位免费名额,只用来保存文件活跃度不高100个名额已经足够了,所以打算只通过邀请加入。当然也有几位富哥付费加入的,现在有300人,通过小程序续期操作非常繁琐,要点击很多下,所以萌生写一个自动转发小程序的脚本。下面是使用AutoHotKey编写转发知识星球邀请小程序的过程。

安装AutoHotKey

  • AutoHotkey是一个开源的自动化脚本语言,主要用于 Windows 操作系统。它允许用户创建脚本来自动化各种任务,比如模拟键盘和鼠标输入、控制窗口、管理文件和文件夹等。AutoHotkey脚本可以用于简化重复性的工作,提高效率。
  • 打开https://www.autohotkey.com/直接下载安装2.0版本就可以了,在下载和安装过程中可能会被杀毒软件误报,毕竟这个脚本可以操作系统很多敏感的API,也有不少黑客团体使用该工具作为后渗透工具,所以比较尴尬。但是自己使用需要注意安装权限为当前用户。

编写代码

打开小程序

  • 在使用AutoHotkey功能前先需要将知识星球的小程序添加到桌面快捷方式,这样可以很快就知道这个小程序的ID,查看桌面可以得到小程序的启动命令为:
"C:\Program Files\Tencent\WeChat\WechatAppLauncher.exe" -launch_appid=wx4f706964b979122a
  • 查看文档得到https://www.autohotkey.com/docs/v2/打开一个进程可以使用Run方法,后面接上启动命令
Run "C:\Program Files\Tencent\WeChat\WechatAppLauncher.exe -launch_appid=wx4f706964b979122a"
  • 双击调试一下,果然打开了小程序,现在

查找小程序窗口

  • 以前写游戏辅助了解过一些win32开发,在window要想操作一个窗口需要获取这个窗口的句柄,但是在这里淡化了这个概念,我们只需要知道打开小程序之后要等待一个窗口出现,然后继续操作这个窗口就可以了,怎么找到的AutoHotkey有封装好的方法,WinWaitActive,从例子可以得知
Run "notepad.exe"
if WinWaitActive("Untitled - Notepad", , 2)
    WinMinimize ; Use the window found by WinWaitActive.
else
    MsgBox "WinWaitActive timed out."
  • 上面的代码会运行一个记事本,然后找到标题为Untitled - Notepad的窗口,这个窗口标题该怎么找呢,官方自带了一个窗口查看器,有点类似微软的win32下面sdk中的window spy,名字也叫AutoHotkey Window Spy
知识星球
ahk_class Chrome_WidgetWin_0
ahk_exe WeChatAppEx.exe
ahk_pid 836
ahk_id 4194702
  • 可以看到通过窗口查看器得到了窗口标题和类名信息,在这里只使用标题作为唯一标识,Chrome_WidgetWin_0应该是全部小程序都是一样的,所以不使用它作为查找窗口的依据。
if WinWaitActive("知识星球", , 5)
{
    ; 置顶小程序窗口
    WinSetAlwaysOnTop 1, "知识星球"
    ...
}
else
    MsgBox "WinWaitActive timed out."
  • 使用上面代码激活小程序的窗口,并且始终置顶窗口,防止被其他窗口覆盖掉了,然后点错了。然后再做其他操作。
Screen:	894, 536
Window:	165, 446
Client:	165, 446 (default)
Color:	F0F0F0 (Red=F0 Green=F0 Blue=F0)
  • 再看第二块代码:Screen是相对于整个屏幕的XY轴,也就是屏幕左上角的坐标为0,0,也就是整个屏幕0,0到鼠标现在的位置到的坐标为894, 536
  • Window是相对小程序这个窗口的XY轴,也就是这个小程序左上角坐标为0,0,鼠标现在的位置相对小程序窗口坐标为165, 446,这个坐标就是我们要用到的,无论小程序窗口在哪里,在小程序窗口里面相对坐标都是固定的

微信图片_20240805201319.png

模拟鼠标点击,键盘输入

  • 了解完窗口和鼠标相对坐标后,就可以模拟鼠标点击和键盘输入操作了,查看文档MouseClickSend得到左键点击一个坐标,和输入字符串代码如下:
if WinWaitActive("知识星球", , 5)
{
    ; 置顶小程序窗口
    WinSetAlwaysOnTop 1, "知识星球"
    Sleep 3000
    ; 点击知识星球的搜索框
    MouseClick "left", 150, 150
    Send Format("{1}{enter}", zsxq) ; 输入知识星球名称
    ; 点击我自己的知识星球,也就是三米前有蕉皮,我自己置顶了是第一个
    MouseClick "left", 40, 233
    Sleep 2000
    ; 点击邀请
    MouseClick "left", 365, 288
    Sleep 2000
    ; 点击邀请好友加入
    MouseClick "left", 192, 630
    Sleep 2000
    ; 点击群邀请
    MouseClick "left", 300, 720
    Sleep 2000
    ; 点击确定
    MouseClick "left", 200, 520
}
else
    MsgBox "WinWaitActive timed out."
  • 同理也可以完成点击转发到哪个群的操作:
; 等待选择群聊天框
if WinWaitActive("ahk_class SelectContactWnd", , 3)
{
    ; 点击搜索框
    MouseClick "left", 60, 30
    ; 输入群名称
    Send Format("{1}{enter}", name) ; 输入群名称
    Sleep 1000
    ; 点击群名称
    MouseClick "left", 45, 110
    ; 点击留言
    Sleep 1000
    MouseClick "left", 350, 350
    Send "该信息由autohotkey自动发送{enter}" ; 输入知识星球名称
    Sleep 1000
    ; 点击发送,测试可以将下面这行注释掉
    ; MouseClick "left", 360, 400
}
else
    MsgBox "WinWaitActive timed out."
  • 再润色一下代码,例如可以让用户输入群名称,和在环境变量中读取群名称,方便在命令行直接调用,之后写一个监控只要群里出现我定义的关键词,就往群里转发知识星球的小程序,这里的群名称一定要设置为唯一的,可以设置一个别名,这样搜索到就只会有一个,不会出现误点击的现象。
#Requires AutoHotkey v2.0
; 知识星球名称
zsxq := "三米前有蕉皮"
; 从环境变量中读取群名称
name := EnvGet("GROUP_NAME")
; 如果环境变量中没有群名称,弹出对话框让用户输入
if (name = "")
    name := InputBox("(群名称)", "Enter Name", "w120 h64 T30","EMO-CRAB").value
  • 最后完成调用窗口关闭
if WinExist("知识星球")
    WinClose ; Use the window found by WinExist.
else
    WinClose "知识星球"

微信图片_20240805201319.png

编译为exe文件

  • 官方有一个可以将ahk文件编译为exe单文件的工具,可以点击安装后使用。

微信图片_20240805201319.png

微信图片_20240805201319.png

参考

附件

转发知识星球小程序到群.ahk