Python使用Win32和天行机器人API实现微信自动聊天机器人(自动敷衍机器人)

简介

设计的初衷本来是来源于期末课程的作业,本来微信有很多可以用的库,例如:itchat,但是实际运用发现由于微信的限制,网页微信基本不可以使用了,所以几乎堵死了这些现成的库。但是我不甘心呀。

开发流程

一、问题分析

所面临的问题其实很明显,我们需要获取聊天时对方发来的消息,并把消息post给机器人API并得到回复,再将回复消息粘贴到聊天框,并发送。
由此,我们可以知道,需要剪贴板,需要模拟按键,需要post请求
所以我们使用以下包

import win32gui
import win32con
import win32clipboard as w
import time
import win32api
import requests

二、代码实现

1.得到对方发送来的消息

首先在这一步中我们需要拿到对方发来的消息,在win32中,为了方便定位复制位置,首先将聊天窗口独立打开,并全屏。
经过观察发现,新消息基本是出现在同一位置
在这里插入图片描述
此时我们已经可以确定将鼠标移动到的位置
下一步将确定如何选中文本
在观察后发现实际只需要右键就可以选中全部文本
在这里插入图片描述
但是虽然选中了但是会出现一个菜单,菜单中有复制选项。
最初的想法是移动鼠标左键点击复制,但是实际操作发现不现实,精度太低了,容易出错。

所以选择再左键点击下关闭菜单,然后使用模拟Ctrl+C的快捷键复制

    win32api.SetCursorPos([90,680])#移动鼠标位置
    #执行右单键击
    win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
    time.sleep(2)#延时
    #执行左单键击
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    time.sleep(2)
    # 以下为“CTRL+C”组合键,回车发送,(方法一)
    win32api.keybd_event(17, 0, 0, 0)  # ctrl键位码是17
    win32api.keybd_event(67, 0, 0, 0)  # v键位码是67
    win32api.keybd_event(67, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)

通过以上操作,已经成功获得了发送的文字

2.从剪贴板获取信息并发送

这一步很简单,直接使用代码表示

        w.OpenClipboard() #打开剪贴板
        msg = w.GetClipboardData()#获取信息
        #关闭剪贴板
        w.CloseClipboard()
    url = 'http://api.tianapi.com/txapi/robot/index?key=xxxxx&question={}'.format(msg) #机器人API地址
    html = requests.get(url)
    returnmsg = html.json()["newslist"][0]['reply']
    #打开剪贴板
    w.OpenClipboard()
    #清空剪贴板
    w.EmptyClipboard()
    #设置剪贴板内容
    w.SetClipboardData(win32con.CF_UNICODETEXT, returnmsg)
    #获取剪贴板内容
    data = w.GetClipboardData()
    #关闭剪贴板
    w.CloseClipboard()

并将机器人的回复放到剪贴板中

3.发送消息

在这一部分,我们将发送消息,经过观察发现微信的信息框在获取信息结束后是失焦状态,所以我们需要移动鼠标并点击信息框,才可以输入信息。

在输入状态下,使用模拟Ctrl+V的按键操作,粘贴机器人的回复
并使用模拟回车,发送消息。

    win32api.SetCursorPos([100,780]) #移动鼠标
    #执行左单键击,若需要双击则延时几毫秒再点击一次即可
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    # 以下为“CTRL+V”组合键,回车发送,(方法一)
    win32api.keybd_event(17, 0, 0, 0)  # ctrl键位码是17
    win32api.keybd_event(86, 0, 0, 0)  # v键位码是86
    win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    time.sleep(1)  # 缓冲时间
    
    win32api.keybd_event(13, 0, 0, 0)  # Rutrn键位码是13,按下
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键

4.补充

程序获取窗口句柄的代码

    name = 'XXX'#聊天窗口的名字  
    handle = win32gui.FindWindow(None, name)

总结

本次项目完成,虽然基本完成了逻辑的实现,但是还是有很多问题存在,大体的设计思路如上,但是不代表最终程序,还有诸如:检测回复状态,重复执行实现等问题等待读者去解答。这也是为了调动积极性,始终复制代码不代表学会。

掘金地址:https://juejin.cn/post/7106861239560568846/

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值