【Python】基于wxauto的超简单微信机器人

2023-11-05

前言

        我是一个python初学者,一直想做一个微信版类似qq的群助手,我尝试去百度过 "python微信机器人" 之类的搜索,但得到的结果几乎都是使用 "itchat","wxpy" 之类的库通过网页版微信去实现行为的,但腾讯在2019年7月份开始,彻底关闭了网页版微信登录入口,导致这类库几乎大部分的账号都无法使用了,而前几天我发现了 "wxauto" 这个库, 官方介绍为 “Windows版本微信客户端自动化,可实现简单的发送、接收微信消息,开发中”, 成功引起我的好奇心就点进去了学习学习

代码逻辑

        通过监听指定窗口最新消息 → 判定是否内置指令 → 若是则执行动作

代码基础模板

        这模板只是示范代码,想实现更多功能可以自行改造与添加

#导入所需的模块
from wxauto import WeChat
import time, keyboard

#开启窗口函数
def openwx():
    #使用默认热键打开微信
    keyboard.press_and_release('ctrl+alt+w')
    #获取会话列表
    wx.GetSessionList
    #打开 who 的窗口
    wx.ChatWith(who)

#初始化
#获取当前微信客户端
wx = WeChat()
#要打开的窗口名称(群名称)
who = '你的群聊'
#机器人的名字(可以不用)
wxbotname = '[群助手]' 
#开始循环
while True:
    #获取最新一条消息
    msg = wx.GetLastMessage
    #用if判定是否内置命令
    if msg == '/test':
        #检测到命令的行为
        wx.SendMsg(f'{wxbotname}Test ok~')
    #设置睡眠(可以不用)
    time.sleep(1)

本人现在使用的代码

        我自己添加了一些功能和一个游戏

from wxauto import WeChat, WxUtils
import random
import time
import keyboard
import requests
import os
import urllib
import json
import signal
import sys

#输出台关闭机器人

def signal_handler(sig, frame):
    print(f'\n[{nowtime}] 机器人关闭成功')
    while True:
        console = input()
        if console == 'exit':
            sys.exit()

signal.signal(signal.SIGINT, signal_handler)

# 热键开启微信

def openwx():
    keyboard.press_and_release('ctrl+alt+w')
    wx.GetSessionList
    wx.ChatWith(who)

# 获得香港天气


def weather():
    Url = 'https://api.seniverse.com/v3/weather/now.json'
    AppKey = '4r9bergjetiv1tsd'
    Value = {'key': AppKey, 'location': 'xianggang',
             'language': 'zh-Hans', 'unit': 'c'}
    r = requests.get(Url, params=Value)
    data = r.json()['results'][0]['location']['name'], r.json()[
        'results'][0]['now']['temperature'], r.json()['results'][0]['now']['text']
    hk_weather = ' '.join(data[:-1]) + '℃ ' + data[-1]
    wx.SendMsg(f'{wxbotname}{hk_weather}')


# 发送多行文本

def sendmsgs(text):
    WxUtils.SetClipboard(text)
    wx.SendClipboard()

# AI回答模块

class ai:
    def bot1():
        print(f'[{nowtime}]{msg[0]}:{msg[1][4:]}')
        msg_to_ai = msg[1][4:]
        url = f'http://api.qingyunke.com/api.php?key=free&appid=0&msg={urllib.parse.quote(msg_to_ai)}'
        html = requests.get(url)
        text = html.json()["content"]
        text = text.replace('{br}', '\n')
        text = text.replace('\n提示:按分类看笑话请发送“笑话分类”','')
        print(f'[{nowtime}][菲菲]:{text}')
        msg_to_user = '[菲菲]' + text
        sendmsgs(msg_to_user)


    def bot2():
        print(f'[{nowtime}]{msg[0]}:{msg[1][4:]}')
        msg_to_ai = msg[1][4:]
        url = requests.get(
            f'https://api.ownthink.com/bot?appid=xiaosi&userid=user&spoken={urllib.parse.quote(msg_to_ai)}')
        answer = url.text
        answer = json.loads(answer)
        text = answer['data']['info']['text']
        text = text.replace('{br}','\n')
        text = text.replace('\n提示:按分类看笑话请发送“笑话分类”','')
        print(f'[{nowtime}][小思]:{text}')
        msg_to_user = '[小思]' + text
        sendmsgs(msg_to_user)
        
    def bot3():
        print(f'[{nowtime}]{msg[0]}:{msg[1][4:]}')
        msg_to_ai = msg[1][4:]
        url = f'https://v.api.aa1.cn/api/api-xiaoai/talk.php?msg={urllib.parse.quote(msg_to_ai)}'
        text = requests.get(url).text
        print(f'[{nowtime}][小爱]:{text}')
        msg_to_user = '[小爱]' + text
        sendmsgs(msg_to_user)

# 小游戏模块

class games:
    def list():
        sendmsgs(
            f'{wxbotname}\n==游戏列表==\n#1. 猜数字\n#2. 1A2B\n==========\n/game <游戏编号>\n示范: /game #1')

    def game1():
        global game1_ing
        if game1_ing == True:
            wx.SendMsg(f'{wxbotname}正在与 @{player} 游玩猜数字小游戏中,请等待结束')
        else:
            game1_score = 0
            game1_win = False
            player = msg[0]
            game1_ing = True
            game1_answer = random.randint(1, 100)
            sendmsgs(
                f'{wxbotname}\n猜数字小游戏\n由我随机想一个1到100内的整数\n你来猜我想的数字\n我会给你猜大了还是猜小了的提示\n你只有七次机会,用光了机会还没猜到就输了哦\n(输入格式: ".整数")')
            while True:
                player_msg = wx.GetLastMessage
                if player_msg[0] == player and player_msg[1][:1] == '.':
                    if player_msg[1][1:] == 'exit':
                        wx.SendMsg(f'{wxbotname}已退出猜数字小游戏')
                        game1_ing = False
                        break
                    game1_score += 1
                    if game1_score > 7:
                        if game1_win == False:
                            wx.SendMsg(f'{wxbotname} @{player} 你输了!,小辣鸡~')
                            game1_ing = False
                            break
                    else:
                        player_input = player_msg[1][1:]
                        try:
                            player_input = int(player_input)
                        except ValueError:
                            wx.SendMsg(f'{wxbotname} 错误 : 不是合法的整数')
                            game1_score -= 1
                        if player_input < 1 or player_input > 100:
                            wx.SendMsg(f'{wxbotname} 是1到100之内的整数哟~')
                            game1_score -= 1
                        elif player_input < game1_answer:
                            wx.SendMsg(f'{wxbotname} 回合{game1_score} : 猜小了')
                        elif player_input > game1_answer:
                            wx.SendMsg(f'{wxbotname} 回合{game1_score} : 猜大了')
                        else:
                            wx.SendMsg(f'{wxbotname} 你猜中了,你赢了!,哼~我下次肯定赢你')
                            game1_ing = False
                            break
                if player_msg[1] in ['/time', '/weather', '/test', '/stop']:
                    wx.SendMsg(
                        f'{wxbotname}正在与 @{player} 游玩猜数字小游戏中,请等待结束再输入指令')

    def game2():
        wx.SendMsg('游戏暂未公测,敬请期待!')


# 初始化
wx = WeChat()
who = '群名称'
openwx()
game1_ing = False
runtime = 0
wxbotname = '[群助手]'

# 开始运行
print(f'[{time.strftime("%H:%M:%S", time.localtime(time.time()))}] 机器人开启成功\n')
while True:
    runtime += 1
    os.system(f'title 微信机器人(Runtime:{runtime}seconds)')
    if runtime % 60 == 0:
        wx.ChatWith(who)

    nowtime = time.strftime('%H:%M:%S', time.localtime(time.time()))

    if nowtime == '07:00:00':
        print(f'[{nowtime}]早上好')
        wx.SendMsg(f'{wxbotname}早上好')

    if nowtime == '13:00:00':
        print(f'[{nowtime}]下午好')
        wx.SendMsg(f'{wxbotname}下午好')

    if nowtime == '22:00:00':
        print(f'[{nowtime}]晚上好')
        wx.SendMsg(f'{wxbotname}晚上好')

    try:
        msg = wx.GetLastMessage
    except:
        pass

    if msg[1] == '/test':
        print(f'[{nowtime}]检测到对应指令,将做出行动')
        wx.SendMsg(f'{wxbotname}test ok!')

    if msg[0] == '.' and msg[1] == '/stop':
        print(f'[{nowtime}]检测到对应指令,将做出行动')
        wx.SendMsg(f'{wxbotname}Now stopping...')
        print(f'[{nowtime}] 机器人关闭成功... ')
        input()
        exit()

    if msg[0] != '.' and msg[1] == '/stop':
        print(f'[{nowtime}]无权限的指令者')
        wx.SendMsg(f'{wxbotname}你没有权限使用"/stop"')

    if msg[1] == '/time':
        print(f'[{nowtime}]检测到对应指令,将做出行动')
        wx.SendMsg(f'{wxbotname}现在时间是{nowtime}')

    if msg[1] == '/weather':
        print(f'[{nowtime}]检测到对应指令,将做出行动')
        weather()
    # AI

    if msg[1][:4] == '/ai1':
        if msg[1][5:] == '':
            wx.SendMsg(f'{wxbotname}正确使用: /ai1 <消息>')
        else:
            print(f'[{nowtime}]检测到对应指令,将做出行动')
            ai.bot1()

    if msg[1][:4] == '/ai2':
        if msg[1][5:] == '':
            wx.SendMsg(f'{wxbotname}正确使用: /ai2 <消息>')
        else:
            print(f'[{nowtime}]检测到对应指令,将做出行动')
            ai.bot2()
            
    if msg[1][:4] == '/ai3':
        if msg[1][5:] == '':
            wx.SendMsg(f'{wxbotname}正确使用: /ai3 <消息>')
        else:
            print(f'[{nowtime}]检测到对应指令,将做出行动')
            ai.bot3()
    # 游戏

    if msg[1] == '/game':
        print(f'[{nowtime}]检测到对应指令,将做出行动')
        games.list()

    if msg[1] == '/game #1':
        print(f'[{nowtime}]检测到对应指令,将做出行动')
        games.game1()

    if msg[1] == '/game #2':
        print(f'[{nowtime}]检测到对应指令,将做出行动')
        games.game2()

    time.sleep(1)

总结

        如果你是一位略微精通python的人,就可以明显看出来我在这些代码中使用的其实都是一些十分基础的语法,总结来说wxauto是一个十分简单易明的模块,就连我这种初学者用起来都十分简单,所以你还在等什么,快去官网下载吧!(ps:使用pip会下载到3.3.5.3版本)

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

【Python】基于wxauto的超简单微信机器人 的相关文章

随机推荐

  • JS的100道经典面试题(一)只看这四篇就够了,收藏起来以后偷偷看

    年轻人你不讲武德 耗子尾汁 总结就是为了形成自己的js知识网 提升自己 加油 开始干 1 介绍js的基本数据类型 答 Undefined Null Boolean Number String 2 js有哪些内置对象 答 数据封装类对象 Ob
  • 深度学习优化学习方法(一阶、二阶)

    深度学习优化学习方法总结 一阶为主 https blog csdn net sunflower sara article details 81321886 常用的优化算法 梯度下降法 牛顿法 拟牛顿法 共轭梯度法 二阶为主 https bl
  • Block底层原理读书笔记-《高级编程- iOS与OS多线程和内存管理》(更新中)

    1 一个Block 真正的底层都有些什么 Block会被解析成一个结构体 这里成为Block结构体 这个结构体里有 1 isa指针 说明Block的本质是一个对象 指向Stack 堆 2 有函数指针 这个函数指针指向一个函数体 该函数体的内
  • C# 企业微信接口发送消息出现错误代码60020解决方案,希望能给大家带来帮助。

    这是企业微信接口发送消息调用的代码源地址 https blog csdn net wanglui1990 article details 79744407 代码运行起来是没有问题的 但唯一出现的问题就是错误代码60020 点击企业微信 应用
  • 数据结构——单链表OJ题(第二弹)

    单链表OJ题 前言 一 返回链表开始入环的第一个节点 思路一 思路二 二 返回链表的深度拷贝 总结 前言 此次练习题有两道 有点小难度 但相信难不住大家的 我也会给出两道OJ题的链接 大家也赶快去试一试吧 一 返回链表开始入环的第一个节点
  • vue2.x与vue3.x中自定义指令详解

    目录 前言 一 自定义指令分类 二 Vue2 x自定义指令钩子函数 1 bind与update区别 2 update与componentUpdated区别 3 钩子函数的参数 4 局部自定义指令 5 全局自定义指令 6 简写形式 三 Vue
  • springboot下配置mybatis的call-setters-on-nulls属性

    使用Mybatis时 如果查询语句中某些字段值是null的 则这个字段就无法返回 对于后台数据处理来说 这是一个致命的问题 于是通过修改Mybatis的配置来解决这个问题 在springmvc下 在mybatis的配置文件里面增加以下配置即
  • C++ opencv处理kinect红外数据和彩色数据

    kinect好像已是明日黄花 但现在需要用这个做交互的人还不少 要做手势识别 于是入手一枚二手kinect2 0 入坑玩玩 做手势识别 直觉上要用opencv 从网上搜的资料来看 大多是通过openNi来操作kinect 而且要openNi
  • grpc-go源码剖析三十五之滑动窗口基本介绍以及整体流程图介绍?

    已发表的技术专栏 0 grpc go protobuf multus cni 技术专栏 总入口 1 grpc go 源码剖析与实战 文章目录 2 Protobuf介绍与实战 图文专栏 文章目录 3 multus cni 文章目录 k8s多网
  • 使用aircrack-ng套件破解wifi密码

    一 准备工作 1 需要有一个无线网卡 需要支持monitor模式 2 Kali系统 自行单独安装套件也可以 3 一个完善的密码字典 二 监听工作 首先将无线网卡连接到kali iwconfig 查看是否连接成功 airmon ng 可以查看
  • Vim 小技巧:自动写入文件头

    Vim 小技巧 情景一 自动写入文件头 在编写 C 程序时 总有一些东西会在每个头文件中出现 比如 ifndef lt File Name MACRO gt define lt File Name MACRO gt endif lt Fil
  • STM32H7 LwIP 主RAM选择 DTCM AXIRAM UDP 收发问题

    STM32H7 LwIP 主RAM选择 DTCM AXIRAM UDP 这段时间一直在调试STM32H743 期间掉进了不少坑 最大的坑还是网络这一块 例如LwIP移植 已经有前人踩过的坑 我以为我能避免 结果自己还是踩了 耽误了不少时间
  • Android --- 控件属性的属性值为 @null

    1 控件属性值为 null 1 RadioButton里面的属性android button null 是去掉前面的圆点 2 android background null 是控件自带的背景设为空
  • 《深入浅出数据分析》第九章——R语言

    文章目录 记录第一次接触R语言 一 R语言下载安装 二 运行 三 补充 1 加载csv文件 2 hist函数 记录第一次接触R语言 深入浅出数据分析 第九章讲到R语言 在这记录一下 就当给自己做的笔记 一 R语言下载安装 安装地址 http
  • mybatis是如何集成到spring的之托管mapper接口

    前言 mybatis集成到spring可以参考spring mvc集成mybatis进行数据库访问 其中mybatis集成到spring最重要的两个配置分别是SqlSessionFactoryBean和MapperScannerConfig
  • C++学习(七十四)有关三维压缩库draco

    一 是什么 Draco是谷歌Chrome 媒体团队在2017年1月发布的一个3D图形开源压缩库 提供了多种算法进行压缩和解压缩 旨在大幅加速 3D 数据的编码 传输和解码 因为研发团队的 Chrome 背景 这个开源算法的首要应用对象是浏览
  • 【编译原理】Java手写一个词法分析器

    在编程的世界中 每一个code都是一个符号 我们程序员用这些符号来表达出模型 1 1 2 上面的代码中1就是一个符号 它对应的模型是数量 比如一根手指 一根棒棒糖 当我们看到这个像小旗子的符号之后 我们就知道它对应着一根手指 此时你就相当于
  • Vue3 中引入wangeditor富文本编辑器

    文章目录 前言 一 引入 二 呈现到页面 1 原型 2 可视化界面 3 获取内容 4 配置工具栏 总结 前言 我花一些时间做了一个博客 需要一个引入编辑器 让我好在网页上就能编辑文章 这里中没有配置图片的上传功能 如有需要请自行配置 一 引
  • 远程网络读取服务器文件是否存在,linux 读取远程服务器文件是否存在

    linux 读取远程服务器文件是否存在 内容精选 换一换 云服务器网络异常 防火墙未放行本地远程桌面端口 云服务器CPU负载过高等问题均可能导致云服务器无法正常登录 本节操作介绍无法登录Windows弹性云服务器的排查思路 当您的云服务器无
  • 【Python】基于wxauto的超简单微信机器人

    前言 我是一个python初学者 一直想做一个微信版类似qq的群助手 我尝试去百度过 python微信机器人 之类的搜索 但得到的结果几乎都是使用 itchat wxpy 之类的库通过网页版微信去实现行为的 但腾讯在2019年7月份开始 彻