关于python:Python模拟人手操作微信调用Win32Api控制微信Python给微信发消息加好友获取聊天记录

5次阅读

共计 10191 个字符,预计需要花费 26 分钟才能阅读完成。

需要

始终以来,都有很多人通过各种方法去实现微信机器人,或者是管制微信电脑版去实现微信的 API,例如 Hook 微信、iPad 协定、web 微信协定、Android 微信协定、以及基于浏览器的 puppet,办法很多,然而各种办法都有各自的一些毛病。

本文应用的办法是通过 Python 去调用 Windows API 实现模仿人工操作的形式去实现管制微信电脑版,这也是一种不错的方法,然而也有一些不确定因素及稳定性。

代码

本文所波及到的模块会比拟多,其中 PIL 是用于图片辨认来实现一些读取聊天记录的性能,win32clipboard 次要实现是模仿输出,win32api、win32con、win32gui、pyautogui 就是外围的库,次要用于调用 API 去模仿人手操作微信电脑版。

import pyautogui
import time
import win32api
import win32con
import win32gui
import win32clipboard as w
from PIL import ImageGrab
import requests
import base64

winwxpy.py

import pyautogui
import time
import win32api
import win32con
import win32gui
import win32clipboard as w
from PIL import ImageGrab
import requests
import base64

def FindWindow(chatroom):
    win = win32gui.FindWindow('WeChatMainWndForPC',chatroom)
    print("找到窗口句柄:%x" % win)
    if win != 0:
        win32gui.ShowWindow(win, win32con.SW_SHOWMINIMIZED)
        win32gui.ShowWindow(win, win32con.SW_SHOWNORMAL)
        win32gui.ShowWindow(win, win32con.SW_SHOW)
        win32gui.SetWindowPos(win, win32con.HWND_TOP, 0, 0, 500, 700, win32con.SWP_SHOWWINDOW)
        win32gui.SetForegroundWindow(win)  # 获取管制
        time.sleep(1)
        tit = win32gui.GetWindowText(win)
        print('已启动【'+str(tit)+'】窗口')
    else:
        print('找不到【%s】窗口' % chatroom)
        exit()

# 设置和粘贴剪贴板
def ClipboardText(ClipboardText):
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_UNICODETEXT, ClipboardText)
    w.CloseClipboard()
    time.sleep(1)
    win32api.keybd_event(17,0,0,0)
    win32api.keybd_event(86,0,0,0)
    win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0)
    win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)

# 模仿发送动作
def SendMsg():
    win32api.keybd_event(18, 0, 0, 0)
    win32api.keybd_event(83,0,0,0)
    win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0)
    win32api.keybd_event(83,0,win32con.KEYEVENTF_KEYUP,0)

# 模仿发送微信文本音讯
def SendWxMsg(wxid,sendtext):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到搜寻框
    pyautogui.moveTo(143, 39)
    pyautogui.click()
    # 搜寻微信
    ClipboardText(wxid)
    time.sleep(1)
    # 进入聊天窗口
    pyautogui.moveTo(155, 120)
    pyautogui.click()
    # 粘贴文本内容
    ClipboardText(sendtext)
    # 发送
    SendMsg()
    print('已发送')
    # 敞开微信窗口
    time.sleep(1)
    pyautogui.moveTo(683, 16)
    pyautogui.click()

# 模仿发送文件音讯(图片、文档、压缩包等)def SendWxFileMsg(wxid,imgpath):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到搜寻框
    pyautogui.moveTo(143, 39)
    pyautogui.click()
    # 搜寻微信
    ClipboardText(wxid)
    time.sleep(1)
    # 进入聊天窗口
    pyautogui.moveTo(155, 120)
    pyautogui.click()
    # 抉择文件
    pyautogui.moveTo(373, 570)
    pyautogui.click()
    ClipboardText(imgpath)
    time.sleep(1)
    pyautogui.moveTo(784, 509)
    pyautogui.click()
    # 发送
    SendMsg()
    print('已发送')
    # 敞开微信窗口
    time.sleep(1)
    pyautogui.moveTo(683, 16)
    pyautogui.click()

# 转发群里最新的一条音讯
def ZhuanfaMsg(wxid,groupname):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到搜寻框
    pyautogui.moveTo(143, 39)
    pyautogui.click()
    # 搜寻群
    ClipboardText(groupname)
    time.sleep(1)
    # 进入群窗口
    pyautogui.moveTo(155, 120)
    pyautogui.click()
    # 开始转发
    pyautogui.moveTo(484, 439)
    time.sleep(1)
    pyautogui.rightClick()
    pyautogui.moveTo(543, 454)
    time.sleep(1)
    pyautogui.click()
    # 搜寻用户
    ClipboardText(wxid)
    time.sleep(1)
    pyautogui.moveTo(828, 406)
    pyautogui.click()
    time.sleep(1)
    # 确定转发
    pyautogui.moveTo(1108, 755)
    pyautogui.click()

# 获取你的个人信息(昵称、微信号)def GetYourInfo():
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 点击你的头像
    pyautogui.moveTo(28, 56)
    pyautogui.click()
    time.sleep(1)
    # 用户信息截图
    userinfo = (20, 60, 319, 284)
    userinfo_img = ImageGrab.grab(userinfo)
    userinfo_img.save('userinfo.png')
    # 辨认用户信息截图
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    f = open('userinfo.png', 'rb')
    img = base64.b64encode(f.read())
    params = {"image":img}
    access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print (response.json())
    time.sleep(1)
    # 敞开微信窗口
    time.sleep(1)
    pyautogui.moveTo(683, 16)
    pyautogui.click()

# 获取好友微信的个人信息(昵称、微信号)def GetFriendInfo(wxid):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到搜寻框
    pyautogui.moveTo(143, 39)
    pyautogui.click()
    # 搜寻微信
    ClipboardText(wxid)
    time.sleep(1)
    # 进入聊天窗口
    pyautogui.moveTo(160, 93)
    pyautogui.click()
    time.sleep(1)
    # 点击右上角···
    pyautogui.moveTo(678, 43)
    pyautogui.click()
    time.sleep(1)
    pyautogui.moveTo(801, 51)
    pyautogui.click()
    # 用户信息截图
    userinfo = (802, 54, 1085, 331)
    userinfo_img = ImageGrab.grab(userinfo)
    userinfo_img.save('userinfo.png')
    # 辨认用户信息截图
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    f = open('userinfo.png', 'rb')
    img = base64.b64encode(f.read())
    params = {"image":img}
    access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print (response.json())
    time.sleep(1)
    # 敞开微信窗口
    time.sleep(1)
    pyautogui.moveTo(683, 16)
    pyautogui.click()
    pyautogui.click()

# 获取群人数
def GetCharRoomUserNum(groupname):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到搜寻框
    pyautogui.moveTo(143, 39)
    pyautogui.click()
    # 搜寻群
    ClipboardText(groupname)
    time.sleep(1)
    # 进入群窗口
    pyautogui.moveTo(155, 120)
    pyautogui.click()
    # 群人数区域截图
    userinfo = (310, 0, 659, 47)
    userinfo_img = ImageGrab.grab(userinfo)
    userinfo_img.save('chatroom.png')
    # 辨认群人数截图
    # 开发文档:https://cloud.baidu.com/doc/OCR/s/Ck3h7y2ia
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    f = open('chatroom.png', 'rb')
    img = base64.b64encode(f.read())
    params = {"image":img}
    access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print (response.json())
    time.sleep(1)
    # 敞开微信窗口
    time.sleep(1)
    pyautogui.moveTo(683, 16)
    pyautogui.click()


# 公布群布告
def AddGorupNotice(groupname,NoticeText):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到搜寻框
    pyautogui.moveTo(143, 39)
    pyautogui.click()
    # 搜寻群
    ClipboardText(groupname)
    time.sleep(1)
    # 进入群窗口
    pyautogui.moveTo(155, 120)
    pyautogui.click()
    # 定位到群名称
    pyautogui.moveTo(363, 33)
    pyautogui.click()
    # 定位到群布告
    time.sleep(1)
    pyautogui.moveTo(731, 509)
    pyautogui.click()
    # 粘贴群布告内容
    ClipboardText(NoticeText)
    # 确认公布群布告
    time.sleep(1)
    pyautogui.moveTo(288, 500)
    pyautogui.click()
    pyautogui.moveTo(312, 297)
    pyautogui.click()

# 邀请好友进群
def ReqFriendsToGroup(groupname,wxid):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到搜寻框
    pyautogui.moveTo(143, 39)
    pyautogui.click()
    # 搜寻群
    ClipboardText(groupname)
    time.sleep(1)
    # 进入群窗口
    pyautogui.moveTo(155, 120)
    pyautogui.click()
    # 定位到群名称
    pyautogui.moveTo(363, 33)
    pyautogui.click()
    # 定位到邀请
    time.sleep(1)
    pyautogui.moveTo(852, 300)
    pyautogui.click()
    # 搜寻好友
    ClipboardText(wxid)
    # 收回邀请
    time.sleep(1)
    pyautogui.moveTo(232, 197)
    pyautogui.click()
    time.sleep(1)
    pyautogui.moveTo(493, 561)
    pyautogui.click()
    time.sleep(1)
    pyautogui.moveTo(395, 427)
    pyautogui.click()

# 获取好友最新的聊天记录
def GetChatRecord(wxid):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 搜寻微信号
    pyautogui.moveTo(166, 38)
    pyautogui.click()
    ClipboardText(wxid)
    time.sleep(1)
    pyautogui.moveTo(197, 123)
    pyautogui.click()
    # 聊天内容区域截图
    userinfo = (314, 68, 683, 549)
    userinfo_img = ImageGrab.grab(userinfo)
    userinfo_img.save('chatrecord.png')
    # 辨认以后聊天窗口截图
    # 开发文档:https://cloud.baidu.com/doc/OCR/s/Ck3h7y2ia
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    f = open('chatrecord.png', 'rb')
    img = base64.b64encode(f.read())
    params = {"image":img}
    access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print (response.json())

# 置顶群或好友
def SetTop(groupname_wxid):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到搜寻框
    pyautogui.moveTo(143, 39)
    pyautogui.click()
    # 搜寻群或好友
    ClipboardText(groupname_wxid)
    time.sleep(1)
    # 进入窗口
    pyautogui.moveTo(155, 120)
    pyautogui.click()
    # 关上设置
    pyautogui.moveTo(684, 38)
    pyautogui.click()
    time.sleep(1)
    # 置顶
    pyautogui.moveTo(914, 227)
    pyautogui.click()
    time.sleep(1)
    pyautogui.moveTo(682, 18)
    pyautogui.click()
    print('已将'+str(groupname_wxid)+'置顶')


# 增加微信
def AddWx(wxid):
    # 先启动微信
    FindWindow('微信')
    time.sleep(1)
    # 定位到增加微信地位
    pyautogui.moveTo(25, 151)
    pyautogui.click()
    time.sleep(1)
    pyautogui.moveTo(278, 39)
    pyautogui.click()
    time.sleep(1)
    pyautogui.moveTo(153, 39)
    pyautogui.click()
    time.sleep(1)
    # 搜寻微信号
    ClipboardText(wxid)
    time.sleep(1)
    pyautogui.moveTo(183, 91)
    pyautogui.click()
    time.sleep(2)
    # 对搜寻微信号后果进行截图
    userinfo = (306, 68, 565, 240)
    userinfo_img = ImageGrab.grab(userinfo)
    userinfo_img.save('addwx.png')
    # 对搜寻微信号后果进行辨认
    # 开发文档:https://cloud.baidu.com/doc/OCR/s/Ck3h7y2ia
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    f = open('addwx.png', 'rb')
    img = base64.b64encode(f.read())
    params = {"image":img}
    access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print (response.json())
    # 增加
    time.sleep(1)
    pyautogui.moveTo(435, 203)
    pyautogui.click()
    time.sleep(1)
    pyautogui.moveTo(300, 621)
    pyautogui.click()
    time.sleep(1)
    pyautogui.moveTo(278, 37)
    pyautogui.click()
    print('已向'+str(wxid)+'发送增加好友申请')
    pyautogui.moveTo(682, 18)
    pyautogui.click()

# 发送文本音讯(微信号或微信昵称或备注,须要发送的文本音讯)# SendWxMsg('微信号','Python 发送微信音讯')

# 发送文件音讯(图片、文档、压缩包等)# SendWxFileMsg('微信号',r"文件门路")

# 转发群里最新的一条音讯(微信号或微信昵称或备注,群名称)# ZhuanfaMsg('微信号','群名称')

# 获取你的个人信息(昵称、微信号)# GetYourInfo('微信号')

# 获取好友微信的个人信息(昵称、微信号)# GetFriendInfo('微信号')

# 获取微信群人数
# GetCharRoomUserNum('群名称')

# 公布群布告
# AddGorupNotice('群名称','Python 公布群布告')

# 邀请好友进群
# ReqFriendsToGroup('群名称','cbzqx88')

# 获取好友最新的聊天记录
# GetChatRecord('微信号')

# 置顶群或好友
# SetTop('微信号')

# 增加微信
# AddWx('微信号')

运行

以上的 winwxpy.py 曾经将罕用的一些操作写成了函数,只须要调用对应的函数,传入微信号、内容、群名称等参数进去即可调用其中的性能,目前已实现的性能如下:

# 发送文本音讯(微信号或微信昵称或备注,须要发送的文本音讯)# SendWxMsg('微信号','Python 发送微信音讯')

# 发送文件音讯(图片、文档、压缩包等)# SendWxFileMsg('微信号',r"文件门路")

# 转发群里最新的一条音讯(微信号或微信昵称或备注,群名称)# ZhuanfaMsg('微信号','群名称')

# 获取你的个人信息(昵称、微信号)# GetYourInfo('微信号')

# 获取好友微信的个人信息(昵称、微信号)# GetFriendInfo('微信号')

# 获取微信群人数
# GetCharRoomUserNum('群名称')

# 公布群布告
# AddGorupNotice('群名称','Python 公布群布告')

# 邀请好友进群
# ReqFriendsToGroup('群名称','cbzqx88')

# 获取好友最新的聊天记录
# GetChatRecord('微信号')

# 置顶群或好友
# SetTop('微信号')

# 增加微信
# AddWx('微信号')

例如我想实现给微信好友发送一条音讯,只须要将函数名前的正文符号 # 去掉,而后将 微信号 批改为你要发送的微信号,右侧的 Python 发送微信音讯 改为你要发送的内容。

# 发送文本音讯(微信号或微信昵称或备注,须要发送的文本音讯)SendWxMsg('微信号','Python 发送微信音讯')

例如给微信号 sansure2016 发送一条音讯为 你好,里客云科技

SendWxMsg('sansure2016','你好,里客云科技')

而后再 cmd 执行代码即可

python winwxpy.py

执行只有请不要动鼠标和键盘,因为此时 python 会自动控制你的鼠标和键盘实现主动点击、搜寻、发送等步骤。

版本要求

脚本基于目前最新版微信(3.7.5.23)进行匹配。

二次开发

能够基于本源码进行二次创作,例如引入 http 进行近程调用函数实现近程管制微信。你能够在一台 Windows 服务器登录电脑版微信,而后应用这个脚本,实现近程管制,就能够实现微信的 API 了。或者是在本地 windows 零碎,通过内网穿梭形式去调用 http 来管制微信。

作者

TANKING

正文完
 0