女朋友说上班都不回她微信,于是给她安排一个定时自动发微信的功能。
【效果预览】
正常情况下微信是最小化的,我们需要先打开在桌面显示聊天窗口。
subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
启动之后需要sleep一会儿,等窗口完全显示之后再去获取聊天窗口坐标,否则窗口还没完全显示获取到的坐标为None。
subprocess.Popen([r"F:\WeChat\WeChat.exe"]) #微信安装路径
time.sleep(0.1) #等窗口显示完毕
EnumWindows对屏幕上所有的顶层窗口依次进行枚举,将每个顶层窗口的窗口句柄依次传递给回调函数。
在回调函数callback判断是窗口、可用窗口、可见窗口,则存到字典hwnd_title中。
最后遍历所有的窗口hwnd_title,如果是微信聊天窗口则返回窗口坐标(x,y,x2,y2)
#回调函数,将所有句柄存入字典hwnd_title
def callback(self,hwnd,mouse):
if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
self.hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
#获取窗口位置
def location(self):
win32gui.EnumWindows(self.callback, None)
for hwnd, title in self.hwnd_title.items():
if title is not "" and '微信' in title:
return win32gui.GetWindowRect(hwnd)
获取到窗口坐标后,可以计算出点击【微信通讯录、第一个标星好友、发消息、发送】四个点的坐标。四点的坐标跟屏幕分辨率大小是有关系的,通常分辨率都是1920X1080
def send(self,location):
list = [(location[0]+30, location[1]+150),#点击微信通讯录
(location[0]+280, location[1]+285),#点击标星好友
(location[0]+575, location[1]+405)]#点击发送消息
#鼠标点击系列操作
for v in list:
self.mouse.position = v
self.mouse.click(pynput.mouse.Button.left, 1)
time.sleep(0.1)#等窗口完全打开
定义列表存放要发送的信息,使用random.randrange()随机获取一条信息
self.mouse = pynput.mouse.Controller()#鼠标控制器
self.keyboard = pynput.keyboard.Controller()#键盘控制器
content=[
'吃饭了吗',
'吃的什么',
'好不好吃',
'喝奶茶吗',
'下班了吗',]
self.keyboard.type(content[random.randrange(0,len(content))])#输入内容
self.mouse.position = (location[0]+820, location[1]+605)#发送按钮坐标
self.mouse.click(pynput.mouse.Button.left, 1)#点击发送(S)
APScheduler基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务。基于这些功能,我们可以很方便的实现一个python定时任务系统。
if __name__ == '__main__':
def job():
subprocess.Popen([r"F:\WeChat\WeChat.exe"])
time.sleep(0.1) # 等窗口显示完毕
main = WeChat()
location = main.location()
main.send(location)
scheduler = BlockingScheduler()
scheduler.add_job(job,'interval', minutes=60)#‘seconds’, ‘minutes’, ‘hours’
scheduler.start()