在日常的软件开发与自动化任务处理中,实现对即时通讯工具如微信的自动化操作往往能为我们带来诸多便利。本文将详细解析一段基于 Python 编写的代码,该代码能够实现对微信消息的监控与特定回复处理,以下是具体的分析。
结果展示(文末附完整代码):
微信自动回复
百度文心一言-Python配置(完整代码版)
字节-豆包AI-Python配置(速通)
一、代码概述
这段 Python 代码实现了一系列功能,主要围绕着与微信窗口的交互、消息的读取以及根据不同消息内容进行针对性回复展开。它集成了多个库,如
volcenginesdkarkruntime
、
pyautogui
、
uiautomation
、
win32gui
、
win32con
等,同时还可调用了自定义的
百度AI开发平台的api文心一言大模型
或者字节跳动的AI豆包大模型来处理不同来源的回复生成。
二、代码详细解析
安装所需要的库
pip install pywin32
(一)日志设置
在代码开头部分,通过以下语句设置了日志:
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
这使得程序在运行过程中能够记录不同级别的信息,方便后续查看程序运行状态以及排查可能出现的错误。
(二)获取豆包回复的函数
doubao
def doubao(content):
client = Ark(api_key="YOUR-API-KEY")
completion = client.chat.completions.create(
model="MODEL-TYPE",
messages=[
{"role": "user", "content": content},
]
)
print(completion.choices[0].message.content)
return completion.choices[0].message.content
此函数用于向特定的模型(这里是示例MODEL-TYPE模型)发送用户提供的内容
content
,并获取模型返回的回复。通过设置好的
Ark
客户端以及相关参数,实现了与外部模型的交互,获取到的回复后续可用于回复微信消息。
(三)获取微信窗口句柄函数
get_wechat_hwnd
def get_wechat_hwnd():
hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
if hwnd:
win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
win32gui.SetForegroundWindow(hwnd)
return hwnd
该函数利用
win32gui
库的
FindWindow
函数来查找微信主窗口的句柄。如果找到句柄,还会通过
ShowWindow
和
SetForegroundWindow
函数将微信窗口显示并设置为前台窗口,以便后续进行操作。
(四)复位聊天窗口函数
reset_chat_window
def reset_chat_window(hwnd):
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
leftpoint = left + 155
toppoint = top + 200 # 180为第三个聊天窗口,加80为第四个聊天窗口
pyautogui.moveTo(leftpoint, toppoint)
pyautogui.click()
return '已复位'
此函数根据传入的微信窗口句柄
hwnd
,通过获取窗口的坐标信息,计算出特定位置的坐标点,然后利用
pyautogui
库将鼠标移动到该点并点击,实现了将聊天窗口复位到消息列表的第二个聊天窗口的功能。
(五)初始化控件引用函数
initialize_controls
def initialize_controls():
wx = WindowControl(Name="微信")
wx.SwitchToThisWindow()
hw = wx.ListControl(Name="会话")
return wx, hw
这里通过
uiautomation
库的相关控件类,首先获取到微信窗口的控件引用
wx
,并将其切换到前台,然后进一步获取到会话列表的控件引用
hw
,为后续读取和处理消息提供了基础。
(六)主函数
main
def main():
hwnd = get_wechat_hwnd()
if not hwnd:
logging.error("无法找到微信窗口")
return
wx, hw = initialize_controls()
last_checked_message = None
while True:
try:
# 尝试获取未读消息控件
we = hw.TextControl(searchDepth=4)
# 检查是否有新的未读消息
if we.Name:
we.Click(simulateMove=False)
# 获取当前最后一条消息
last_msg = wx.ListControl(Name='消息').GetChildren()[-1].Name
print(last_msg[:2])
if last_msg[:2] == 'DB':
res = doubao(last_msg[2:])
wx.SendKeys(res)
wx.SendKeys('{ENTER}')
reset_chat_window(get_wechat_hwnd())
elif last_msg[:2] == 'WX':
res = main_(last_msg[2:])
wx.SendKeys(res)
wx.SendKeys('{ENTER}')
reset_chat_window(get_wechat_hwnd())
elif last_msg[:2] == 'TD':
break
else:
reset_chat_window(get_wechat_hwnd())
pass
# 添加延迟以避免过度检查
time.sleep(1) # 根据需要调整延迟时间
except IndexError:
logging.warning("未找到未读消息控件")
except Exception as e:
logging.error(f"处理未读消息时发生错误: {e}")
# 根据需要决定是否退出循环
在主函数中,首先通过
get_wechat_hwnd
函数尝试获取微信窗口句柄,如果获取失败则记录错误并返回。接着通过
initialize_controls
函数初始化控件引用。
然后进入一个循环,在循环中不断尝试获取未读消息控件。如果找到未读消息控件并且消息内容满足特定条件,就会进行相应的回复操作:
- 当消息前两位是
DB
时: - 则优先进行我们的判断语句进行回复指定的内容。- 其他情况则调用doubao
函数启用字节跳动的AI豆包获取回复并发送,最后复位聊天窗口。 - 当消息前两位是
WX
时: - 处理逻辑与DB
类似,并且调用yiyan函数启用百度AI文心一言获取回复而不是doubao
函数。 - 当消息前两位是
TD
时,直接跳出循环,关闭自动回复。
在整个过程中,如果出现索引错误或其他异常,都会进行相应的日志记录。
三、总结
通过对这段代码的详细解析,我们可以看到它实现了一个较为完整的微信消息自动化处理流程。从获取微信窗口句柄、初始化控件,到监控消息并根据不同内容进行针对性回复,涵盖了多个方面的技术要点,包括 Windows 窗口操作、自动化鼠标键盘操作以及与外部模型的交互获取回复等。希望本文的解析能够帮助读者更好地理解此类自动化程序的实现思路与代码细节,也为大家在自己的开发项目中实现类似功能提供一定的参考。
请注意,在实际使用中,需要确保相关库的正确安装以及
api_key
等参数的正确配置,同时也要遵守微信等平台的使用规范,避免违规操作。
版权归原作者 NiJiMingCheng 所有, 如有侵权,请联系我们删除。