云天 发表于 2022-12-27 16:48:06

行空板:微信机器人(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、登陆
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()
def text_reply(msg):
   global img,bs1
    # 回复以下消息:消息类型,消息内容文本
    #itchat.send('%s: %s' % (msg.type, msg.text))
    # 根据不同的关键字,回复不同的消息
   if '开灯' in msg['Text']:
      itchat.send('已为你开灯')
      np1 = (255,0,0)
   elif '关灯' inmsg['Text']:
      np1 = (0,0,0)
      itchat.send('已为你关灯')


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



https://www.bilibili.com/video/BV1PW4y1L7Km/?share_source=copy_web&vd_source=98855d5b99ff76982639c5ca6ff6f528
【安防拍照】
微信发送“拍照”信息,行空板调用摄像头拍照,并将图片发回手机微信,已实现远程监控安防效果。


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()
def text_reply(msg):
   global img,bs1
    # 回复以下消息:消息类型,消息内容文本
    #itchat.send('%s: %s' % (msg.type, msg.text))
    # 根据不同的关键字,回复不同的消息
   if '开灯' in msg['Text']:
      itchat.send('已为你开灯')
      np1 = (255,0,0)
   elif '关灯' inmsg['Text']:
      np1 = (0,0,0)
      itchat.send('已为你关灯')
   elif '拍照' inmsg['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()
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)




王尧坤 发表于 2023-1-3 21:33:03

厉害厉害,膜拜

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

学习了,谢谢大佬

伊娃老师 发表于 2023-2-6 10:34:42

itchat还能用吗?

云天 发表于 2023-2-7 09:25:39

伊娃老师 发表于 2023-2-6 10:34
itchat还能用吗?

我制作项目时,能使用,没有问题。

Forgotten 发表于 2023-2-15 11:44:49

本帖最后由 Forgotten 于 2023-2-15 11:45 编辑

在行空板上装完itchat后,如果直接运行代码,会报错:FileNotFoundError: No such file or directory: 'xdg-open': 'xdg-open'

按照帖子要用vi操作才可以解决报错,但是比较麻烦,所以我写了个python代码把这一步操作自动处理了。

下载附件,解压得到两个文件,一起放到“项目中的文件”里面,然后“连接行空板”,双击打开fix_xdgopen.py,运行一次就可以了



页: [1]
查看完整版本: 行空板:微信机器人(itchat实现)