[AppleScript] 纯文本查看 复制代码
.版本 2
.支持库 spec
.支持库 eAPI
.支持库 internet
.支持库 iext
#常量 广播端口 = 65530 ' 局域网广播端口
#常量 控制端口 = 65531 ' TCP控制端口
#常量 截图间隔 = 10000 ' 10秒/次(可调整)
#常量 图片质量 = 80 ' JPEG压缩质量(0-100)
.局部变量 被控IP, 文本型
.局部变量 截图数据, 字节集
.局部变量 接收流, 字节集
### 一、控制端核心模块(管理端)
.子程序 _启动窗口_创建完毕
初始化广播监听 ()
初始化TCP服务 ()
信息框 (“控制端启动成功!等待被控端连接...”, #信息图标, “提示”)
.子程序 初始化广播监听
.局部变量 广播监听, 类_UdpSocket
广播监听.创建 (广播端口)
广播监听.设置广播模式 ()
广播监听.置数据到达事件 (&广播数据到达)
.子程序 广播数据到达
.参数 数据, 字节集
.参数 发送方地址, 文本型
.参数 发送方端口, 整数型
.局部变量 广播内容, 文本型
广播内容 = 到文本 (数据)
.如果 (广播内容 = “SCREEN_MONITOR_REQUEST”)
' 响应被控端广播,发送控制端IP
类_UdpSocket.发送数据 (发送方地址, 广播端口, 到字节集 (取本地IP地址 ()))
.如果结束
.子程序 初始化TCP服务
.局部变量 TCP服务, 类_TcpServer
TCP服务.创建 (控制端口)
TCP服务.置客户端连接事件 (&客户端连接事件)
TCP服务.置数据到达事件 (&数据到达事件)
.子程序 客户端连接事件
.参数 客户端ID, 整数型
.参数 客户端地址, 文本型
被控IP = 分割文本 (客户端地址, “:”, ) [1]
创建目录 (取运行目录 () + “\监控记录\” + 被控IP) ' 按IP创建存储目录
调试输出 (“被控端连接:” + 被控IP)
.子程序 数据到达事件
.参数 客户端ID, 整数型
.参数 数据, 字节集
.局部变量 图片路径, 文本型
接收流 = 接收流 + 数据
.如果 (取字节集长度 (接收流) ≥ 4)
' 前4字节为图片长度(网络字节序)
图片大小 = 到整数 (取字节集左边 (接收流, 4))
.如果 (取字节集长度 (接收流) ≥ 图片大小 + 4)
截图数据 = 取字节集中间 (接收流, 5, 图片大小)
接收流 = 取字节集右边 (接收流, 取字节集长度 (接收流) - 图片大小 - 4)
图片路径 = 取运行目录 () + “\监控记录\” + 被控IP + “\” + 取现行时间 () + “.jpg”
写文件 (图片路径, 截图数据)
调试输出 (“接收截图:” + 图片路径)
.如果结束
.如果结束
### 二、被控端核心模块(员工端)
.子程序 _启动窗口_创建完毕
置窗口显示方式 (#隐藏窗口) ' 后台运行
启动广播发现 ()
启动截图监控 ()
.子程序 启动广播发现
.局部变量 广播发送, 类_UdpSocket
.局部变量 控制IP, 文本型
.循环判断首 ()
广播发送.发送广播 (广播端口, 到字节集 (“SCREEN_MONITOR_REQUEST”))
控制IP = 等待广播响应 ()
.如果 (控制IP ≠ “”)
连接控制端 (控制IP)
跳出循环 ()
.否则
延迟 (3000) ' 3秒重发广播
.如果结束
.循环判断尾 ()
.子程序 等待广播响应, 文本型
.局部变量 广播接收, 类_UdpSocket
.局部变量 响应数据, 字节集
.局部变量 超时计数, 整数型
广播接收.创建 (广播端口)
超时计数 = 0
.循环判断首 (超时计数 < 5)
.如果 (广播接收.取数据 (响应数据, 1000)) ' 1秒超时
返回 (到文本 (响应数据))
.否则
超时计数 = 超时计数 + 1
.如果结束
.循环判断尾 ()
返回 (“”)
.子程序 连接控制端
.参数 控制IP, 文本型
.局部变量 TCP客户端, 类_TcpClient
TCP客户端.连接 (控制IP, 控制端口)
.如果 (TCP客户端.是否连接 ())
调试输出 (“连接控制端成功:” + 控制IP)
.循环判断首 () ' 持续监控循环
截图并发送 ()
延迟 (截图间隔)
.循环判断尾 ()
.否则
信息框 (“连接失败,重新广播...”, #错误图标, “提示”)
启动广播发现 ()
.如果结束
.子程序 截图并发送
.局部变量 窗口句柄, 整数型
.局部变量 截图, 图片对象
.局部变量 图片数据, 字节集
.局部变量 鼠标位置, 点型
鼠标位置 = 取鼠标位置 ()
窗口句柄 = 取鼠标所在窗口句柄 (鼠标位置.x, 鼠标位置.y) ' 获取当前鼠标所在窗口句柄
.如果 (窗口句柄 ≠ 0)
截图.取窗口图片 (窗口句柄)
截图.调整尺寸 (截图.取宽度 () ÷ 2, 截图.取高度 () ÷ 2) ' 缩小50%降低大小
图片数据 = 图片_格式转换 (截图, #图片格式JPEG, 图片质量)
' 发送格式:[4字节长度][图片数据](网络字节序)
TCP客户端.发送数据 (到字节集 (取字节集长度 (图片数据)), )
TCP客户端.发送数据 (图片数据, )
删除文件 (取临时目录 () + “\temp_screenshot.jpg”) ' 清理临时文件
.如果结束