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

前言

        我是一个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版本)

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值