python 微信自动回复机器人

2023-05-16

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 微信自动回复机器人 的相关文章

  • Android App Bundle 自动打包原理

    Google推出Android App Bundle 已经有一段时间了 根据Google的政策说明 xff0c 预计2021年8月之后 xff0c 新发布的应用都必须使用Android App Bundle aab 来上架Google Pl
  • 【玩转Linux】Linux虚拟机设置固定IP

    Linux虚拟机Centos系统的ip总是变化 xff0c 如何固定下来 xff1f 尝试了好多方式 xff0c 终于找到一种最为简单的方法 文章目录 1 查看Centos的IP信息2 修改文件3 刷新网络配置 1 查看Centos的IP信
  • Docker安装MySQL数据库

    文章目录 一 简单方式二 挂载方式1 创建挂载目录2 启动容器 三 修改配置文件1 新建my cnf2 编辑my cnf3 查看是否生效 一 简单方式 span class token function docker span run sp
  • 解决Docker镜像拉取失败问题

    一 问题 Docker拉取mysql镜像 xff0c 发生报错 span class token function docker span pull mysql 8 0 22 报错信息 xff1a Error response from d
  • Docker安装RabbitMQ消息队列

    文章目录 1 启动容器2 连接访问 1 启动容器 span class token function docker span run name rabbitmq span class token punctuation span resta
  • 【玩转Linux】Linux安装宝塔面板

    文章目录 一 简介二 安装1 centos脚本安装2 浏览器访问 三 总结 一 简介 宝塔面板 xff0c 是安全高效的服务器运维面板 xff0c 一个提升运维效率的服务器管理软件 xff0c 支持一键LAMP LNMP 集群 监控 网站
  • 使用JDK的keytool工具生成JKS证书

    使用JDK的keytool工具生成JKS证书 文章目录 1 生成JKS证书2 查看JKS证书详细信息3 导出证书 1 生成JKS证书 keytool genkey alias jwt keyalg RSA keystore jwt jks
  • 【算法】二分查找

    算法 二分查找 题目 xff1a 请实现无重复数字的升序数组的二分查找 难度 xff1a 简单 代码 xff1a 二分查找 xff0c 又叫折半查找 xff0c 要求待查找的序列有序 每次取中间位置的值与待查关键字比较 xff0c 如果中间
  • 【算法】反转链表

    算法 反转链表 题目 xff1a 给定一个单链表的头结点pHead xff0c 长度为n xff0c 反转该链表后 xff0c 返回新链表的表头 难度 xff1a 简单 代码 xff1a span class token keyword c
  • 【算法】合并两个排序的链表

    算法 合并两个排序的链表 题目 xff1a 输入两个递增的链表 xff0c 单个链表的长度为n xff0c 合并这两个链表并使新链表中的节点仍然是递增排序的 难度 xff1a 简单 代码 xff1a span class token key
  • 【算法】判断链表中是否有环

    算法 判断链表中是否有环 题目 xff1a 判断给定的链表中是否有环 如果有环则返回true xff0c 否则返回false 难度 xff1a 简单 代码 xff1a span class token keyword public span
  • 教你快速高效接入SDK——手游聚合SDK的总体思路和架构

    U8SDK技术博客 xff1a http www uustory com xff0c 欢迎来坐坐 百度传课已经停运 xff0c 最新U8SDK视频教程已经转移至B站 xff1a U8SDK最新视频教程 题记 xff1a 很多做游戏开发的人
  • 【算法】删除链表的倒数第N个结点

    算法 删除链表的倒数第N个结点 题目 xff1a 给你一个链表 xff0c 删除链表的倒数第 n 个结点 xff0c 并且返回链表的头结点 难度 xff1a 中等 代码 xff1a span class token keyword publ
  • 阿里云智能编码插件Cosy,提升开发效率杠杠滴!

    文章目录 一 简介二 核心功能1 代码智能补全2 代码示例搜索 三 产品特性1 提升编码效率2 沉浸式开发3 低资源消耗4 隐私保护 四 快速开始1 安装IntelliJ IDEA插件2 测试代码智能补全3 测试代码示例搜索 五 总结 一
  • Alibaba Cloud Toolkit轻量部署插件,一键发布服务器

    文章目录 一 简介二 部署方式1 传统部署方式2 Cloud Toolkit部署方式 四 产品功能五 部署步骤1 安装插件2 添加主机3 Deploy to Host4 控制台5 服务器 六 服务器代码热部署七 Arthas诊断 一 简介
  • 新人一看就懂:Dubbo3 + Nacos的RPC远程调用框架demo

    文章目录 一 前言Feign和Dubbo到底有啥区别 xff0c 为啥大厂都爱用RPC框架 xff1f 二 简介三 dubbo api xff08 对外暴漏的接口 xff09 1 TestService接口 四 dubbo provider
  • Docker安装Kafka消息队列

    文章目录 1 安装zookeeper2 安装kafka3 安装kafka map xff08 可选 xff09 1 安装zookeeper span class token function docker span run span cla
  • 【Spring Boot实战与进阶】集成Kafka消息队列

    汇总目录链接 xff1a Spring Boot实战与进阶 学习目录 文章目录 一 简介二 集成Kafka消息队列1 引入依赖2 配置文件3 测试生产消息4 测试消费消息 一 简介 Kafka是由Apache软件基金会开发的一个开源流处理平
  • Hutool工具类之excel导入导出

    文章目录 1 导入excel2 导出excel 1 导入excel span class token class name ExcelReader span reader span class token operator 61 span
  • Docker安装RockerMQ消息队列

    文章目录 1 安装namesrv2 安装broker3 安装console xff08 可选 xff09 1 安装namesrv namesrv就类似于消息队列的注册中心 span class token function docker s

随机推荐

  • 【Spring Boot实战与进阶】集成RockerMQ消息队列

    汇总目录链接 xff1a Spring Boot实战与进阶 学习目录 文章目录 一 简介二 集成RockerMQ消息队列1 引入依赖2 配置文件3 测试生产消息4 测试消费消息 一 简介 RocketMQ 是阿里巴巴在2012年开源的分布式
  • linux下elasticsearch 安装、配置及示例

    简介 开始学es xff0c 我习惯边学边记 xff0c 总结出现的问题和解决方法 本文是在两台linux虚拟机下 xff0c 安装了三个节点 本次搭建es同时实践了两种模式 单机模式和分布式模式 条件允许的话 xff0c 可以在多台机器上
  • Java服务器热部署的实现原理

    今天发现早年在大象笔记中写的一篇笔记 xff0c 之前放在ijavaboy上的 xff0c 现在它已经访问不了了 前几天又有同事在讨论这个问题 这里拿来分享一下 在web应用开发或者游戏服务器开发的过程中 xff0c 我们时时刻刻都在使用热
  • win10打开热点提示:我们无法设置移动热点

    解决方案 xff1a 1 右键我的电脑 xff0c 打开管理 2 双击带有下载标记wi fi 适配器 xff0c 点击启用设备 xff0c 确认即可
  • Docker容器打包迁移

    有时在一个docker内部署的容器不想在其它服务器容器上重新部署 xff0c 再配置配置文件 这时直接将当前的容器打包然后直接部署到新的服务器上即可 xff0c 免了再配置一遍 1 将容器保存为镜像 先把容器停止运行不然会有问题 容器保存为
  • 四旋翼飞行器的原理研究和建模

    四旋翼飞行器的原理研究和建模 对四旋翼飞行器的工作原理进行了简单介绍 xff0c 对其飞行姿态角进行描述 xff0c 并在此基础上建立数学模型 四旋翼飞行器的原理 根据四旋翼飞行器的运动方式的特点将其飞行控制划分为四种基本的飞行控制方式 1
  • 数组名和函数名是什么东西

    数组名和函数名的本质都是一个 指向数组首地址或函数体的指针常量 的名字 规则1 xff1a 数组 61 指向数组首地址的指针常量 43 数组元素 简单说就是 xff0c 数组 61 指针常量 43 数组内容 xff0c 数组名就是这个指针常
  • RT-Thread进阶之低功耗PM组件应用笔记

    电源管理组件 嵌入式系统低功耗管理的目的在于满足用户对性能需求的前提下 xff0c 尽可能降低系统能耗以延长设备待机时间 高性能与有限的电池能量在嵌入式系统中矛盾最为突出 xff0c 硬件低功耗设计与软件低功耗管理的联合应用成为解决矛盾的有
  • 【STM32H750】玩转ART-Pi(一)——使用STM32CUBMX生成TouchGFX工程

    目录 STM32H750 玩转ART Pi xff08 一 xff09 使用STM32CUBMX生成TouchGFX工程 STM32H750 玩转ART Pi xff08 二 xff09 制作MDK的外部QSPI FLASH烧录算法 STM
  • 【STM32H750】玩转ART-Pi(二)——制作MDK的外部QSPI-FLASH烧录算法

    目录 STM32H750 玩转ART Pi xff08 一 xff09 使用STM32CUBMX生成TouchGFX工程 STM32H750 玩转ART Pi xff08 二 xff09 制作MDK的外部QSPI FLASH烧录算法 STM
  • linux驱动开发篇(四)—— platform平台设备驱动

    linux系列目录 xff1a linux基础篇 xff08 一 xff09 GCC和Makefile编译过程 linux基础篇 xff08 二 xff09 静态和动态链接 ARM裸机篇 xff08 一 xff09 i MX6ULL介绍 A
  • C语言变参函数和可变参数宏

    文章目录 一 变参函数的设计与实现1 变参函数初体验2 变参函数改进版3 变参函数 V3 0 版本3 变参函数 V4 0 版本4 变参函数 V5 0 版本 二 可变参数宏的设计与实现1 什么是可变参数宏2 宏连接符 的作用3 可变参数宏的另
  • 利用MDK的FLM文件生成通用flash驱动

    文章目录 前言一 FLM文件是什么 xff1f 二 FLM文件结构1 FlashPrg c2 FlashPrg c 三 解析FLM文件1 解析flm文件 四 设计flash驱动抽象层五 快速使用 前言 在进行Flash操作时 xff0c 一
  • 游标的概念和作用

    游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制 游标充当指针的作用 尽管游标能遍历结果中的所有行 xff0c 但他一次只指向一行 概括来讲 xff0c SQL的游标是一种临时的数据库对象 xff0c 即可以用来存放在数
  • 【STM32H750】从零编写MDK的FLM烧录算法

    文章目录 前言一 将代码中的图片资源下载到外部flash1 修改分散加载文件 二 MDK下载算法原理1 程序能够通过下载算法下载到芯片的原理2 算法程序中擦除操作执行流程3 制作FLM文件步骤 三 使用STM32CubeMX新建工程1 新建
  • 使用MDK开发树莓派pico RP2040之外部 flash下载算法

    文章目录 前言一 MDK下载算法原理1 程序能够通过下载算法下载到芯片的原理2 算法程序中操作执行流程3 创建MDK下载算法通用流程 二 树莓派pico下载算法制作步骤1 下载树莓派的MDK的程序模板2 修改输出算法文件的名字3 修改编程算
  • 单片机堆栈分配

    Code xff1a 表示程序所占用 FLASH 的大小 xff08 FLASH xff09 RO data xff1a 即 Read Only data xff0c 表示程序定义的常量 xff0c 如 const 类型 xff08 FLA
  • 【STM32F429】通过STM32CubeMX移植TouchGFX

    目录 STM32F429 移植TouchGFX到RT Thread系统 xff08 1 xff09 STM32F429 使用TouchGFX的MVP架构来实现GUI和硬件的双向交互 xff08 2 xff09 STM32F429 RT Th
  • TouchGFX使用MVP架构来实现GUI和硬件的双向交互

    目录 xff1a 实战 xff1a 1 STM32F767移植touchGFX 使用RT Thread系统实现DIY数字仪表 xff08 完成 xff09 2STM32F429移植touchGFX 使用RT Thread系统实现DIY数字仪
  • python 微信自动回复机器人

    python 微信自动回复机器人 导入wxauto https github com cluic wxauto span class token comment python3 span span class token comment c