当前位置:   article > 正文

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

wxauto

前言

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

代码逻辑

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

代码基础模板

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

  1. #导入所需的模块
  2. from wxauto import WeChat
  3. import time, keyboard
  4. #开启窗口函数
  5. def openwx():
  6. #使用默认热键打开微信
  7. keyboard.press_and_release('ctrl+alt+w')
  8. #获取会话列表
  9. wx.GetSessionList
  10. #打开 who 的窗口
  11. wx.ChatWith(who)
  12. #初始化
  13. #获取当前微信客户端
  14. wx = WeChat()
  15. #要打开的窗口名称(群名称)
  16. who = '你的群聊'
  17. #机器人的名字(可以不用)
  18. wxbotname = '[群助手]'
  19. #开始循环
  20. while True:
  21. #获取最新一条消息
  22. msg = wx.GetLastMessage
  23. #用if判定是否内置命令
  24. if msg == '/test':
  25. #检测到命令的行为
  26. wx.SendMsg(f'{wxbotname}Test ok~')
  27. #设置睡眠(可以不用)
  28. time.sleep(1)

本人现在使用的代码

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

  1. from wxauto import WeChat, WxUtils
  2. import random
  3. import time
  4. import keyboard
  5. import requests
  6. import os
  7. import urllib
  8. import json
  9. import signal
  10. import sys
  11. #输出台关闭机器人
  12. def signal_handler(sig, frame):
  13. print(f'\n[{nowtime}] 机器人关闭成功')
  14. while True:
  15. console = input()
  16. if console == 'exit':
  17. sys.exit()
  18. signal.signal(signal.SIGINT, signal_handler)
  19. # 热键开启微信
  20. def openwx():
  21. keyboard.press_and_release('ctrl+alt+w')
  22. wx.GetSessionList
  23. wx.ChatWith(who)
  24. # 获得香港天气
  25. def weather():
  26. Url = 'https://api.seniverse.com/v3/weather/now.json'
  27. AppKey = '4r9bergjetiv1tsd'
  28. Value = {'key': AppKey, 'location': 'xianggang',
  29. 'language': 'zh-Hans', 'unit': 'c'}
  30. r = requests.get(Url, params=Value)
  31. data = r.json()['results'][0]['location']['name'], r.json()[
  32. 'results'][0]['now']['temperature'], r.json()['results'][0]['now']['text']
  33. hk_weather = ' '.join(data[:-1]) + '℃ ' + data[-1]
  34. wx.SendMsg(f'{wxbotname}{hk_weather}')
  35. # 发送多行文本
  36. def sendmsgs(text):
  37. WxUtils.SetClipboard(text)
  38. wx.SendClipboard()
  39. # AI回答模块
  40. class ai:
  41. def bot1():
  42. print(f'[{nowtime}]{msg[0]}:{msg[1][4:]}')
  43. msg_to_ai = msg[1][4:]
  44. url = f'http://api.qingyunke.com/api.php?key=free&appid=0&msg={urllib.parse.quote(msg_to_ai)}'
  45. html = requests.get(url)
  46. text = html.json()["content"]
  47. text = text.replace('{br}', '\n')
  48. text = text.replace('\n提示:按分类看笑话请发送“笑话分类”','')
  49. print(f'[{nowtime}][菲菲]:{text}')
  50. msg_to_user = '[菲菲]' + text
  51. sendmsgs(msg_to_user)
  52. def bot2():
  53. print(f'[{nowtime}]{msg[0]}:{msg[1][4:]}')
  54. msg_to_ai = msg[1][4:]
  55. url = requests.get(
  56. f'https://api.ownthink.com/bot?appid=xiaosi&userid=user&spoken={urllib.parse.quote(msg_to_ai)}')
  57. answer = url.text
  58. answer = json.loads(answer)
  59. text = answer['data']['info']['text']
  60. text = text.replace('{br}','\n')
  61. text = text.replace('\n提示:按分类看笑话请发送“笑话分类”','')
  62. print(f'[{nowtime}][小思]:{text}')
  63. msg_to_user = '[小思]' + text
  64. sendmsgs(msg_to_user)
  65. def bot3():
  66. print(f'[{nowtime}]{msg[0]}:{msg[1][4:]}')
  67. msg_to_ai = msg[1][4:]
  68. url = f'https://v.api.aa1.cn/api/api-xiaoai/talk.php?msg={urllib.parse.quote(msg_to_ai)}'
  69. text = requests.get(url).text
  70. print(f'[{nowtime}][小爱]:{text}')
  71. msg_to_user = '[小爱]' + text
  72. sendmsgs(msg_to_user)
  73. # 小游戏模块
  74. class games:
  75. def list():
  76. sendmsgs(
  77. f'{wxbotname}\n==游戏列表==\n#1. 猜数字\n#2. 1A2B\n==========\n/game <游戏编号>\n示范: /game #1')
  78. def game1():
  79. global game1_ing
  80. if game1_ing == True:
  81. wx.SendMsg(f'{wxbotname}正在与 @{player} 游玩猜数字小游戏中,请等待结束')
  82. else:
  83. game1_score = 0
  84. game1_win = False
  85. player = msg[0]
  86. game1_ing = True
  87. game1_answer = random.randint(1, 100)
  88. sendmsgs(
  89. f'{wxbotname}\n猜数字小游戏\n由我随机想一个1到100内的整数\n你来猜我想的数字\n我会给你猜大了还是猜小了的提示\n你只有七次机会,用光了机会还没猜到就输了哦\n(输入格式: ".整数")')
  90. while True:
  91. player_msg = wx.GetLastMessage
  92. if player_msg[0] == player and player_msg[1][:1] == '.':
  93. if player_msg[1][1:] == 'exit':
  94. wx.SendMsg(f'{wxbotname}已退出猜数字小游戏')
  95. game1_ing = False
  96. break
  97. game1_score += 1
  98. if game1_score > 7:
  99. if game1_win == False:
  100. wx.SendMsg(f'{wxbotname} @{player} 你输了!,小辣鸡~')
  101. game1_ing = False
  102. break
  103. else:
  104. player_input = player_msg[1][1:]
  105. try:
  106. player_input = int(player_input)
  107. except ValueError:
  108. wx.SendMsg(f'{wxbotname} 错误 : 不是合法的整数')
  109. game1_score -= 1
  110. if player_input < 1 or player_input > 100:
  111. wx.SendMsg(f'{wxbotname} 是1到100之内的整数哟~')
  112. game1_score -= 1
  113. elif player_input < game1_answer:
  114. wx.SendMsg(f'{wxbotname} 回合{game1_score} : 猜小了')
  115. elif player_input > game1_answer:
  116. wx.SendMsg(f'{wxbotname} 回合{game1_score} : 猜大了')
  117. else:
  118. wx.SendMsg(f'{wxbotname} 你猜中了,你赢了!,哼~我下次肯定赢你')
  119. game1_ing = False
  120. break
  121. if player_msg[1] in ['/time', '/weather', '/test', '/stop']:
  122. wx.SendMsg(
  123. f'{wxbotname}正在与 @{player} 游玩猜数字小游戏中,请等待结束再输入指令')
  124. def game2():
  125. wx.SendMsg('游戏暂未公测,敬请期待!')
  126. # 初始化
  127. wx = WeChat()
  128. who = '群名称'
  129. openwx()
  130. game1_ing = False
  131. runtime = 0
  132. wxbotname = '[群助手]'
  133. # 开始运行
  134. print(f'[{time.strftime("%H:%M:%S", time.localtime(time.time()))}] 机器人开启成功\n')
  135. while True:
  136. runtime += 1
  137. os.system(f'title 微信机器人(Runtime:{runtime}seconds)')
  138. if runtime % 60 == 0:
  139. wx.ChatWith(who)
  140. nowtime = time.strftime('%H:%M:%S', time.localtime(time.time()))
  141. if nowtime == '07:00:00':
  142. print(f'[{nowtime}]早上好')
  143. wx.SendMsg(f'{wxbotname}早上好')
  144. if nowtime == '13:00:00':
  145. print(f'[{nowtime}]下午好')
  146. wx.SendMsg(f'{wxbotname}下午好')
  147. if nowtime == '22:00:00':
  148. print(f'[{nowtime}]晚上好')
  149. wx.SendMsg(f'{wxbotname}晚上好')
  150. try:
  151. msg = wx.GetLastMessage
  152. except:
  153. pass
  154. if msg[1] == '/test':
  155. print(f'[{nowtime}]检测到对应指令,将做出行动')
  156. wx.SendMsg(f'{wxbotname}test ok!')
  157. if msg[0] == '.' and msg[1] == '/stop':
  158. print(f'[{nowtime}]检测到对应指令,将做出行动')
  159. wx.SendMsg(f'{wxbotname}Now stopping...')
  160. print(f'[{nowtime}] 机器人关闭成功... ')
  161. input()
  162. exit()
  163. if msg[0] != '.' and msg[1] == '/stop':
  164. print(f'[{nowtime}]无权限的指令者')
  165. wx.SendMsg(f'{wxbotname}你没有权限使用"/stop"')
  166. if msg[1] == '/time':
  167. print(f'[{nowtime}]检测到对应指令,将做出行动')
  168. wx.SendMsg(f'{wxbotname}现在时间是{nowtime}')
  169. if msg[1] == '/weather':
  170. print(f'[{nowtime}]检测到对应指令,将做出行动')
  171. weather()
  172. # AI
  173. if msg[1][:4] == '/ai1':
  174. if msg[1][5:] == '':
  175. wx.SendMsg(f'{wxbotname}正确使用: /ai1 <消息>')
  176. else:
  177. print(f'[{nowtime}]检测到对应指令,将做出行动')
  178. ai.bot1()
  179. if msg[1][:4] == '/ai2':
  180. if msg[1][5:] == '':
  181. wx.SendMsg(f'{wxbotname}正确使用: /ai2 <消息>')
  182. else:
  183. print(f'[{nowtime}]检测到对应指令,将做出行动')
  184. ai.bot2()
  185. if msg[1][:4] == '/ai3':
  186. if msg[1][5:] == '':
  187. wx.SendMsg(f'{wxbotname}正确使用: /ai3 <消息>')
  188. else:
  189. print(f'[{nowtime}]检测到对应指令,将做出行动')
  190. ai.bot3()
  191. # 游戏
  192. if msg[1] == '/game':
  193. print(f'[{nowtime}]检测到对应指令,将做出行动')
  194. games.list()
  195. if msg[1] == '/game #1':
  196. print(f'[{nowtime}]检测到对应指令,将做出行动')
  197. games.game1()
  198. if msg[1] == '/game #2':
  199. print(f'[{nowtime}]检测到对应指令,将做出行动')
  200. games.game2()
  201. time.sleep(1)

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/907149
推荐阅读
相关标签
  

闽ICP备14008679号