#萌新记录某些日子的学习经历。#
前言:
因为某些原因我需要用自己私人微信号在特定时间给某人发送消息。在网上查阅了一番资料后,我不太打算调用第三方微信接口,原因是我担心这些API的使用会被微信检测到,怕被封号,短时间内我也没有办法找到一个足够安全的第三方微信接口。
所以这里我采用的方法是pyautogui库来模拟我在某个时间使用电脑发消息的行为。整个环节非常简单。
摘要:
使用python中pyautogui,pyperclip,time,datatime库,通过模拟鼠标和键盘操作,实现PC端定时自动发送微信消息。
整个代码流程可以分为:确定时间,打开微信对话框,输入并发送文本。
pyautogui模拟发信息行为
pyautogui是python版的按键精灵,首先下载这个包
pip install pyautogui
它可以模拟鼠标点击特定位置、输入英文、敲击键盘等等功能,这里我们根据需求选择特定的函数。
首先了解两个基本工具:
import pyautogui
pyautogui.size() #返回屏幕的尺寸
x,y = pyautogui.position() #返回当前鼠标所在的位置
首先要模拟的第一个行为是打开和某个人的对话框。比如我这里直接把想发消息的对话框挂在任务栏了,
那么我要做的就是,用pyautogui.position()找到点击这个图标可行的一个坐标位置。比如:
time.sleep(5) # 让我有足够的时间运行这段代码后把鼠标移动到图标上
x,y = pyautogui.position()
print(x,y)
模拟行为中对应的点击操作是:
pyautogui.click(x,y)
点击后弹出对话框,接下来同样的道理在找到输入文本框的位置,并模拟点击。
接下来输入文本,并敲击'enter'键发送。
但需要注意的是,如果用pyautogui.typewrite("输入文字消息")这样的方法输入中文字时是无效的,因为pyautogui没办法发送中文。
这里需要另外一个库pyperclip,它可以把汉字保存在剪切板中,和pyautogui组合使用可以在聊天框中输入中文汉字。
import pyperclip
pyperclip.copy("中文信息") # 把汉字信息复制到剪切板中
pyautogui.hotkey('ctrl','v') # 模拟键盘ctrl+v进行粘贴操作
pyautogui.hotkey('enter') # enter发送消息
至此,基本的发送消息的流程就已经实现了。完整的函数如下:
import time
import pyautogui
import pyperclip
# x,y = pyautogui.position() 不断调用这个函数获得想要的目标位置的坐标
locations = {'wechat':[649,1052], 'screen':[1013,889]} # 记录坐标
# 使用一个msg.txt来保存自己想要发送的消息
f = open("./msg.txt",encoding="utf-8")
msg = [l.strip().strip('\n') for l in f.readlines()]
f.close()
def send_msg():
time.sleep(1)
pyautogui.click(locations['wechat'][0],locations['wechat'][1]) # 打开聊天框
time.sleep(1)
pyautogui.click(locations['screen'][0],locations['screen'][1]) # 点击文本输入栏 准备输入文字
for m in msg: # 一行一行发送信息
time.sleep(1)
pyperclip.copy(m)
pyautogui.hotkey('ctrl','v')
pyautogui.hotkey('enter')
定时发送
定时发送需要不断获取当前的系统时间,直到到达我们需要的时间。需要导入另一个库datetime用来获取系统时间。
import datatime
now = datetime.datetime.now() # 获取当前时间
now_str = now.strftime('%H%M%S') # 提取当前时间的部分信息以str形式保存
now_str
>>> 170434
根据自己的需求设置strftime()的内容,我这里%H%M%S分别表示当前的"时分秒"。只要now_str到达了自己想要发送信息的时间点,就可以执行信息发送的函数了。那么在上文的基础上增加一个循环。
import time
import pyautogui
import pyperclip
# x,y = pyautogui.position() 不断调用这个函数获得想要的目标位置的坐标
locations = {'wechat':[649,1052], 'screen':[1013,889]} # 记录坐标
# 使用一个msg.txt来保存自己想要发送的消息
f = open("./msg.txt",encoding="utf-8")
msg = [l.strip().strip('\n') for l in f.readlines()]
f.close()
def send_msg():
time.sleep(1)
pyautogui.click(locations['wechat'][0],locations['wechat'][1]) # 打开聊天框
time.sleep(1)
pyautogui.click(locations['screen'][0],locations['screen'][1]) # 点击文本输入栏 准备输入文字
for m in msg: # 一行一行发送信息
time.sleep(1)
pyperclip.copy(m)
pyautogui.hotkey('ctrl','v')
pyautogui.hotkey('enter')
# 比如我想在 PM 17:11:00 发送消息
send_time = '171100' # 根据自己的需求确定想要发送的时间 可以再加上年月日之类的
while True:
time.sleep(1)
now = datetime.datetime.now()
now_str = now.strftime('%H%M%S')
if send_time == now_str: # 到达想要发送的时间了
#unlock()
send_msg()
break
print('success')
发送成功如下:
总结:
虽然从代码上实现是挺简单的,但用pyautogui库模拟发送微信这个行为多少有点无奈了。并且有很大的局限性和固定性。比如我必须保证电脑没有被锁住,因为我试了下pyautogui是没办法输入win10锁屏密码的。我还得保证图标在任务栏位置、消息窗口位置不变化。另外pyautogui也可以用别的键盘精灵库代替。
特殊情况还是能用,但想要大规模标准化批量化发送消息可能还是要想别的方法。如果有好用的不会被封号的接口请安利给我。
感谢您阅读到这里。