python 微信自动回复机器人

python 微信自动回复机器人python微信自动回复机器人导入wxautohttps://github.com/cluic/wxauto#!python3#-*-coding:utf-8-*-“””Author:tikic@qq.comSource:https://github.com/cluic/wxautoLicense:MITLicenseVersion:3.3.5.3″””fromtokenizeimportNamefromunicodedataimportnameim

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

python 微信自动回复机器人

  1. 导入wxauto https://github.com/cluic/wxauto
    #!python3
    # -*- coding: utf-8 -*-
    """ Author: tikic@qq.com Source: https://github.com/cluic/wxauto License: MIT License Version: 3.3.5.3 """
    from tokenize import Name
    from unicodedata import name
    import uiautomation as uia
    import win32gui, win32con
    import win32clipboard as wc
    import time
    import os
    AUTHOR_EMAIL = 'tikic@qq.com'
    UPDATE = '2021-09-06'
    VERSION = '3.3.5.3'
    COPYDICT = { 
    }
    class WxParam:
    SYS_TEXT_HEIGHT = 33
    TIME_TEXT_HEIGHT = 34
    RECALL_TEXT_HEIGHT = 45
    CHAT_TEXT_HEIGHT = 52
    CHAT_IMG_HEIGHT = 117
    SpecialTypes = ['[文件]', '[图片]', '[视频]', '[音乐]', '[链接]']
    class WxUtils:
    def SplitMessage(MsgItem):
    uia.SetGlobalSearchTimeout(0)
    MsgItemName = MsgItem.Name
    if MsgItem.BoundingRectangle.height() == WxParam.SYS_TEXT_HEIGHT:
    Msg = { 
     'name':'SYS', 'msg':MsgItemName, 'time':''.join([str(i) for i in MsgItem.GetRuntimeId()])}
    elif MsgItem.BoundingRectangle.height() == WxParam.TIME_TEXT_HEIGHT:
    Msg = { 
    'name':'Time', 'msg':MsgItemName, 'time':''.join([str(i) for i in MsgItem.GetRuntimeId()])}
    elif MsgItem.BoundingRectangle.height() == WxParam.RECALL_TEXT_HEIGHT:
    if '撤回' in MsgItemName:
    Msg = { 
    'name':'Recall','msg': MsgItemName, 'time':''.join([str(i) for i in MsgItem.GetRuntimeId()])}
    else:
    Msg = { 
    'name':'SYS', 'msg':MsgItemName,'time': ''.join([str(i) for i in MsgItem.GetRuntimeId()])}
    else:
    Index = 1
    User = MsgItem.ButtonControl(foundIndex=Index)
    try:
    while True:
    if User.Name == '':
    Index += 1
    User = MsgItem.ButtonControl(foundIndex=Index)
    else:
    break
    Msg = { 
    'name':User.Name, 'msg':MsgItemName, 'time':''.join([str(i) for i in MsgItem.GetRuntimeId()])}
    except:
    Msg = { 
    'name':'SYS',  'msg':MsgItemName, 'time':''.join([str(i) for i in MsgItem.GetRuntimeId()])}
    uia.SetGlobalSearchTimeout(10.0)
    return Msg
    def SetClipboard(data, dtype='text'):
    '''复制文本信息或图片到剪贴板 data : 要复制的内容,str 或 Image 图像'''
    if dtype.upper() == 'TEXT':
    type_data = win32con.CF_UNICODETEXT
    elif dtype.upper() == 'IMAGE':
    from io import BytesIO
    type_data = win32con.CF_DIB
    output = BytesIO()
    data.save(output, 'BMP')
    data = output.getvalue()[14:]
    else:
    raise ValueError('param (dtype) only "text" or "image" supported')
    wc.OpenClipboard()
    wc.EmptyClipboard()
    wc.SetClipboardData(type_data, data)
    wc.CloseClipboard()
    def Screenshot(hwnd, to_clipboard=True):
    '''为句柄为hwnd的窗口程序截图 hwnd : 句柄 to_clipboard : 是否复制到剪贴板 '''
    import pyscreenshot as shot
    bbox = win32gui.GetWindowRect(hwnd)
    win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0,\
    win32con.SWP_SHOWWINDOW|win32con.SWP_NOMOVE|win32con.SWP_NOSIZE)
    win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST, 0, 0, 0, 0,\
    win32con.SWP_SHOWWINDOW|win32con.SWP_NOMOVE|win32con.SWP_NOSIZE)
    win32gui.BringWindowToTop(hwnd)
    im = shot.grab(bbox)
    if to_clipboard:
    WxUtils.SetClipboard(im, 'image')
    return im
    def SavePic(savepath=None, filename=None):
    Pic = uia.WindowControl(ClassName='ImagePreviewWnd', Name='图片查看')
    Pic.SendKeys('{Ctrl}s')
    SaveAs = Pic.WindowControl(ClassName='#32770', Name='另存为...')
    SaveAsEdit = SaveAs.EditControl(ClassName='Edit', Name='文件名:')
    SaveButton = Pic.ButtonControl(ClassName='Button', Name='保存(S)')
    PicName, Ex = os.path.splitext(SaveAsEdit.GetValuePattern().Value)
    if not savepath:
    savepath = os.getcwd()
    if not filename:
    filename = PicName
    FilePath = os.path.realpath(os.path.join(savepath, filename + Ex))
    SaveAsEdit.SendKeys(FilePath)
    SaveButton.Click()
    Pic.SendKeys('{Esc}')
    def ControlSize(control):
    locate = control.BoundingRectangle
    size = (locate.width(), locate.height())
    return size
    def ClipboardFormats(unit=0, *units):
    units = list(units)
    wc.OpenClipboard()
    u = wc.EnumClipboardFormats(unit)
    wc.CloseClipboard()
    units.append(u)
    if u:
    units = WxUtils.ClipboardFormats(u, *units)
    return units
    def CopyDict():
    Dict = { 
    }
    for i in WxUtils.ClipboardFormats():
    if i == 0:
    continue
    wc.OpenClipboard()
    try:
    content = wc.GetClipboardData(i)
    wc.CloseClipboard()
    except:
    wc.CloseClipboard()
    raise ValueError
    if len(str(i))>=4:
    Dict[str(i)] = content
    return Dict
    class WeChat:
    def __init__(self):
    self.UiaAPI = uia.WindowControl(ClassName='WeChatMainWndForPC')
    self.SessionList = self.UiaAPI.ListControl(Name='会话')
    self.EditMsg = self.UiaAPI.EditControl(Name='输入')
    self.SearchBox = self.UiaAPI.EditControl(Name='搜索')
    self.MsgList = self.UiaAPI.ListControl(Name='消息')
    self.SessionItemList = []
    def GetWXName(self):
    self.WXName= self.UiaAPI.ButtonControl()
    return self.WXName.Name
    def GetOfficialList(self):
    s= self.UiaAPI.TextControl(Name='公众号')
    print(s)
    def GetNewMsgSessionList(self):
    '''获取发送人会话列表'''
    SessionList= self.GetSessionList()
    NewMsgList=[]
    for name in SessionList:
    s =self.SessionList.ListItemControl(Name=name)
    for i in s.GetChildren():
    for j in i.GetChildren():
    if j.ControlType == 50020 and j.Name !='':
    NewMsgList.append(name)
    return NewMsgList
    def GetSessionList(self, reset=False):
    '''获取当前会话列表,更新会话列表'''
    self.SessionItem = self.SessionList.ListItemControl()
    SessionList = []
    if reset:
    self.SessionItemList = []
    for i in range(100):
    try:
    name = self.SessionItem.Name
    except:
    break
    if name not in self.SessionItemList:
    self.SessionItemList.append(name)
    if name not in SessionList:
    SessionList.append(name)
    self.SessionItem = self.SessionItem.GetNextSiblingControl()
    return SessionList
    def Search(self, keyword):
    ''' 查找微信好友或关键词 keywords: 要查找的关键词,str * 最好完整匹配,不完全匹配只会选取搜索框第一个 '''
    self.UiaAPI.SetFocus()
    time.sleep(0.2)
    self.UiaAPI.SendKeys('{Ctrl}f', waitTime=1)
    self.SearchBox.SendKeys(keyword, waitTime=1.5)
    self.SearchBox.SendKeys('{Enter}')
    def ChatWith(self, who, RollTimes=None):
    ''' 打开某个聊天框 who : 要打开的聊天框好友名,str; * 最好完整匹配,不完全匹配只会选取搜索框第一个 RollTimes : 默认向下滚动多少次,再进行搜索 '''
    self.UiaAPI.SwitchToThisWindow()
    RollTimes = 10 if not RollTimes else RollTimes
    def roll_to(who=who, RollTimes=RollTimes):
    for i in range(RollTimes):
    if who not in self.GetSessionList()[:-1]:
    self.SessionList.WheelDown(wheelTimes=3, waitTime=0.1*i)
    else:
    time.sleep(0.5)
    self.SessionList.ListItemControl(Name=who).Click(simulateMove=False)
    return 1
    return 0
    rollresult = roll_to()
    if rollresult:
    return 1
    else:
    self.Search(who)
    return roll_to(RollTimes=1)
    def SendMsg(self, msg, clear=True):
    '''向当前窗口发送消息 msg : 要发送的消息 clear : 是否清除当前已编辑内容 '''
    self.UiaAPI.SwitchToThisWindow()
    if clear:
    self.EditMsg.SendKeys('{Ctrl}a', waitTime=0)
    self.EditMsg.SendKeys(msg, waitTime=0)
    self.EditMsg.SendKeys('{Enter}', waitTime=0)
    def SendFiles(self, *filepath, not_exists='ignore'):
    """向当前聊天窗口发送文件 not_exists: 如果未找到指定文件,继续或终止程序 *filepath: 要复制文件的绝对路径"""
    global COPYDICT
    key = ''
    for file in filepath:
    file = os.path.realpath(file)
    if not os.path.exists(file):
    if not_exists.upper() == 'IGNORE':
    print('File not exists:', file)
    continue
    elif not_exists.upper() == 'RAISE':
    raise FileExistsError('File Not Exists: %s'%file)
    else:
    raise ValueError('param not_exists only "ignore" or "raise" supported')
    key += '<EditElement type="3" filepath="%s" shortcut="" />'%file
    if not key:
    return 0
    if not COPYDICT:
    self.EditMsg.SendKeys(' ', waitTime=0)
    self.EditMsg.SendKeys('{Ctrl}a', waitTime=0)
    self.EditMsg.SendKeys('{Ctrl}c', waitTime=0)
    self.EditMsg.SendKeys('{Delete}', waitTime=0)
    while True:
    try:
    COPYDICT = WxUtils.CopyDict()
    break
    except:
    pass
    wc.OpenClipboard()
    wc.EmptyClipboard()
    wc.SetClipboardData(13, '')
    wc.SetClipboardData(16, b'\x04\x08\x00\x00')
    wc.SetClipboardData(1, b'')
    wc.SetClipboardData(7, b'')
    for i in COPYDICT:
    copydata = COPYDICT[i].replace(b'<EditElement type="0"><![CDATA[ ]]>', key.encode()).replace(b'type="0"', b'type="3"')
    wc.SetClipboardData(int(i), copydata)
    wc.CloseClipboard()
    self.SendClipboard()
    return 1
    def SendClipboard(self):
    '''向当前聊天页面发送剪贴板复制的内容'''
    self.SendMsg('{Ctrl}v')
    @property
    def GetAllMessage(self):
    '''获取当前窗口中加载的所有聊天记录'''
    MsgDocker = []
    MsgItems = self.MsgList.GetChildren()
    for MsgItem in MsgItems:
    MsgDocker.append(WxUtils.SplitMessage(MsgItem))
    return MsgDocker
    @property
    def GetLastMessage(self):
    '''获取当前窗口中最后一条聊天记录'''
    uia.SetGlobalSearchTimeout(1.0)
    MsgItem = self.MsgList.GetChildren()[1]
    Msg = WxUtils.SplitMessage(MsgItem)
    uia.SetGlobalSearchTimeout(10.0)
    return Msg
    def LoadMoreMessage(self, n=0.1):
    '''定位到当前聊天页面,并往上滚动鼠标滚轮,加载更多聊天记录到内存'''
    n = 0.1 if n<0.1 else 1 if n>1 else n
    self.MsgList.WheelUp(wheelTimes=int(500*n), waitTime=0.1)
    def SendScreenshot(self, name=None, classname=None):
    '''发送某个桌面程序的截图,如:微信、记事本... name : 要发送的桌面程序名字,如:微信 classname : 要发送的桌面程序类别名,一般配合 spy 小工具使用,以获取类名,如:微信的类名为 WeChatMainWndForPC'''
    if name and classname:
    return 0
    else:
    hwnd = win32gui.FindWindow(classname, name)
    if hwnd:
    WxUtils.Screenshot(hwnd)
    self.SendClipboard()
    return 1
    else:
    return 0
    
  2. 获取窗口微信聊天窗口发送消息
    import json
    from win32gui import *
    import win32gui
    import  random
    import win32con
    from wxauto import *
    wx = WeChat()
    chat=None
    while True:
    if chat is not None:
    wx.ChatWith(chat)
    msg = wx.GetLastMessage
    if msg["name"] == chat:
    wx.SendMsg('机器人测试')
    list =wx.GetNewMsgSessionList()
    for user in list:
    wx.ChatWith(user)
    wx.SendMsg('机器人测试')
    chat=user
    time.sleep(10)
    time.sleep(10)
    
  3. 使用UISpy.exe 查找窗口类
    https://download.csdn.net/download/sinat_31062885/85282437
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187098.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 视频直播之基础原理

    视频直播之基础原理SDK(SoftwareDevelopmentKit):软件开发工具包涉及的技术:采集处理编码封包推流播放RTMP(RealTimeMessagingProtocol,实时消息传送协议),是AdobeSystems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。优点:主流CDN支持,市面上绝大多数的直播产品采用;协议简单易实现缺点:基于…

  • J2ME 开发工具

    J2ME 开发工具J2ME开发工具1.J2ME高级开发工具高级的MIDP应用程序开发工具能够帮助开发人员简化J2ME开发过程,包括Sun提供的官方开发工具WTK和手机厂商提供的专属SDK.J2MEWi

  • java int最大值和最小值_excel中求最大值和最小值

    java int最大值和最小值_excel中求最大值和最小值Java中Integer的最大值和最小值.JavaByte的最大值和最小值.Javafloat的最大值和最小值.Javalong的最大值和最小值.

  • myeclipse下载地址_eclipse手机版

    myeclipse下载地址_eclipse手机版由于MyEclipse屏蔽了大陆ip,所以下载MyEclipse还是比较麻烦的,下面是MyEclipse7.5GA的各种版本的直接地址:1-MyEclipseEnterpriseWorkbench7.5forWindows98/2000/NT/XP/Vista(06/17/2009)MyEclipseEnterpriseWorkbench7.5GAforEc

  • IDEA 2019.3.4激活码 licences key is in_通用破解码

    IDEA 2019.3.4激活码 licences key is in_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • ioctl() FIONREAD

    ioctl() FIONREAD函数名:ioctl  头文件:#include  功能:控制I/O设备,提供了一种获得设备信息和向设备发送控制参数的手段。用于向设备发控制和配置命令,有些命令需要控制参数,这些数据是不能用read/write读写的,称为Out-of-band数据。也就是说,read/write读写的数据是in-band数据,是I/O操作的主体,而ioctl命

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号