本帖最后由 云天 于 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)
复制代码

|