赞
踩
我是一个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版本)
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。