2022-12-27 16:48:06 [显示全部楼层]
13186浏览
查看: 13186|回复: 2

[项目] 行空板:微信机器人(itchat实现)

[复制链接]
本帖最后由 云天 于 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、登陆
  1. import itchat, time
  2. from itchat.content import *
  3. # 会弹出一个二维码,扫码即可登录
  4. itchat.auto_login(hotReload=True)
  5. # 运行itchat客户端,debug=True会打印日志
  6. itchat.run(True)
复制代码
这两句代码的作用是引入itchat后自动登录,itchat.auto_login()可以自动生成一个二维码,将hotReload设置为True的作用是微信支持本机的热登录,意思是:用户第一次启动程序并扫描二维码登录后,之后再次运行本程序的时候程序将不需要用户重复扫描二维码。

第一步就出现一个技术难题,如在Windos电脑中运行,系统会使用默认的图片查看软件打开二维码,如下:
360截图20221227140358376.jpg
2、问题
在行空板中运行程序,并不能直接显示这个二维码。
3、解决办法
(1)在行空板上安装itchat库
安装itchat.jpg
(2)使用Jupyter打开终端,用VI命令,编辑itchat的utils.py文件。
TueDecember-202212278715..png

360截图20221226221931901.jpg
  1. vi /usr/local/lib/python3.7/dist-packages/itchat/utils.py
复制代码
TueDecember-202212272884..png
(3)查看打开二维码函数

  1. def print_qr(fileDir):
  2.     if config.OS == 'Darwin':
  3.         subprocess.call(['open', fileDir])
  4.     elif config.OS == 'Linux':
  5.         subprocess.call(['xdg-open', fileDir])
  6.     else:
  7.         os.startfile(fileDir)
复制代码

(4)使用行空板unihiker库显示二维码,并使用PIL库将二维码处理成240*240,方便在行空板屏幕上显示。
编辑utils.py,导入库。
  1. from unihiker import GUI
  2. from PIL import Image
  3. u_gui=GUI()
复制代码

修改“Linux”的二维码打开方式

  1. def print_qr(fileDir):
  2.     if config.OS == 'Darwin':
  3.         subprocess.call(['open', fileDir])
  4.     elif config.OS == 'Linux':
  5.         #subprocess.call(['xdg-open', fileDir])
  6.         img_path=Image.open(fileDir)
  7.         img_size=img_path.resize((240,240))
  8.         img=u_gui.draw_image(image=img_size,x=0,y=0)
  9.     else:
  10.         os.startfile(fileDir)
复制代码
(5)行空板显示登陆二维码 TueDecember-202212276813..png

【点灯】
LED彩灯连接行空板引脚22

  1. import itchat, time
  2. from itchat.content import *
  3. from pinpong.extension.unihiker import *
  4. from pinpong.board import Board,Pin
  5. from pinpong.board import NeoPixel
  6. from unihiker import GUI
  7. Board().begin()
  8. p_p22_out=Pin(Pin.P22, Pin.OUT)
  9. np1 = NeoPixel(p_p22_out,1)  

  10. # 注册消息处理函数,回复文本、地图、名片、备注、分享类型的消息
  11. @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
  12. def text_reply(msg):
  13.      global img,bs1
  14.     # 回复以下消息:消息类型,消息内容文本
  15.     #itchat.send('%s: %s' % (msg.type, msg.text))
  16.     # 根据不同的关键字,回复不同的消息
  17.      if '开灯' in msg['Text']:
  18.         itchat.send('已为你开灯')
  19.         np1[0] = (255,0,0)
  20.      elif '关灯' in  msg['Text']:
  21.         np1[0] = (0,0,0)
  22.         itchat.send('已为你关灯')


  23. # 会弹出一个二维码,扫码即可登录
  24. itchat.auto_login(hotReload=True)
  25. # 运行itchat客户端,debug=True会打印日志
  26. itchat.run(True)
复制代码

IMG_20221227_150415[1].jpg


【安防拍照】
微信发送“拍照”信息,行空板调用摄像头拍照,并将图片发回手机微信,已实现远程监控安防效果。


  1. import itchat, time,cv2
  2. from itchat.content import *
  3. from pinpong.extension.unihiker import *
  4. from pinpong.board import Board,Pin
  5. from pinpong.board import NeoPixel
  6. from unihiker import GUI
  7. Board().begin()
  8. p_p22_out=Pin(Pin.P22, Pin.OUT)
  9. np1 = NeoPixel(p_p22_out,1)  
  10. bs1=1
  11. bs2=1

  12. # 注册消息处理函数,回复文本、地图、名片、备注、分享类型的消息
  13. @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
  14. def text_reply(msg):
  15.      global img,bs1
  16.     # 回复以下消息:消息类型,消息内容文本
  17.     #itchat.send('%s: %s' % (msg.type, msg.text))
  18.     # 根据不同的关键字,回复不同的消息
  19.      if '开灯' in msg['Text']:
  20.         itchat.send('已为你开灯')
  21.         np1[0] = (255,0,0)
  22.      elif '关灯' in  msg['Text']:
  23.         np1[0] = (0,0,0)
  24.         itchat.send('已为你关灯')
  25.      elif '拍照' in  msg['Text']:
  26.          cap=cv2.VideoCapture(0)
  27.          ret,frame=cap.read()
  28.          if ret:
  29.              cv2.imwrite("out.png",frame)
  30.              itchat.send("@img@%s"%'out.png')
  31.          cap.release()

  32. # 会弹出一个二维码,扫码即可登录


  33. itchat.auto_login(hotReload=True)
  34. # 运行itchat客户端,debug=True会打印日志
  35. itchat.run(True)
复制代码
每次重新启动摄像头的原因是,CV2会缓存图像,每次取的图像都是之前缓存的,不是最新的实时图像。
IMG_20221227_161641[1].jpg

TueDecember-202212279286..png

TueDecember-202212278482..png


【显示图像】
行空板显示,由微信发过来的图像。

  1. import itchat, time,cv2
  2. from itchat.content import *
  3. from pinpong.extension.unihiker import *

  4. from unihiker import GUI
  5. from PIL import Image

  6. bs1=1
  7. bs2=1


  8. # 注册消息处理函数,当收到图片、语音、附件、视频类型的消息时,下载内容
  9. @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
  10. def download_files(msg):
  11.     global bs2,u_gui,img
  12.     # 下载文件
  13.     msg.download(msg.fileName)
  14.     typeSymbol = {
  15.         PICTURE: 'img',
  16.         VIDEO: 'vid', }.get(msg.type, 'fil')
  17.     if typeSymbol=='img':
  18.         if bs2==1:
  19.             bs2=2
  20.             u_gui=GUI()
  21.             img_path=Image.open(msg.fileName)
  22.             img_size=img_path.resize((240,240))
  23.             img=u_gui.draw_image(image=img_size,x=0,y=0)
  24.         else:
  25.             img.config(image=msg.fileName)
  26. # 会弹出一个二维码,扫码即可登录


  27. itchat.auto_login(hotReload=True)
  28. # 运行itchat客户端,debug=True会打印日志
  29. itchat.run(True)
复制代码
IMG_20221227_164008[1].jpg



王尧坤  高级技师

发表于 2023-1-3 21:33:03

厉害厉害,膜拜
回复

使用道具 举报

cary_skx  学徒

发表于 2023-1-10 23:05:34

学习了,谢谢大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2023 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail