本帖最后由 云天 于 2022-12-27 16:54 编辑  
 
【行空板】 
行空板, 青少年Python教学用开源硬件,解决Python教学难和使用门槛高的问题,旨在推动Python教学在青少年中的普及。行空板采用4核单板微型计算机架构,集成LCD彩屏、Wi-Fi蓝牙、多种常用传感器和拓展接口,自带Linux操作系统和Python编程环境及内置常用Python库,运行完整Python。行空板连接电脑,无需配置,即可开始Python教学。 
【微信】 
微信(WeChat)是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序 。微信支持跨通信运营商、跨操作系统平台通过网络快速发送免费(需消耗少量网络流量)语音短信、视频、图片和文字。 
【项目介绍】 
你有没有想过,拥有一个微信机器人,可以自动回复、AI聊天、定时发送天气预报、控制摄像头、彩灯、风扇等等。使用行空板+开源库itchat,就能实现上述所有需求。 
为什么强调要用行空板呢?因为它能小巧且可7×24在线,可以把itchat客户端当作一个不停服的server。 
【itchat简介】 
itchat是一个开源的微信个人号接口,使用不到三十行的代码,就可以完成一个能够处理所有信息的微信机器人。itchat本质上是一个微信网页版客户端,它实现了微信网页版的协议/语义,通过http来通信。 
【功能实现】 
1、登陆 
			
			
			- import itchat, time
 - from itchat.content import *
 - # 会弹出一个二维码,扫码即可登录
 - itchat.auto_login(hotReload=True)
 - # 运行itchat客户端,debug=True会打印日志
 - itchat.run(True)
 
  复制代码 这两句代码的作用是引入itchat后自动登录,itchat.auto_login()可以自动生成一个二维码,将hotReload设置为True的作用是微信支持本机的热登录,意思是:用户第一次启动程序并扫描二维码登录后,之后再次运行本程序的时候程序将不需要用户重复扫描二维码。 
 
第一步就出现一个技术难题,如在Windos电脑中运行,系统会使用默认的图片查看软件打开二维码,如下: 
  
2、问题 
在行空板中运行程序,并不能直接显示这个二维码。 
3、解决办法 
(1)在行空板上安装itchat库 
  
(2)使用Jupyter打开终端,用VI命令,编辑itchat的utils.py文件。 
  
 
  
- vi /usr/local/lib/python3.7/dist-packages/itchat/utils.py
 
  复制代码
   
(3)查看打开二维码函数 
- 
 - def print_qr(fileDir):
 -     if config.OS == 'Darwin':
 -         subprocess.call(['open', fileDir])
 -     elif config.OS == 'Linux':
 -         subprocess.call(['xdg-open', fileDir])
 -     else:
 -         os.startfile(fileDir)
 
  复制代码
  
(4)使用行空板unihiker库显示二维码,并使用PIL库将二维码处理成240*240,方便在行空板屏幕上显示。 
编辑utils.py,导入库。 
- from unihiker import GUI
 - from PIL import Image
 - u_gui=GUI()
 
  复制代码
  
修改“Linux”的二维码打开方式 
- 
 - def print_qr(fileDir):
 -     if config.OS == 'Darwin':
 -         subprocess.call(['open', fileDir])
 -     elif config.OS == 'Linux':
 -         #subprocess.call(['xdg-open', fileDir])
 -         img_path=Image.open(fileDir)
 -         img_size=img_path.resize((240,240))
 -         img=u_gui.draw_image(image=img_size,x=0,y=0)
 -     else:
 -         os.startfile(fileDir)
 
  复制代码 (5)行空板显示登陆二维码  
 
【点灯】 
LED彩灯连接行空板引脚22 
- 
 - import itchat, time
 - from itchat.content import *
 - from pinpong.extension.unihiker import *
 - from pinpong.board import Board,Pin
 - from pinpong.board import NeoPixel
 - from unihiker import GUI
 - Board().begin()
 - p_p22_out=Pin(Pin.P22, Pin.OUT)
 - np1 = NeoPixel(p_p22_out,1)  
 - 
 - # 注册消息处理函数,回复文本、地图、名片、备注、分享类型的消息
 - @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
 - def text_reply(msg):
 -      global img,bs1
 -     # 回复以下消息:消息类型,消息内容文本
 -     #itchat.send('%s: %s' % (msg.type, msg.text))
 -     # 根据不同的关键字,回复不同的消息
 -      if '开灯' in msg['Text']:
 -         itchat.send('已为你开灯')
 -         np1[0] = (255,0,0) 
 -      elif '关灯' in  msg['Text']:
 -         np1[0] = (0,0,0)
 -         itchat.send('已为你关灯')
 -  
 - 
 - # 会弹出一个二维码,扫码即可登录
 - itchat.auto_login(hotReload=True)
 - # 运行itchat客户端,debug=True会打印日志
 - itchat.run(True)
 
  复制代码
  
  
 
 
【安防拍照】 
微信发送“拍照”信息,行空板调用摄像头拍照,并将图片发回手机微信,已实现远程监控安防效果。 
- 
 - 
 - import itchat, time,cv2
 - from itchat.content import *
 - from pinpong.extension.unihiker import *
 - from pinpong.board import Board,Pin
 - from pinpong.board import NeoPixel
 - from unihiker import GUI
 - Board().begin()
 - p_p22_out=Pin(Pin.P22, Pin.OUT)
 - np1 = NeoPixel(p_p22_out,1)  
 - bs1=1
 - bs2=1
 - 
 - # 注册消息处理函数,回复文本、地图、名片、备注、分享类型的消息
 - @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
 - def text_reply(msg):
 -      global img,bs1
 -     # 回复以下消息:消息类型,消息内容文本
 -     #itchat.send('%s: %s' % (msg.type, msg.text))
 -     # 根据不同的关键字,回复不同的消息
 -      if '开灯' in msg['Text']:
 -         itchat.send('已为你开灯')
 -         np1[0] = (255,0,0) 
 -      elif '关灯' in  msg['Text']:
 -         np1[0] = (0,0,0)
 -         itchat.send('已为你关灯')
 -      elif '拍照' in  msg['Text']:
 -          cap=cv2.VideoCapture(0)
 -          ret,frame=cap.read()
 -          if ret:
 -              cv2.imwrite("out.png",frame)
 -              itchat.send("@img@%s"%'out.png')
 -          cap.release()
 - 
 - # 会弹出一个二维码,扫码即可登录
 - 
 - 
 - itchat.auto_login(hotReload=True)
 - # 运行itchat客户端,debug=True会打印日志
 - itchat.run(True)
 
  复制代码 每次重新启动摄像头的原因是,CV2会缓存图像,每次取的图像都是之前缓存的,不是最新的实时图像。 
  
 
  
 
  
 
 
【显示图像】 
行空板显示,由微信发过来的图像。 
- 
 - import itchat, time,cv2
 - from itchat.content import *
 - from pinpong.extension.unihiker import *
 - 
 - from unihiker import GUI
 - from PIL import Image
 -  
 - bs1=1
 - bs2=1
 - 
 - 
 - # 注册消息处理函数,当收到图片、语音、附件、视频类型的消息时,下载内容
 - @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
 - def download_files(msg):
 -     global bs2,u_gui,img
 -     # 下载文件
 -     msg.download(msg.fileName)
 -     typeSymbol = {
 -         PICTURE: 'img',
 -         VIDEO: 'vid', }.get(msg.type, 'fil')
 -     if typeSymbol=='img':
 -         if bs2==1:
 -             bs2=2
 -             u_gui=GUI()
 -             img_path=Image.open(msg.fileName)
 -             img_size=img_path.resize((240,240))
 -             img=u_gui.draw_image(image=img_size,x=0,y=0)
 -         else:
 -             img.config(image=msg.fileName)
 - # 会弹出一个二维码,扫码即可登录
 - 
 - 
 - itchat.auto_login(hotReload=True)
 - # 运行itchat客户端,debug=True会打印日志
 - itchat.run(True)
 
  复制代码
   
 
 
 
 |